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章 用函数实现模块化程序设计课后习题答案

posted @   luckyangg  阅读(533)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示