C程序设计(第五版)-第6章 利用数组处理批量数据课后习题答案
1.用筛选法求100以内的素数
质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)
先解释一下筛选法的步骤:
<1> 先将1挖掉(因为1不是素数)。
<2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
<3> 用3去除它后面的各数,把3的倍数挖掉。
<4> 分别用5…各数作为除数去除这些数以后的各数。
上述操作需要一个很大的容器去装载所有数的集合,只要满足上述条件,即2的倍数大于1的全部置0,3的倍数大于1的全部置0,4的倍数大于1的全部置0……一直到这个数据集合的末尾,这样一来不为0的数就是素数了,然后按下标在里面进行查找就好了
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); int i, j, k, a[100]; // 先给100个数赋值 for (i = 0; i < 100; i++) { a[i] = i + 1; } // 1不是质数也不是合数 a[0] = 0; for (i = 0; i < 100; i++) { for (j = i + 1; j < 100; j++) { // 把后面的数能整除前面的数赋值为0 if (a[i] != 0 && a[j] != 0) { if (a[j] % a[i] == 0) { a[j] = 0; //把不是素数的都赋值为0 } } } } // 打印质数,每10个换行 for (i = 0; i < 100; i++) { if (k % 10 == 0) { printf("\n"); } if (a[i] != 0) { printf("%d ", a[i]); k++; } } return 0; }
2.用选择法对10个整数排序
#include <stdio.h> #include <windows.h> int main() { printf("请输入10个数:\n"); int minIndex, temp, a[10]; for (int i = 0; i < 10; i++) { scanf("%d", &a[i]); } for (int i = 0; i < 10; i++) { minIndex = i; for (int j = i + 1; j < 10; j++) { if (a[j] <= a[minIndex]) { minIndex = j; } } temp = a[i]; a[i] = a[minIndex]; a[minIndex] = temp; } printf("排序后结果:\n"); for (int i = 0; i < 10; i++) { printf("%d ", a[i]); } return 0; }
3.求一个3*3的整型矩阵对角线元素之和
#include <stdio.h> #include <windows.h> int main() { printf("请输入元素:\n"); int x, y, z, a[3][3]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &a[i][j]); } } printf("输出刚刚输入的元素:\n"); for (int i = 0; i <= 2; i++) { for (int j = 0; j <= 2; j++) { printf("%d\t", a[i][j]); } printf("\n"); } printf("\n"); // 计算对角线的合 for (int i = 0; i < 3; i++) { x += a[i][i]; } for (int i = 0, j = 2; i < 3; i++, j--) { y += a[i][j]; } z = x + y; printf("左上到右下对角线的合:%d\n", x); printf("右上到左下对角线的合:%d\n", y); printf("两条对角线之合:%d\n", z); // 结果 // 请输入元素: // 1 2 3 4 5 6 7 8 9 // 输出刚刚输入的元素: // 1 2 3 // 4 5 6 // 7 8 9 // 左上到右下对角线的合:15 // 右上到左下对角线的合:31 // 两条对角线之合:46 return 0; }
4.有一个已排好序的数组,要求输入一个数后,按原来的规律将它插入数组中
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); int t, x, a[5] = {1, 2, 4, 5, 6}; printf("请输入需要插入的数字:\n"); scanf("%d", &x); for (int i = 0; i < 5; i++) { if (x < a[i]) { t = a[i]; a[i] = x; x = t; } printf("%3d", a[i]); } printf("%3d", x); return 0; }
5.讲一个数组的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8
思路:首位互换
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); int t, a[5] = {8, 6, 5, 4, 1}; for (int i = 0, j = 4; i < (5 / 2); i++, j--) { t = a[j]; a[j] = a[i]; a[i] = t; } for (int i = 0; i < 5; i++) { printf("%d\t", a[i]); } return 0; }
6.输出以下的杨辉三角形(要求输出10行)
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include <stdio.h> #include <windows.h> #define COUNT 10 int main() { printf("------------------\n"); int i,j,a[COUNT][COUNT]; // 每行第一个都是1,最后一个也是1 for (int i = 0; i < COUNT; i++) { a[i][i] = 1; a[i][0] = 1; } // 从第三行开始计算,每行增加一个数,行数-2=要计算的数 for (i = 2; i < COUNT; i++) { for (j = 1; j <= i - 1; j++) { a[i][j] = a[i - 1][j - 1] + a[i - 1][j]; } } // 打印每一行的数 for (int i = 0; i < COUNT; i++) { for (int j = 0; j < i + 1; j++) { printf("%d ", a[i][j]); } printf("\n"); } return 0; }
7.要求输出1~n*n的魔方阵,既输出的方阵的每一行,每一列,对角线的和都相等
例如:
8 1 6
3 5 7
4 9 2
思路:
(1)将1放在第1行中间一列
(2)从2开始直到n*n,每个数放在前一个数右上角的位置
(3)如果前一个数的右上角超出了方阵,则:上一个数行数为1,下一个数行数为n,列数+1;上一个数列数为n,下一个数列数为1,行数-1。(在纸上画图就能理解)
(4)如果出现了下一个位置已经有数字的情况,将下一个数放在上一个数的下面,超出的情况同(3),移到最上面的第一行
#include<stdio.h> int main() { int a[16][16]; //定义数组,让方阵的边长不超过15 int n,i,j,k; int p,t; scanf("%d",&n); //输入方阵边数 if(n%2!=0&&n!=0&&n<=15) //边长不能是偶数,并且不能为0,边长小于等于15 { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { a[i][j]=0; //初始化数组 } } } i=1;j=n/2+1; //第一行的中间位置赋值为1 a[i][j]=1; for(k=2;k<=n*n;k++) //循环开始,k从2到n { //循环内是寻找k位置的过程 p=i;t=j; //用p,t暂存此时的位置 i=i-1; //确定下一个位置,存在越过行、列的情况按照思路更改 j=j+1; if(i<1) { i=n; } if(j>n) { j=1; } if(a[i][j]!=0) //检查下个位置是否有元素 { //若有元素,将下一个位置确定为当前位置下方的位置 if(p==n) { i=1;j=t; a[i][j]=k; }else { i=p+1;j=t; a[i][j]=k; } }else //若无元素,将k放入下个位置 { a[i][j]=k; } } for(i=1;i<=n;i++) //输出魔方阵 { for(j=1;j<=n;j++) { printf("%d ",a[i][j]); } printf("\n"); } return 0; }
8.找出一个二维数组中的鞍点,即该位置上的元素在该行最大、该列最小、也可能无鞍点
#include <stdio.h> #include <windows.h> #define N 3 #define M 4 int main() { printf("------------------\n"); int maxIndex, minIndex, a[N][M]; // 定义一个三行四列的数组 // 输入数组 printf("输入三行四列的数组数据:\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { scanf("%d", &a[i][j]); } } // 一共循环3次,因为有三行数据 for (int i = 0; i < N; i++) { int flag = 1; // 默认为1,假设该数是符合条件的 // 求出每行最大的数,比列数的次数M次 for (int j = 0; j < M; j++) { maxIndex = j; if (a[i][j] > a[i][maxIndex]) { maxIndex = j; } } // 判断该数是否是该列最小 ,比行的次数N次 for (int k = 0; k < N; k++) { if (a[k][maxIndex] < a[i][maxIndex]) { flag = 0; } } if (1 == flag) { printf("锚点:%d", a[i][maxIndex]); } } return 0; }
9.有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); int index, left = 0, mid, right = 14, x, a[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; printf("请输入一个整数:"); scanf("%d", &x); while (left <= right) { mid = (left + right) / 2; if (a[mid] == x) { printf("索引是%d", mid); break; } else if (a[mid] < x) { left = mid + 1; } else if (a[mid] > x) { right = mid - 1; } } return 0; }
10.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母,小写字母,数字,空格以及其他字符的个数
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); char a[3][80]; int A = 0, b = 0, digital = 0, blank = 0, other = 0; printf("输入三行数据:\n"); for (int i = 0; i < 3; i++) { gets(a[i]); for (int j = 0; j < 80 && a[i][j] != '\0'; j++) { if (a[i][j] >= 'A' && a[i][j] <= 'Z') { A++; } else if (a[i][j] >= 'a' && a[i][j] <= 'z') { b++; } else if (a[i][j] >= '0' && a[i][j] <= '9') { digital++; } else if (a[i][j] == ' ') { blank++; } else { other++; } } } printf("中英文大写字母%d个,小写字母%d个,数字%d个,空格%d个以及其他字符%d个", A, b, digital, blank, other); return 0; }
11.输出以下图案
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
#include <stdio.h> int main() { char c[] = {"* * * * *"}; for (int i = 1; i <= 5; i++) { puts(c); for (int j = 0; j < i*2; j++) { printf(" "); } } return 0; }
12.有一行电文,已按下面规律译成密码
A->Z a->z
B->Y b->y
C->X c->x
…… …………
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母不变。要求编程序将密码译回原文,并输出密码和原文
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); // A->Z a->z // B->Y b->y // C->X c->x // …… ………… // 即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母不变。要求编程序将密码译回原文,并输出密码和原文 // A-Z的ASCII是65-90 A+Z=B+Y=155 // a-z的ASCII是97-122 a+z=b+y=219 char a[10], b[10]; gets(a); for (int i = 0; i < 10 && a[i] != '\0'; i++) { if (a[i] >= 'A' && a[i] <= 'Z') { b[i] = 155 - a[i]; } else if (a[i] >= 'a' && a[i] <= 'z') { b[i] = 219 - a[i]; } else { b[i] = a[i]; } } puts(a); puts(b); return 0; }
13.编译程序,将两个字符串连接起来,不要用strcat函数
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); char a[10], b[10], c[20]; int i, j; printf("输入第一个字符串\n"); gets(a); printf("输入第二个字符串\n"); gets(b); for (i = 0; i < 10 && a[i] != '\0'; i++) { c[i] = a[i]; } for (j = 0; j < 10 && b[j] != '\0'; j++, i++) { c[i] = b[j]; } c[i + 1] = '\0'; // 设置截止符号 printf("%s", c); return 0; }
14.编一个程序,将两个字符串s1 和 s2比较﹐若s1>s2,输出一个正数﹔若s1=s2,输出0;若sl<s2,输出一个负数。不要用strcpy函数。两个字符串用gets 函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如,"A"与"C"相比,由于"A"<"C" ,应输出负数,同时由于'A'与'C'的ASCII码差值为⒉,因此应输出“一2”。同理:"And"和"Aid"比较,根据第⒉个字符比较结果,"n"比"i"大5,因此应输出“5”。
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); char a[10], b[10]; int i, j, aSum = 0, bSum = 0; printf("输入第一个字符串\n"); gets(a); printf("输入第二个字符串\n"); gets(b); // 吧a数组的ASCII码值相加,再把b数组的ASCII码值相加,两者的值相减 for (i = 0; i < 10 && a[i] != '\0'; i++) { aSum += a[i]; } for (j = 0; j < 10 && a[j] != '\0'; j++) { bSum += b[j]; } printf("%d", (aSum - bSum)); return 0; }
15.编写一个程序﹐将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。复制时,'\o'也要复制过去。'\o'后面的字符不复制。
#include <stdio.h> #include <windows.h> int main() { printf("------------------\n"); char a[10], b[10]; int i; gets(a); for (i = 0; i < 10 && a[i] != '\0'; i++) { b[i] = a[i]; } b[i + 1] = '\0'; printf("复制后:%s", b); return 0; }
C程序设计(第五版)-第1章 程序设计和C语言课后习题答案
C程序设计(第五版)-第2章 算法--程序的灵魂课后习题答案
C程序设计(第五版)-第3章 最简单的C程序设计—顺序程序设计课后习题答案
C程序设计(第五版)-第4章 选择结构程序设计课后习题答案
C程序设计(第五版)-第5章 循环结构程序设计课后习题答案
C程序设计(第五版)-第6章 利用数组处理批量数据课后习题答案
C程序设计(第五版)-第7章 用函数实现模块化程序设计课后习题答案
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)