目录
第6章利用数组处理批量数据
怎样定义和引用一维数组
用数组来求fibonacci数列问题:
冒泡排序例题:
6.2怎样定义和引用二维数组
*交换行和列*
6.3字符数组
6.3.1怎样定义字符数组
6.3.4字符串和字符串结束标志
6.3.5字符数组的输入输出
6.3.6使用字符串处理函数
puts函数——输出字符串的函数
gets函数——输入字符串的函数
Strcat函数———字符串连接函数
Strcpy和strncpy——字符串复制函数
Strcmp——字符串比较函数
Strupr函数——转换为大写的函数
6.3.7字符数组应用举例
第六章课后习题:谭浩强 C语言程序设计第五版 第六章 习题 答案_月已满西楼的博客-CSDN博客_月已满西楼谭浩强
3. 求一个3 X 3的整形矩阵对角线元素之和
5. 将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。
第六章目录回顾:
C语言总结(一维数组、二维数组、字符数组和字符串)_快乐的兔子1的博客-CSDN博客_c语言一维数组 字符串 比较https://blog.csdn.net/csuft20164442/article/details/86602115?ops_request_misc=%7B%22request%5Fid%22%3A%22167219819516782427421300%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=167219819516782427421300&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-86602115-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v2&utm_term=%E6%95%B0%E7%BB%84&spm=1018.2226.3001.4187
数组的定义及其理解:用来表示同一性质的数据(比如说一个班的30名同学的成绩)
将数组与循环相结合起来可以有效的处理大批量的数据,大大提高工作效率
int a[10];
表示定义了一个整型数组,数组名为a,此数组中包含了10个整型元素。
注意a[10]中是从a[0]开始到a[9]结束 没有a[10]!!!
常量表达式中可以包含常量和符号常量,如inta[3+5]是合法的,不能包含变量,如int a[n];是不合法的,也就是说,C语言不允许对数组的大小作动态定义,即数据的大小不依赖于程序运行过程中变量的值。
例题:简化的插入排序
输入一个正整数 repeat (0 输入一个正整数 n(0 输入输出示例:括号内为说明 输入: 4 (repeat=4) 5 (数据的个数n=5) 1 2 4 5 7 (5个有序整数) 3 (待插入整数x=3) 4 (数据的个数n=4) 1 2 5 7 (4个有序整数) -10 (待插入整数x=-10) 3 (数据的个数n=3) 1 2 4 (3个有序整数) 100 (待插入整数x=100) 5 (数据的个数n=5) 1 2 4 5 7 (5个有序整数) 4 (待插入整数x=4) 输出: 1 2 3 4 5 7 -10 1 2 5 7 1 2 4 100 1 2 4 4 5 7 #include int main(void) { int i, j, n, x; int repeat, ri; int a[10]; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); scanf("%d", &x); if (x >= a[n-1]) a[n] = x; /* 特殊情况:若x比所有的元素都要大 */ else for(i = 0; i < n; i++) { if(x > a[i]) continue; /* 将x 插入到合适的位置*/ j = n - 1; /* 从当前要插入的位置往后移位 */ while(j >= i){ a[j+1] = a[j]; j--; } a[i] = x; /* 将x查到当前的位置 */ break; } for(i = 0; i < n + 1; i++) printf("%d ", a[i]); putchar('\n'); } } 一维数组的初始化 int a[10]={0,1,2,3,} int a[10]={0}未赋值的部分自动设定为0 #include int main() int i; int f[20]={1,1}; for(i=2;i<20;i++) { f[i]=f[i-2]+f[i-1]; for(i=2;i<20;i++) { if(i%5==0) printf(“\n”); printf(“%12d”,f[i]); } printf(“\n”); return 0; } (算法入门,算法的重要性!) http://t.csdn.cn/ERGm9 数字的排序: #include #define SIZE 10 int main() { int a[SIZE]={12 ,43,9,13,67,98,101,89,3,35};//十个数的无序数列 int i,j,t; printf("此程序使用冒泡排序法排列无序数列!\n"); //冒泡排序 for(i=0;i<10-1;i++)//n个数的数列总共扫描n-1次 { for(j=0;j<10-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束 { if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序) { t=a[j+1]; a[j+1]=a[j]; //t就是一个中间量用来交换2个数的值的 a[j]=t; } } } printf("排列好的数列是:\n"); //输出排列好得数列 for(i=0;i<10;i++) { printf("%d ",a[i]); } return 0; } 字符排序: 用函数来解决这个问题: #include #define SIZE 10 int main() { char a[SIZE]={'i','l','o','v','e','y','o','u','y','x'};//十个数的无序数列 int i,j; char t; printf("此程序使用冒泡排序法排列无序数列!\n"); //冒泡排序 for(i=0;i<10-1;i++)//n个数的数列总共扫描n-1次 { for(j=0;j<10-i-1;j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束 { if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序) { t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } } printf("排列好的字符组是:\n"); //输出排列好得吃数列 for(i=0;i<10;i++) { printf("%c ",a[i]); } return 0; } #include void function(char a[],int);//尤其注意,此处的函数声明必须是char a[],因为这里穿的是地址,不能仅仅使用char int main() { int i; char a[10]={'i','l','o','v','e','y','o','u','y','x'};//十个数的无序字符数列 printf("此程序使用冒泡排序法排列无序数列!\n"); function(a,10);//调用冒泡排序 printf("排列好的字符组是:\n"); //输出排列好得吃数列 for(i=0;i<10;i++) { printf("%c ",a[i]); } return 0; } void function(char a[],int m) { //冒泡排序 int i,j; char t; for(i=0;i { for(j=0;j { if(a[j]>a[j+1])//后一位数比前一位数小的话,就交换两个数的位置(升序) { t=a[j+1]; a[j+1]=a[j]; a[j]=t; } } } return; } 二维数组常称为矩阵。把二维数组写成行和列的排列形式,可以有助于形象化地理解二维数组的逻辑结构。 float pay[3][6]; 3*6(3行6列) 多维数组在内存中的排列顺序为:第一维的下标变化最慢,最右边的下标变化最快。例如: a[0][0][0]>>a[0][0][1]>>a[0][0][2]>>a[0][1][0]>>a[0][1][1]>>a[0][1][2]>>a[1][0][0] #include int main() { int n,m,i,j,k; int num1,num2;//要交换的两行或两列 char ch;//决定进行行变换还是列变换 int rek;//进行几次操作 int tmp; scanf("%d %d",&n,&m); int arr[n][m]; //输入矩阵 for(i=0;i { for(j=0;j { scanf("%d",&arr[i][j]); } } scanf("%d",&k); for(rek=0;rek { scanf(" %c %d %d",&ch,&num1,&num2); if(ch=='r')//进行行变换 { for(j=0;j { tmp=arr[num1-1][j];//进行行变换的时候约定矩阵的行不变循环递归列然后交换即可 arr[num1-1][j]=arr[num2-1][j]; arr[num2-1][j]=tmp; } } else if(ch=='c')//进行列变换 { for(i=0;i { tmp=arr[i][num1-1];//同理进行列变换的时候约定列为需要交换的两列不变后,循环递归循环行即可。 arr[i][num1-1]=arr[i][num2-1]; arr[i][num2-1]=tmp; } } } for(i=0;i { for(j=0;j { printf("%d ",arr[i][j]); } printf("\n"); } return 0; } 字符型数据是以字符的ASCII代码存储在存储单元中的,一般占1字节 C语言中没有字符串类型,也没有字符串变量,字符串是存放在字符串数组中的。 char c[10] 由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据,例如: int c[10]; //合法,但浪费存储空间 c[0]=‘a’ C语言规定了一个“字符串结束标志”,以字符串‘\0’作为结束标志。如果字符数组中存放有若干字符,前面9个字符都不是空字符‘\0’,而第十个字符是‘\0’,则认为数组中有一个字符串,其有效字符为9个。也就是说,在遇到字符‘\0’时,表示字符串结束,把它前面的字符组成一个字符串。 注意:C系统在用字符数组存储字符串常量时会自动加一个‘\0’作为结束符。例如“C program”共有9个字符。字符串是存放在一维数组中的,在数组中占10个字节,最后有一个字节‘\0’是系统自动加上的。 说明:‘\0’代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。 对字符串的说明: ①不能用运算符对字符串做运算 ②通过数组的方式可以遍历字符串 字符串的结尾有‘\0’ Char string[8]; Scanf (“%s”,string); //前面不允许加&(因为在C语言中数组名代笔该数组第一个元素的地址或者也可以说是数组的起始地址) Printf (“%s”,string); 安全的输入: Char string[8]; Scanf (“%7s”,string); 这个7代表:最多允许读入的字符数量,应比数组数组的大小小1 注意:在使用后字符串处理函数时,应当在程序文件的开头用 #include Puts(str); Gets(str); Strcat(字符数组1,字符数组2) #include #include int main(void) { char str1[6] = "hello"; char str2[6] = "world"; strcat(str1,str2); printf("str1 = %s\n",str1); printf("str2 = %s\n",str2); int len = strlen(str1); printf("len的长度:%d\n",len); return 0; } 说明: Strcpy(字符数组1,字符串2) Char strl[10],str2[]“china”; Strcpy(str1;str2); 说明: Strcmp(字符串1,字符串2) 字符串比较的规则是:将两个字符串自左向右逐个字符相比(按ASCII码值大小比较)直到出现不同的字符或者是遇到‘\0’为止。 比较的结果由函数值带回: 这样使用if(strcmp(str1,str2)>0) Printf(“yes”) Strlen函数——测字符串长度的函数 是string length(字符串的长度)的缩写。 Char str[10]=“CHINA” Printf(“%d”,strlen(str)); 输出的结果不是10,也不是6,而是5。 Strlwr函数——转换为小写的函数 Strlwr(字符串) 是string lowercase的缩写 Strupr(字符串) 70013 将数组中的数逆序存放 输入一个正整数 repeat (0 输入一个正整数 n (1 输入输出示例:括号内为说明 输入 2 (repeat=2) 4 (n=4) 10 8 1 2 5 (n=5) 1 2 5 4 0 输出 2 1 8 10 0 4 5 2 1 #include int main(void) { int i, n, temp; int repeat, ri; int a[10]; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); i=0; for(i=0;i temp=a[i]; a[i]=a[n-1-i]; a[n-1-i]=temp; } for(i = 0; i < n; i++) printf("%d ", a[i]); printf("\n"); } } 70014 求最大值及其下标 输入一个正整数 repeat (0 输入一个正整数 n (1 输入输出示例:括号内为说明 输入 3 (repeat=3) 3 (n=3) 1 6 4 4 (n=4) 10 8 1 9 5 (n=5) 1 2 0 4 5 输出 max = 6, index = 1 (最大值6的下标是1) max = 10, index = 0 (最大值10的下标是0) max = 5, index = 4 (最大值5的下标是4) #include int main(void) { int i, index, n; int ri, repeat; int a[10]; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); index=0; a[index]=a[0]; for(i = 1; i < n; i++){ if(a[index] a[index]=a[i]; index=i; } } printf("max = %d, index = %d\n", a[index], index); } } 70015 交换最小值和最大值 输入一个正整数 repeat (0 输入一个正整数 n (1 输入输出示例:括号内为说明 输入 3 (repeat=3) 5 (n=5) 8 2 5 1 4 4 (n=4) 1 5 6 7 5 (n=5) 5 4 3 2 1 输出 After swap: 1 2 5 4 8 After swap: 1 5 6 7 After swap: 1 4 3 2 5 #include int main(void) { int i, index, n, t; int repeat, ri; int a[10]; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); index=0; for(i = 1; i < n; i++){ 70016 选择法排序 输入一个正整数 repeat (0 输入一个正整数 n (1 输入输出示例:括号内为说明 输入 3 (repeat=3) 4 (n=4) 5 1 7 6 3 (n=3) 1 2 3 5 (n=5) 5 4 3 2 1 输出 After sorted: 7 6 5 1 After sorted: 3 2 1 After sorted: 5 4 3 2 1 #include int main(void) { int i, index, k, n, temp; int repeat, ri; int a[10]; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); for(k=0;k index=k; for(i=k+1;i if(a[i]>a[index]) index=i; temp=a[index]; a[index]=a[k]; a[k]=temp; } printf("After sorted: "); for(i = 0; i < n; i++) printf("%d ", a[i]); printf("\n"); } } 70017 在数组中查找指定的元素 输入一个正整数 repeat (0 输入一个正整数 n (1 输入输出示例:括号内为说明 输入: 2 (repeat=2) 6 (n=6) 1 3 5 7 9 5 5 (x=5) 4 (n=4) 1 3 5 7 2 (x=2) 输出: 5: a[2] 2: not found #include int main(void) { int flag, i, n, x; int repeat, ri; int a[10]; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ flag=0; /* 若标志不重新初始化的化,就会一影响下一轮循环的计算 */ scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &a[i]); scanf("%d", &x); for (i = 0; i < n; i++) { if(x==a[i]) { flag = 1; break; } } if(flag != 0) printf( "%d: a[%d]\n", x, i); else printf( "%d: not found\n", x); } } 70021 求矩阵各行元素之和 输入2个正整数 m 和 n (1<=m<=6, 1<=n<=6),然后输入矩阵 a(m 行 n 列)中的元素,分别求出各行元素之和,并输出。 输出使用语句:printf("sum of row %d is %d\n", i, sum); 输入输出示例:括号内为说明 输入: 3 2 (m=3,n=2) 6 3 1 -8 3 12 输出: sum of row 0 is 9 sum of row 1 is -7 sum of row 2 is 15 #include int main(void) { int i, j, m, n, sum; int a[6][6]; scanf("%d%d",&m,&n); for(i = 0; i < m; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); for(i = 0; i < m; i++){ sum=0; for(j = 0; j < n; j++) sum+=a[i][j]; printf("sum of row %d is %d\n", i, sum); } } 70022 矩阵运算 程序填空,不要改变与输入输出有关的语句。 输入一个正整数 repeat (0 读入 1 个正整数 n(1≤n≤6), 再读入 n 阶方阵 a , 计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。 输入输出示例:括号内为说明 输入: 1 (repeat=1) 4 (n=4) 2 3 4 1 5 6 1 1 7 1 8 1 1 1 1 1 sum = 35 (2+3+4+5+6+7+8=35) #include "stdio.h" int main(void) { int i, j, n, sum; int repeat, ri; int a[6][6]; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(i = 0; i < n; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); sum=0; for(i = 0; i < n; i++){ for(j = 0; j < n; j++) sum+=a[i][j]; } for(i = 1; i < n-1; i++) sum-=a[i][n-i-1]; /* 减去副对角线的元素 */ for(j =0; j sum-=a[n-1][j]; /* 减去最下一行 */ for(i =0; i sum-=a[i][n-1]; /* 减去最右一列 */ sum=sum+a[n-1][n-1]; /* 右下角元素减了两次,补回一次 */ printf("sum = %d\n", sum); } } 70023 九九乘法表 程序填空,不要改变与输入输出有关的语句。 输入一个正整数 repeat (0 输入一个正整数 n(0 提示:将乘数、被乘数和乘积放入一个二维数组中,再输出该数组。 输入输出示例:括号内为说明 输入: 1 (repeat=1) 3 (n=3) 输出: * 1 2 3 1 1 2 2 4 3 3 6 9 #include "stdio.h" int main(void) { int i, j, n; int a[10][10]; int repeat, ri; scanf("%d",&repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(j = 0; j <= n; j++) a[0][j]=j; /* 乘数 */ for(i = 0; i <= n; i++) a[i][0]=i; /* 被乘数 */ for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) a[i][j]=i*j; /* 结果 */ for(i = 0; i <= n; i++){ for(j = 0; j <= n; j++) if(i == 0 && j == 0) printf("%-4c", '*'); else if(i == 0 || j <= i) printf("%-4d", a[i][j]); printf("\n"); } } } 70024 判断上三角矩阵 输入一个正整数 repeat (0 输入1 个正整数 n (1≤n≤6)和 n 阶方阵 a 中的元素,如果 a 是上三角矩阵, 输出"YES", 否则, 输出"NO"。上三角矩阵指主对角线以下的元素都为0的矩阵, 主对角线为从矩阵的左上角至右下角的连线。 输入输出示例:括号内为说明 输入: 2 (repeat=2) 3 (n=3) 1 2 3 0 4 5 0 0 6 2 (n=2) 1 0 -8 2 输出: YES NO #include "stdio.h" #include "math.h" int main(void) { int flag, i, j, n; int a[6][6]; int repeat, ri; scanf("%d", &repeat); for(ri = 1; ri <= repeat; ri++){ scanf("%d", &n); for(i = 0; i < n; i++) for(j = 0; j < n; j++) scanf("%d", &a[i][j]); flag=1; for(i = 0; i < n; i++){ for(j = 0; j < i; j++){ if(a[i][j]!=0){ flag=0; break; /* 只要一个数值不满足就可以否定 */ } } if (!flag) break; } if(flag != 0) printf("YES\n"); else printf("NO\n"); } } 【答案解析】 矩阵:即二维数组,矩阵行和列相等的二维数组称为方阵。 1 2 3 4 5 6 7 8 9 左上角到右下角对角线上数字:行下标和列下标相加 右上角到左下角对角线上数字:列下标减1 行下标加一 通过两个循环来取到对角线上的元素,并对其求和即可。 【代码实现】 #include int main() { int array[3][3]; int sumLT2RB = 0; // 标记左上角到右下角对角线元素之和 int sumRT2LB = 0; // 标记右上角到左下角对角线元素之和 printf("请输入3行3列的矩阵:\n"); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) scanf("%d", &array[i][j]); } // 左上角到右下角对角线 for (int i = 0; i < 3; ++i) sumLT2RB += array[i][i]; for (int i = 0, j = 2; i < 3; ++i, j--) sumRT2LB += array[i][j]; printf("左上角到右下角对角线元素之和: %d\n", sumLT2RB); printf("右上角到左下角对角线元素之和: %d\n", sumRT2LB); return 0; } 【答案解析】 该题为数组的逆置,具体处理方式如下: 如果begin < end时,则循环进行一下操作 给定两个下标begin和end,begin放在数组起始的位置,end放在数组最后一个元素的位置 交换begin和end位置的元素 begin往后移动,end往前移动 【代码实现】 #include int main() { int array[5] = {8,6,5,4,1}; int begin = 0, end = 4; printf("逆序之前数组为:"); for (int i = 0; i < 5; ++i) printf("%d ", array[i]); printf("\n"); // 逆序:begin在数组最左侧,end在数组最右侧 // 只要begin < end,将begin和end位置元素进行交换 // 然后begin往后移动一步,end往前移动一步 while (begin < end) { int temp = array[begin]; array[begin] = array[end]; array[end] = temp; begin++; end--; } printf("逆置之后数组为:"); for (int i = 0; i < 5; ++i) printf("%d ", array[i]); printf("\n"); return 0; } 6.1怎样定义和引用一维数组139 6.1.1怎样定义一维数组140 6.1.2怎样引用一维数组元素140 6.1.3一维数组的初始化142 6.1.4一维数组程序举例142 6.2怎样定义和引用二维数组145 6.2.1怎样定义二维数组146 6.2.2怎样引用二维数组的元素147 6.2.3二维数组的初始化148 6.2.4二维数组程序举例149 6.3字符数组151 6.3.1怎样定义字符数组151 6.3.2字符数组的初始化152 6.3.3怎样引用字符数组中的元素152 6.3.4字符串和字符串结束标志153 6.3.5字符数组的输入输出156 6.3.6使用字符串处理函数157 6.3.7字符数组应用举例162
用数组来求fibonacci数列问题:
冒泡排序例题:
6.2怎样定义和引用二维数组
*交换行和列*
6.3字符数组
6.3.1怎样定义字符数组
6.3.4字符串和字符串结束标志
6.3.5字符数组的输入输出
6.3.6使用字符串处理函数
puts函数——输出字符串的函数
gets函数——输入字符串的函数
Strcat函数———字符串连接函数
Strcpy和strncpy——字符串复制函数
Strcmp——字符串比较函数
Strupr函数——转换为大写的函数
6.3.7字符数组应用举例
第六章课后习题:谭浩强 C语言程序设计第五版 第六章 习题 答案_月已满西楼的博客-CSDN博客_月已满西楼谭浩强
3. 求一个3 X 3的整形矩阵对角线元素之和
5. 将一个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。
第六章目录回顾: