一、数组
1、一维数组
#include <stdio.h> int main() { //int arr[5]; //数组声明语句,数组里包含5个整数类型的存储区 //int arr[5] = {1, 2, 3, 4, 5}; //数组初始化的方法 //int arr[5] = {1, 2, 3, 4, 5, 6, 7}; //没有对应存储区的初始化数据自动被忽略 //int arr[5] = {1, 2, 3}; //没有对应初始化数据的存储区会自动被初始化成0 int arr[] = {1, 2, 3, 4, 5}; //如果初始化数组时省略了数组里包含的存储区个数则存储区个数就是初始化数据的个数 int num = 0; //arr[2/*有效下标*/] /*代表数组里下标为2的存储区*/ = 10; /*for (num = 0;num <= 4;num++) { arr[num] = num; }*/ for (num = 4;num >= 0;num--) { printf("%d ", arr[num]); } printf("\n"); int arr[5] = {0}; //数组名称代表数组里第一个存储区的地址 printf("arr是%p\n", arr); printf("&arr[0]是%p\n", &arr[0]); printf("sizeof(arr)是%d\n", sizeof(arr)); //对数组名称进行sizeof计算的结果是数组里所有存储区的总大小 return 0; }
2、一维数组练习
#include <stdio.h> int main() { int arr[5] = {0}; int val = 0, num = 0; printf("请输入一个数字:"); scanf("%d", &val); for (num = 4;num >= 0;num--) { //从后向前往每个存储区里 //存放拆出来的一个数位内容 arr[num] = val % 10; //得到最右边数位内容并记录到循环变量做下标的存储区里 val /= 10; //丢掉最右边数位 if (!val) { //处理不需要继续循环的情况 break; } } //把数组里记录的每个数位内容显示在 //屏幕上 //num代表最左边的数位内容所在的存储区下标 for (num = num;num <= 4;num++) { printf("%d ", arr[num]); } printf("\n"); return 0; }
3、二维数组声明
#include <stdio.h> int main() { int arr[3/*分组个数*/][2/*分组里的存储区个数*/]; //二维数组声明 int row = 0, col = 0, cnt = 1; arr[1/*有效的组下标*/][0/*有效的组内下标*/] = 10; for (row = 0;row <= 2;row++) { //循环变量代表所有组下标 for (col = 0;col <= 1;col++) { //循环变量代表所有组内下标 arr[row][col] = cnt; cnt++; } } return 0; }
4、二维数组初始化
#include <stdio.h> int main() { //int arr[3][2] = {1, 2, 3, 4, 5, 6}; //把二维数组当做一维数组进行初始化 //int arr[3][2] = {{1, 2}, {3}, {5, 6}}; //把初始化数据进行分组,每组初始化数据用来初始化一组存储区 //int arr[][2] = {1, 2, 3, 4, 5}; //5个初始化数据至少需要3组存储区,如果省略数组声明里的分组个数则计算机就会分配三组存储区 int arr[][2] = {{1}, {2}, {3}}; //初始化数据分为三组,如果省略数组声明里的分组个数则计算机也会分配三组存储区 int row = 0, col = 0; for (row = 0;row <= 2;row++) { for (col = 0;col <= 1;col++) { printf("%d ", arr[row][col]); } printf("\n"); } return 0; }
5、二维数组组名
#include <stdio.h> int main() { int arr[3][2] = {0}; printf("arr是%p\n", arr); //二维数组名称可以代表数组里第一个存储区的地址 printf("&arr[0][0]是%p\n", &arr[0][0]); printf("sizeof(arr)是%d\n", sizeof(arr)); //对二维数组名称进行sizeof计算结果是二维数组里所有存储区的总大小 printf("arr[1]是%p\n", arr[1/*组下标*/]/*代表组下标为1的组里最前面那个存储区的地址*/); printf("&arr[1][0]是%p\n", &arr[1][0]); printf("sizeof(arr[1])是%d\n", sizeof(arr[1])); //结果是一组存储区的总大小 return 0; } 运行结果: arr是007DF830 &arr[0][0]是007DF830 sizeof(arr)是24 arr[1]是007DF838 &arr[1][0]是007DF838 sizeof(arr[1])是8
6、二维数组练习
#include <stdio.h> int main() { int arr[5][5] = {0}; int row = 0, col = 0; for (row = 0;row <= 4;row++) { for (col = 0;col <= 4;col++) { //按顺序处理二维数组里的每个存储区 if (row == 0 && col < 4) { //组下标为0,组内下标小于4的 //存储区里应该放1 arr[row][col] = 1; } else if (row < 4 && col == 4) { //组下标小于4,组内下标等于4 //的存储区里应该放2 arr[row][col] = 2; } else if (row == 4 && col >= 1) { //组下标是4,组内下标大于等于1 //的存储区里应该放3 arr[row][col] = 3; } else if (row >= 1 && col == 0) { //组下标大于等于1,组内下标是0 //的存储区里应该放4 arr[row][col] = 4; } } } //把二维数组里所有存储区的内容从前向后 //每组显示在一行里 for (row = 0;row <= 4;row++) { for (col = 0;col <= 4;col++) { printf("%d", arr[row][col]); } printf("\n"); } return 0; } 运行结果: 11112 40002 40002 40002 43333
二、函数
1、普通函数
#include <stdio.h> void func(void) { int val = 100; //不同函数里的变量可以重名 } int main() { int val = 10; //不同函数里的变量可以重名 printf("val是%d\n", val); //不可以使用其他函数里的变量 return 0; }
2、带返回值函数
#include <stdio.h> void func(void) { int val = 100; //不同函数里的变量可以重名 } int main() { int val = 10; //不同函数里的变量可以重名 printf("val是%d\n", val); //不可以使用其他函数里的变量 return 0; }
3、带参数函数
#include <stdio.h> void print(int val/*形式参数*/) { printf("数字是%d\n", val); } int main() { print(7/*实际参数*/); //函数调用的时候计算机会把7放在形式参数val的存储区里 print(5 + 3); return 0; } #include <stdio.h> int add(int val, int val1) { //每个形式参数的类型名称都不可以省略 return val + val1; } int main() { int val = add(6, 3); printf("求和结果是%d\n", val); return 0; } #include <stdio.h> void func(int val, int val1) { printf("%d X %d = %d\n", val, val1, val * val1); } int main() { /*func(1, 9); func(2, 8); func(3, 7); func(4, 6); func(5, 5);*/ int num = 0; for (num = 1;num <= 5;num++) { func(num, 10 - num); } return 0; } 运行结果: 1 X 9 = 9 2 X 8 = 16 3 X 7 = 21 4 X 6 = 24 5 X 5 = 25
4、鸡兔同笼问题
#include <stdio.h> int rabbit(int heads, int legs) { int num = 0; for (num = 0;num <= heads;num++) { if (4 * num + 2 * (heads - num) == legs) { return num; } } return -1; } int main() { int heads = 0, legs = 0, ret = 0;; printf("请输入头和脚的数量:"); scanf("%d%d", &heads, &legs); ret = rabbit(heads, legs); if (ret >= 0) { printf("兔子是%d只,鸡有%d只\n", ret, heads - ret); } else { printf("没有找到答案\n"); } return 0; }
5、数组做函数参数
#include <stdio.h> void print(int arr[], int size) { int num = 0; for (num = 0;num <= size - 1;num++) { printf("%d ", arr[num]); } printf("\n"); } int main() { int arr[] = {1, 2, 3, 4, 5}; print(arr, 5); //和数组形式参数配对的实际参数必须是一个地址 return 0; }
6、输入输出参数
#include <stdio.h> void neg(int arr[], int size) { int num = 0; for (num = 0;num <= size - 1;num++) { arr[num] = 0 - arr[num]; } } int main() { int arr[] = {1, 2, 3, 4, 5}; int num = 0; neg(arr, 5); for (num = 0;num <= 4;num++) { printf("%d ", arr[num]); } printf("\n"); return 0; }
7、函数声明
#include <stdio.h> double add(double , double );//定义的函数在后面,前面用到了就需要声明一下 int main() { int val = add(3, 8); printf("val是%d\n", val); return 0; } double add(double val, double val1) { return val + val1; }
8、exit()退出函数
#include <stdio.h> #include <stdlib.h> void func(void) { printf("2\n"); //return ;//退出该函数 exit(0);//结束程序 printf("3\n"); } int main() { printf("1\n"); func(); printf("4\n"); return 0; }
9、递归函数()
#include <stdio.h> void print(int max) { if (max == 1) { //处理最大数字是1的情况 //这种情况不能再分解了 printf("1 "); return ; //分支必须保证函数可以结束 } print(max - 1); //显示1到max - 1之间所有整数,采用递归调用语句实现的 printf("%d ", max); } int main() { int max = 0; printf("请输入最大数字:"); scanf("%d", &max); print(max); printf("\n"); return 0; } 运行结果: 请输入最大数字:8 1 2 3 4 5 6 7 8
#include <stdio.h> int fei(int sn) { if (sn <= 1) { //计算编号为0和编号为1的两个数字 return 1; } return fei(sn - 2)/*计算编号为sn - 2的数字*/ + fei(sn - 1)/*计算编号为sn - 1的数字*/; } int main() { int sn = 0; printf("请输入一个编号:"); scanf("%d", &sn); printf("结果是%d\n", fei(sn)); return 0; }