09-C语言数组
目录:
一、使用xcode编辑工具
1 打开xcode程序
2 创建一个项目
OSX -> Application -> Command line Tool -> next
-> ProductName : 项目名称(day07-1)
-> Type : C
选择项目所要保存的目录
退出项目( command + q )
双击day07-1.xcodeproj打开项目
3 buile( command + b )编译
4 clean( command + shift + k )清除目标文件或可执行文件
5 command + r 编译运行、command + z 撤销、shift + command +z 撤销前进、esc打开关闭提示
6 新建一个文件command + n -> C and C++ -> C file -> 保存C文件的位置
7 在通常练习中,项目中会创建多个文件,所以我们会修改编译、链接操作,去掉不需要编译的文件(选中文件点击‘-’号或delete),点击项目名称 -> bulid phases -> Compile Sources 保留需要的文件,(其实就是command + r要编译运行的文件,不需要的那些文件就在这里干掉)
二、数组
1 数组是用来存储多条相同数据类型的数据结构。(容器)
2 关键点:
多条、类型相同;
数组是数据的容器而非数据本身;
数组中的每个数据叫元素、数组有多个元素组成;
数据下标(索引)来区分数据中的元素;
元素从数组的位置0开始;
元素可以使用数组名[下标]来得到具体的元素数据;
声明数组中元素的个数叫数组的长度;
数组所占空间 = 元素类型*数组长度;
数组是一段连续的内存区域;
数组变量名指向的区域是数组在内存中的首地址;
3 语法格式
元素类型 数组名[长度];
int array[3];
4 初始化
赋使用的值:
int array[3];//未初始化 可能存在垃圾值
int array2[3] = {1,2,3};//依次给数组元素赋
int array4[3] = {1,2};//如果赋值的个数少于数组长度会自动用0填充后面的值
赋值0:
int array3[3] = {0};//数组中的元素都是0
如果数组下标超出了长度,有可能有值有可能没值。
#include <stdio.h> int main(int argc, const char * argv[]) { //声明一个数组 //int array[3];//未初始化 可能存在垃圾值 //int array2[3] = {1,2,3};//依次给数组元素赋值 //int array3[3] = {0};////数组中的元素都是0 int array4[3] = {1,2};//如果赋值的个数少于数组长度会自动用0填充后面的值 //printf("array3[0]:%d\n",array3[3]);//3为数组的下标 0 1 2 3,如果超出了长度,有可能有值有可能没值 //下标 < 长度 //数组前有类型是长度 //数组前无类型是下标 //给数组元素赋值 array4[2] = 10; //printf("array4[2]:%d\n",array4[2]); //遍历数组元素 for (int i = 0; i < 3; i++) { printf("array4[%d]:%d\n",i,array4[i]); } return 0; }
三、数组遍历
5 赋值
下标 < 长度
数组前有类型数字是长度 int array[3];
数组前无类型数字是下标 array4[2] = 10;
6 取出数组元素的值
printf("array4[2]:%d\n",array4[2]);
7 查看数组中的每一个元素,遍历
//遍历数组元素
for (int i = 0; i < 3; i++) {
printf("array4[%d]:%d\n",i,array4[i]);
}
练习:
1)声明一个100个元素的数组,数组中的值是从1~100,遍历数组中的内容。
2)在键盘上输入5个数,求最大值,在数组中的位置。
3)输入五个同学的分数,刚好下标就是学生学号,问最高分的学生学号是多少?最低分学生的学号是多少?
#include <stdio.h> int main() { //练习:1)声明一个100个元素的数组,数组中的值是从1~100,遍历数组中的内容。 int arr[100] = {0}; //赋1~100给数组arr for (int i = 0; i < 100; i++) { arr[i] = i + 1; } //遍历数组 for (int i = 0; i < 100; i++) { printf("arr[%d]:%d\n",i,arr[i]); } /* 2)在键盘上输入5个数,求最大值,在数组中的位置。
*/
//声明最大值下标、最小值下标 int number[5] = {0}, max = -1000, maxIndex = -1, min = 1000, minIndex = -1; for (int i = 0; i < 5; i++) { printf("输入%d个数:\n",i+1); scanf("%d",&number[i]); } //输出数据 for (int i = 0; i < 5; i++) { //判断最大值 if (number[i] > max) { max = number[i]; maxIndex = i; } //判断最小值 if (number[i] < min) { min = number[i]; minIndex = i; } } printf("max:%d,index%d\n", max, maxIndex); printf("min:%d,index%d\n", min, minIndex); /* 3)输入五个同学的分数,刚好下标就是学生学号,问最高分的学生学号是多少?最低分学生的学号是多少? */ //可变数组,在声明数组前可以修改数组的长度,一旦数组声明,其长度不可变。 int length = 0; printf("输入有几个学生:"); scanf("%d",&length); int number[length]; int max = 0, maxIndex = -1, min = 100, minIndex = -1, sum = 0; printf("数组所占内存空间:%ld\n",sizeof(number)); printf("数组中元素所占内存空间:%ld\n",sizeof(number[0])); printf("数组长度:%ld\n",sizeof(number) / sizeof(number[0])); for (int i = 0; i < length; i++) { printf("输入第%d个学生的分数:",i+1); scanf("%d",&number[i]); if (number[i] < 0 || number[i] > 100) { printf("警告:分数不能小于0或大于100\n"); i--; //continue; } } for (int i = 0; i < length; i++) { //高分学号 if (number[i] > max) { max = number[i]; maxIndex = i; } //最低学号 if (number[i] < min) { min = number[i]; minIndex = i; } //总分 sum += number[i]; } printf("最高分学号:%d,最低分学号:%d\n", maxIndex, minIndex); printf("总分:%d\n",sum); printf("平均分:%d\n",sum / length); return 0; }
8 可变数组,在声明数组前可以修改数组的长度,一旦数组声明,其长度不可变。
在数组长度不确定时,可使用可变数组。
9 数组长度=数组所占内存空间/元素所占内存空间
sizeof(array) / sizeof(array[0])
当数组过多,只要知道数组名,使用sizeof计算出数组的长度。
练习:输入某班学生信息(人数不确定),以学号为标识,学号从1开始,将所有学生的考试成绩保存到数组中,求出总分、平均分、最高分及学号、最低分及学号。
1 #include <stdio.h> 2 //在一个项目中不能有两个mian函数 3 //在通常练习中,项目中会创建多个文件,所以我们会修改编译、链接操作,去掉不需要编译的文件(选中文件点击‘-’号或delete),点击项目名称 -> bulid phases -> Compile Sources 保留需要的文件 4 int main() 5 { 6 /* 7 输入某班学生信息(人数不确定),以学号为标识,学号从1开始,将所有学生的考试成绩保存到数组中,求出总分、平均分、最高分及学号、最低分及学号。 8 */ 9 printf("请输入班级人数:\n"); 10 int numbers = 0;//声明变量保存人数 11 scanf("%d",&numbers); 12 13 //保存所有的学生成绩 14 int scores[numbers]; 15 //输入学生成绩,这里的条件虽然可以直接写numbers,但是最好还是计算出长度,这样更灵活 16 for (int i = 0; i < sizeof(scores) / sizeof(scores[0]); i++) { 17 printf("请输入学号%d的成绩:\n",i+1); 18 scanf("%d",&scores[i]);//scores+i也可以 19 } 20 int max = 0,min = 100,maxIndex = -1,minIndex = -1,sum = 0,avg = 0; 21 //遍历学生成绩 22 for (int i = 0; i < sizeof(scores) / sizeof(scores[0]); i++) { 23 //最大值 24 if (scores[i] > max) { 25 max = scores[i]; 26 maxIndex = i; 27 } 28 //最小值 29 if (scores[i] < max) { 30 min = scores[i]; 31 minIndex = i; 32 } 33 //求和 34 sum += scores[i]; 35 } 36 //求平均值 37 avg = sum / (sizeof(scores) / sizeof(scores[0])); 38 printf("最最高:%d,最高分学号:%d,最低分:%d,最低分学号:%d,总分:%d,平均分:%d\n",max,maxIndex,min,minIndex,sum,avg); 39 40 return 0; 41 }
四、多维数组
1 声明一个一维数组 int array[3];
2 声明一个二维数组 int array[3][2];// 3代表一维数组元素个数,2代表二维数组元素个数
4 初始化
int array2[3][2] = {{1,2},{3,4},{5,6}}; //标准赋值
int array2[3][2] = {1,2,3,4,5,6};//依次赋值
int array2[3][2] = {1,2,3,4};//不够补0
3二维数组的遍历,先遍历一维数组中的元素,在遍历二维数组中的元素。
4 一维数组根据元素的个数可以确定数组的长度
int array[] = {1,2,3,4};
二维数组的必须确定二维数组的长度
int array3[][2] = {1,2,3,4,5,6};
作业:通过键盘输入5个人的课程成绩(语文、数学、英语),分别求出课程的平均分、各科成绩的总分,所有课程的平均分。
a、解决数据输入问题
b、显示问题
c、switch 0->张 0->语文
d、处理运算、计算数值
e、求谁的分高?
j张 李 王 赵 钱
i语文 10 10 10 1 0 1 0
数学 10 10 10 1 0 1 0
英语 10 10 10 1 0 1 0
语文总分:数学总分:英语总分
语文平均分:数学平均分:英语平均分
总平均分:
1 #include <stdio.h> 2 /* 3 作业:通过键盘输入5个人的课程成绩(语文、数学、英语),分别求出课程的平均分、各科成绩的总分,所有课程的平均分。 4 a、解决数据输入问题 5 b、显示问题 6 c、switch 0->张 0->语文 7 d、处理运算、计算数值 8 e、求谁的分高? 9 j张 李 王 赵 钱 10 i语文 10 10 10 10 10 11 数学 10 10 10 10 10 12 英语 10 10 10 10 10 13 语文总分:数学总分:英语总分 14 语文平均分:数学平均分:英语平均分 15 总平均分: 16 */ 17 int main() 18 { 19 //从键盘上输入3们课5个人成绩 20 int score[3][5] = {0}; 21 //保存每门课的总成绩 22 int sum[3] = {0}; 23 //保存每门课的平均分 24 int avg[3] = {0}; 25 //所有课程的平均分 26 int allAvg = 0; 27 //输入 28 for (int i = 0; i < 3; i++) { 29 printf("请输入,课:"); 30 //使用switch解决课显示问题 31 switch (i) { 32 case 0: 33 printf("语文,"); 34 break; 35 case 1: 36 printf("数学,"); 37 break; 38 case 2: 39 printf("英语,"); 40 break; 41 } 42 for (int j = 0; j < 5; j++) { 43 printf("人:"); 44 switch (j) { 45 case 0: 46 printf("张,"); 47 break; 48 case 1: 49 printf("李,"); 50 break; 51 case 2: 52 printf("王,"); 53 break; 54 case 3: 55 printf("赵,"); 56 break; 57 case 4: 58 printf("钱,"); 59 break; 60 } 61 //使用switch解决人显示问题 62 printf("的成绩:"); 63 scanf("%d",&score[i][j]); 64 } 65 } 66 //输出 67 printf(" 张 李 王 赵 钱\n"); 68 for (int i = 0; i < 3; i++) { 69 switch (i) { 70 case 0: 71 printf("语文 "); 72 break; 73 case 1: 74 printf("数学 "); 75 break; 76 case 2: 77 printf("英语 "); 78 break; 79 } 80 for (int j = 0; j < 5; j++) { 81 printf("%d ",score[i][j]); 82 //累计课程的和 83 sum[i] += score[i][j]; 84 //每门课的平均分 85 avg[i] = sum[i] / 5; 86 } 87 //总平均分 88 allAvg += avg[i]; 89 printf("\n"); 90 } 91 //显示每门课的总分 92 for (int i = 0; i < 3; i++) { 93 //使用switch解决课显示问题 94 switch (i) { 95 case 0: 96 printf("语文,"); 97 break; 98 case 1: 99 printf("数学,"); 100 break; 101 case 2: 102 printf("英语,"); 103 break; 104 } 105 printf("总分:%d,",sum[i]); 106 } 107 printf("\n"); 108 //显示每门课的平均分 109 for (int i = 0; i < 3; i++) { 110 //使用switch解决课显示问题 111 switch (i) { 112 case 0: 113 printf("语文,"); 114 break; 115 case 1: 116 printf("数学,"); 117 break; 118 case 2: 119 printf("英语,"); 120 break; 121 } 122 printf("平均分:%d,",avg[i]); 123 } 124 printf("\n"); 125 //所有课程的平均分 126 printf("所有课程平均分:%d\n",allAvg / 3); 127 return 0; 128 }