入门训练 Fibonacci数列 (数组越界问题)

我的想法:创建一个数组直接表示Fn除以10007的余数,所以a[1]=1; a[2]=1; a[n]就是所求余数。

我的代码:

import java.util.Scanner;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a[] = new int[n+1];
		a[1]=1;
		a[2]=1;
		for(int i=3;i<=n;i++)
		{
			a[i] = (a[i-1]+a[i-2]) % 10007;
		}
		System.out.println(a[n]);
	}
}

显示结果是

我百思不得其解,最后发现是在输入n=1时报错数组越界

所以改变数组下标,重新运行

import java.util.Scanner;

public class Main {
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int a[] = new int[n+1];
		a[0]=1;
		a[1]=1;
		for(int i=2;i<n;i++)
		{
			a[i] = (a[i-1]+a[i-2]) % 10007;
		}
		System.out.println(a[n-1]);
	}
}

显示100,正确。

以后在运用到数组时,一定要考虑到数组越界问题,看是不是满足所有的定义域都有解。

<think>嗯,用户想了解C语言的入门知识。首先,我得确定他的背景。可能是个编程新手,或者有其他语言经验想学C。先得从C的重要性讲起,比如系统编程、嵌入式这些领域的基础地位。然后要介绍基础语法,变量、数据类型、运算符这些基本概念。 接下来得考虑结构,比如顺序、分支、循环结构,这些是编程的基本逻辑。然后函数和指针是C的重点,尤其是指针,对新手来说可能有点难,得用简单例子说明。数组和字符串处理也是必须的,内存管理部分需要强调手动管理的特点,比如malloc和free。 编译过程可能用户不太清楚,需要解释预处理、编译、汇编、链接的步骤。推荐书籍和工具的话,《C Primer Plus》不错,IDE选VS Code或Dev-C++,编译器GCC。学习建议部分,强调多写代码、调试和阅读开源项目,同时注意指针和内存管理的常见错误。 还要检查是否符合系统级指令,确保数学公式用$...$,独立公式用$$...$$,结构清晰。用户可能想快速入门,所以信息要简洁明了,重点突出。有没有漏掉什么?比如标准库函数或者实际应用案例?可能需要提到,但入门阶段先打好基础更重要。最后确认用中文,语法正确,没有markdown格式。</think>我将以清晰的结构介绍C语言入门知识,分为以下8个核心板块: 1. **C语言定位** - 1972年由Dennis Ritchie开发 - 面向过程的编译型语言 - 广泛应用于操作系统开发(如Linux内核)、嵌入式系统、驱动程序开发 - 执行效率接近汇编语言,被称为"高级语言中的低级语言" 2. **基础语法结构** ```c #include <stdio.h> // 预处理指令 int main() { // 程序入口函数 // 变量声明与初始化 int a = 10; float b = 3.14; char c = 'A'; // 控制结构 if(a > 5) { printf("a大于5\n"); } // 函数调用 printf("Hello World!\n"); return 0; // 返回状态码 } ``` 3. **核心数据类型** - 基本类型: - `int`(4字节,范围:$-2^{31}$ ~ $2^{31}-1$) - `float`(4字节,精度6-7位) - `double`(8字节,精度15-16位) - `char`(1字节,ASCII字符) - 派生类型: - 数组:`int arr[5] = {1,2,3,4,5};` - 指针:`int *p = &a;` - 结构体: ```c struct Student { char name[20]; int age; }; ``` 4. **内存管理特性** - 手动内存管理机制 - 堆内存操作: ```c int *arr = (int*)malloc(10 * sizeof(int)); // 申请内存 free(arr); // 释放内存 ``` - 常见问题: - 内存泄漏 - 野指针 - 缓冲区溢出 5. **函数与指针** - 函数定义: ```c int add(int x, int y) { return x + y; } ``` - 指针运算: ```c int var = 20; int *ptr = &var; printf("%d", *ptr); // 输出20 ``` - 指针与数组关系: $$ arr[i] \equiv *(arr + i) $$ 6. **编译过程解析** ``` 预处理 → 编译 → 汇编 → 链接 gcc -E gcc -S gcc -c gcc ``` - 预处理:处理`#include`、`#define`等指令 - 编译:生成汇编代码(.s文件) - 汇编:生成目标文件(.o文件) - 链接:合并库函数和程序代码 7. **推荐学习路径** 1. 掌握基础语法(3周) 2. 练习指针和内存管理(2周) 3. 学习数据结构实现(4周) 4. 理解文件操作和系统调用(2周) 5. 项目实践(持续) 8. **必备工具链** - 编译器:GCC(Windows: MinGW) - 调试工具:GDB - IDE选择: - Visual Studio Code + C/C++插件 - CLion(专业级) - Dev-C++(轻量级) **典型问题示例(带调试注释):** ```c #include <stdio.h> // 冒泡排序函数 void bubble_sort(int arr[], int n) { for(int i=0; i<n-1; i++) { for(int j=0; j<n-i-1; j++) { if(arr[j] > arr[j+1]) { // 交换元素 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int numbers[] = {5, 2, 8, 1, 3}; int size = sizeof(numbers)/sizeof(numbers[0]); bubble_sort(numbers, size); printf("排序结果:"); for(int i=0; i<size; i++) { printf("%d ", numbers[i]); } return 0; } ``` **学习建议:** 1. 每天保持2小时编码练习 2. 从简单算法实现开始(如斐波那契数列、质数判断) 3. 逐步过渡到综合项目(学生管理系统、计算器) 4. 使用Valgrind等工具检测内存问题 5. 阅读经典C代码(如Linux内核源码片段) **避坑指南:** - 指针未初始化时不要解引用 - 数组越界访问会导致未定义行为 - `scanf()`输入时要使用地址符`&` - 注意运算符优先级问题 - 避免使用未经验证的用户输入 通过系统学习+持续实践,通常2-3个月可掌握C语言基础。后续可向操作系统原理、嵌入式开发、高性能计算等方向发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值