class-notes/2207/C语言练习题合集.md
2025-02-17 17:21:08 +08:00

880 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 一、顺序结构
1 将华氏温度转换为摄氏温度和绝对温度的公式分别为:
c= (f-32) (摄氏温度)
k=273.16+c (绝对温度)
请编程序:当给出f 时,求其相应摄氏温度和绝对温度。
测试数据:① f=34
② f=100
2 写一个程序把极坐标(r,θ) (θ之单位为度)转换为直角坐标( X,Y)。转换公式是:
x=r.cosθ
y=r.sinθ
测试数据:① r=10 θ=45°
② r=20 θ=90°
3 写一个程序,按如下格式输出数据。
name number math english computer
zhanghua 9901 80.50 87.0 80
lina 9902 70.00 80.0 90
wanggang 9903 87.00 76.0 78
4 输入3 个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输
出所求出各个值。
5 输入一个3 位整数求出该数每个位上的数字之和。如123每个位上的数字和就是
1+2+3=6。
## 二、分支结构
1 输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其
对应小写字母如果是数字输出数字本身如果是空格输出“space”如果不是
上述情况输出“other”。
2 有三个数a、b、c,由键盘输入,输出其中最大的数。
3 输入一个数,判断它能否被 3 或者被 5 整除, 如至少能被这两个数中的一个整除则将
此数打印出来,否则不打印,编出程序。
4 读入1 到7 之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday
等等用switch 语句做。
5 给出一百分制成绩要求输出成绩等级A,B,C,D,E,90 分以上为
A,8089 分为B,7079 分为C,6069 分为D,60 分以下为E
6 有一函数请编程序计算y 的值(x 的值由键盘输入)。
<img src="https://yp.smallkun.cn/markdown/image-20241130003549906.png!compress" alt="image-20241130003549906" style="zoom:50%;" />
## 三、循环结构
1 计算n 的阶乘
2 求 1 到 100 之间的奇数之和、偶数之积。
3 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。
4 用循环语句编写求下列表达式值的程序。
<img src="https://yp.smallkun.cn/markdown/image-20241130003536421.png!compress" alt="image-20241130003536421" style="zoom:50%;" />
5.求1!+2!+3!+...+20!
6.求下列分数序列的前20项之和。
<img src="https://yp.smallkun.cn/markdown/image-20241130003647576.png!compress" alt="image-20241130003647576" style="zoom:50%;" />
7 任意十个数,打印出它们中的最大数、最小数。
测试数据:① 1,-12,20,30,-5,-23,33,125,200,-100
② 0,10,3,1,5,6,-10,90,9,-4
③ 12,13,14,15,10,-10,-11,-12,-9,9
8 判断一个数是否是素数
9 打印1-100 之间所有素数
10 求1-100 之间所有非素数的和
11 输入两个正整数 m 和 n求其最大公约数和最小公倍数
提示:
求 mn的最大公约数:首先将 m除以 nm>n得余数 R再用余数 R 去除原来的除数,得新的余数,重复此过程直到余数为 0 时停止此时的除数就是m 和 n的最大公约数。
求 m和 n的最小公倍数: m和 n的积除以 m和 n 的最大公约数。
测试数据: m12 n24
m100 n300
12 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方
和等于该数本身。例如 153 是一个水仙花数,因为 1531\*1\*1+5\*5\*5+3\*3\*3要求分别用一重循环和三重循环实现
13 一个数恰好等于它的平方数的右端,这个数称为同构数。如 5 的平方是25 5 是25 中的右端的数, 5 就是同构数。找出11000 之间的全部同构数。
14 3025 这个数具有一种独特的性质将它平分为两段即30 和25使之相加后求平方30+25恰好等于3025 本身。请求出具有这样性质的全部四位数。
15 两位数13 和62 具有很有趣的性质把它们个位数字和十位数字对调其乘积不变即13*6231*26。 编程序求共有多少对这种性质的两位数个位与十位相同的不在此列如11、22重复出现的不在此列如 13*62 与62*13
16 一个数如果恰好等于它的因子之和这个数就称为“完数”。例如6 的因子为1、2、3而6=1+2+3因此6 是“完数”。编程序找出1000 之内的所有完数,并按下面格式输出其因子:
6 its factors are 1,2,3
17 有一个四位正整数组成这个四位数的四个数字各不相同如果把它们的首尾互换第二位与第三位互换组成一个新的四位数。原四位数为新四位数的4 倍,请找出一个这样的四位数。
18 给出一个不多于4 位的正整数,要求:① 求出它是几位数 ② 分别打印出每一位数字 ③ 按逆序打印出各位数字。
19 在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 时,下式的值:
![image-20241130004016370](https://yp.smallkun.cn/markdown/image-20241130004016370.png!compress)
提示:本题中误差指前 n+1项之积与前 n项积之差。
20 用泰勒展开式求sinx 的近似值
![image-20241130004040849](https://yp.smallkun.cn/markdown/image-20241130004040849.png!compress)
测试数据:① x0.3 n8
② x0.5 n20
21 验证歌德巴赫猜想。一个充分大的偶数大于或等于6可以分解为两个素数之和。试编程序将 6 至50 之间全部偶数表示为两个素数之和。
22 用牛顿迭代法求方程在 1.5 附近的根(精度为<img src="https://yp.smallkun.cn/markdown/image-20241130004125210.png!compress" alt="image-20241130004125210" style="zoom: 40%;" />)。
![image-20241130004157841](https://yp.smallkun.cn/markdown/image-20241130004157841.png!compress)
23 两个乒乓球队进行比赛各出三人甲队为A、B、C 三人乙队为X、Y 、Z 三人,已知抽签决定比赛名单。有人向队员打听比赛的名单, A 说他不和 X 比C 说他不和X、Z 比,请编程序找出三对赛手的名单。
## 四、数组
1 有一个正整数数组包含N 个元素,要求编程求出其中的素数之和以及所有素数的平均值。
2 有一个数组内放10 个整数。要求找出最小的数和它的下标,然后把它和数组中最前面的元素对换位置。
3 有 N 个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序。
4 输入N 个数到数组中输出所有大于N 个数平均值的数。
5 输入N 个数到数组中,选出其中最大的数和最小的数,并分别将它们与最前面和最后面的数互换。
6 用选择法对10 个整数由大到小排序。
7 用筛选法求 2 到 100 之间的素数。方法如下:首先 2 是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去, 2 以后没有被筛去的第一个数是 3 然后把 3的倍数都从数表中筛去 3 以后没被筛去的第一个数是 5然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K≤ N其后没有数可筛选为止 这时保留下的未被筛去的数就是 2 到 N 的素数。
8 求一个 3×3 矩阵两条对角线上元素之和(每个元素只加一次)。
9 打印如下形式的杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
输出前10行从 0行开始分别用一维数组和二维数组实现。
10有一个二维数组整型数组中每一行都有一个最大值编程求出这些最大值以及它们的和。
11把一个二维实型数组a 按照第0 列的元素进行排序由小到大排序用起泡法。例如如果a[i][0]大于a[i+1][0]则i 行与i+1 行中所有元素都要进行对换。
12编程序将一个字符串的前 N 个子字符送到一个字符型数组中去, 然后再加上一个0不允许使用strcpy(str1,str2,n)函数)。
13将字符数组 A 中下标为双号0,2,4,6,8...) 的元素值传给另一个字符数组 B然后将 B 数组的元素按逆序输出。
14有一行字符统计其中的单词个数单词之间以空格分隔并将每一个单词的第一个字母改为大写。
15有 N 个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。
16有17 个人围成一圈编号为016从第 0 号的人开始从 1 报数, 凡报到 3 的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?
17编程产生如下形式的方阵。
1 2 2 2 2 2 1
3 1 2 2 2 1 4
3 3 1 2 1 4 4
3 3 3 1 4 4 4
3 3 1 5 1 4 4
3 1 5 5 5 1 4
1 5 5 5 5 5 1
要求:不允许使用键盘输入语句和静态赋值语句,尽量少用循环。
18打印所有不超过 n n<256的其平方具有对称性的数也称回文数)。
19求N 个数中的最大值最大值出现的次数然后求出次大值次大值一定存在)。
20找出 M×N 数组中所有不相邻元素并求出它们的和相邻的数前一个是偶数后一个是素数)。
21.已知 100 个自然数 1100我们取 1 2 3 4 我们可将其排成一圈使每两个数之和都是素数1234→, 1100 内连续取 n 个数 1 n(≤ 100能满足上述要求的最大的 n 是多少
22.打印魔方阵所谓魔方阵是指这样的方阵它的每一行每一列和对角线之和均相等
例如三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求打印由 1到N\* N的自然数构成的魔方阵
提示魔方阵中各数的排列规律如下
1放在第一行中间一列
2开始直到n×n为止各数依次按下列规则存放每一个数存放的行比前一个数的行数减1列数加1
如果上一个数的行数为1则下一个数的行数为 n指最下一行
当一个数的列数为 n下一个数的列数应为1行数减1
如果按上面规则确定的位置已有数或上一个数是第 1行第 n列时 则把下一个数放在上一个数的下面
23.统计一个单位职工的年龄要求把相同年龄最多的那个年龄找出来可能有几个这样的年龄并统计出现的次数
24.n×n 的拉丁方阵的每行每列均为自然数的一个全排列 每行上均无重复数
n5 5×5 的一种拉丁方阵可以为
1 5 2 4 3
2 3 4 5 1
4 1 5 3 2
5 2 3 1 4
3 4 1 2 5
该数组的第一行 1,5,2,4,3 用程序自动生成但产生的第一行不一定非得是 1,5,2,4,3第一行填写完毕后即以第一行作为全方阵索引 即若第一行中的第 i 列的元素值为 j j在各行中的列号即为从第一行中元素值为 i的那一列开始读出的 n个自然数到行末则从行头接着读例如第一行第2列的元素值为5 则从元素值为2的那一列第3列开始读出2,4,3,1,5这就是元素5在各行中的列标号
测试数据:① n5 n8
## 五、函数
1.编写一函数判断某数是否素数
2.编写一函数求三个整数的最大值
3.打印出3 到1100 之间的全部素数判素数由函数实现)。
4.写一函数使给定的一个二维数组(3×3)转置即行列互换
5.写一函数将两个字符串连接即编写一strcat 函数
6.写一函数求一字符串长度即编写一strlen 函数
7.写一函数将字符数组s1 中的全部字符复制到字符数组s2 不用strcpy 函数
8.写一函数判断某数是否水仙花数”,所谓水仙花数是指一个三位数 其各位数字立方和等于该数本身
9.在主函数内任意输入一个5×6 矩阵编写一函数求出每一行的和放到一个一维数组中输出此矩阵及其每一行的和
10.写一主函数输入一数组写一子函数实现对该数组的冒泡排序并输出
11.任意输入20 个正整数找出其中的素数并将这些素数按由小到大排序要求判断一
个数是否为素数用函数实现排序用函数实现
12.编写计算m 的n 次方的递归函数
13.编一个程序读入具有5 个元素的整型数组然后调用一个函数递归计算这些元素的积
14.编一个程序读入具有5 个元素的实型数组然后调用一个函数递归地找出其中的最大元素并指出它位置
## 六、指针
1 输入三个整数按由小到大的顺序输出
```c
#include <stdio.h>
//定义一个函数 传入两个整型指针 交换 两个指针所指向的值
void swap(int *x, int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int main(void){
int a, b, c;
printf("请输入三个数字(以空格间隔):");
scanf("%d %d %d", &a, &b, &c);
//由小到大 升序
if(a > b){//b为 a、b两个变量中 最大值
swap(&a, &b);
}
if(b > c){//c 为 a、b、c中最大值
swap(&b, &c);
}
if(a > b){//b为 a、b两个变量中 最大值
swap(&a, &b);
}
printf("%d %d %d\n", a, b, c);
return 0;
}
```
2 输入10 个整数将其中最小的数与第一个数对换把最大的数与最后一个数对换写三个函数:①输入10 个数;②进行处理;③输出10 个数
```c
#include <stdio.h>
void swap(int *x, int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
}
//输入数组元素
void input(int *arr, int n){
int i;
for(i=0;i<n;i++){
scanf("%d", arr+i);
}
}
//处理数组元素 最大值和最后一个元素交换,最小值和最前一个元素交换
void process(int *arr, int n){
int *max, *min;//max 最大值的地址 min最小值的地址
int i;
max = min = arr;
//通过遍历数组的所有元素 求出最大值和最小值的地址
for(i = 1;i < n;i++){
if(*(arr+i) > *max){
max = arr+i;
}
if(*(arr+i) < *min){
min = arr+i;
}
}
//如果最大值的地址为数组的首地址 则最小值和首地址交换后 最大值地址为最小值地址
if(max == arr){
max = min;
}
swap(min, arr);//最小值和数组首元素交换
swap(max, arr+9);//最大值和数组最后一个元素交换
}
//输出数组元素
void output(int *arr, int n){
int i;
for(i=0;i<n;i++){
printf("%d ", *(arr+i));
}
printf("\n");
}
int main(void){
int num[10];
input(num, 10);
process(num, 10);
output(num, 10);
return 0;
}
```
3 有n 个整数使前面各数顺序向后移m 个位置最后m 个数变成最前面m 个数写一函数实现以上功能在主函数中输入n 个整数和输出调整后的n 个数
```c
#include <stdio.h>
#include <stdlib.h>
void move(int *arr, int n){
int i, temp;
temp = *(arr+n-1);
//1 2 3 4 5
// 1 2 3 4
for(i=n-1;i>0;i--){
arr[i] = arr[i-1];
}
arr[0] = temp;
}
void output(int *arr, int n){
int i;
for(i=0;i<n;i++){
printf("%d ", *(arr+i));
}
printf("\n");
}
int main(void){
int n, i, m;
int *num;
printf("请输入您需要输入的元素个数:");
scanf("%d", &n);
/*
1 2 3 4 5 n=5 m = 2
4 5 1 2 3
*/
num = (int *)malloc(sizeof(int)*n);//动态内存分配数组容量
printf("请输入%d个数字:", n);
for(i=0;i<n;i++){
scanf("%d", num+i);//遍历输入数组每一个元素
}
printf("移动前:");
output(num, n);
printf("请输入您需要移动的个数:");
scanf("%d", &m);
for(i = 0;i < m;i++){
move(num, n);
}
printf("移动后:");
output(num, n);
return 0;
}
```
4 写一函数求一个字符串的长度在main 函数中输入字符串并输出其长度
```c
#include <stdio.h>
int getStrLen(char *str){
int n=0;
while(*str != '\0'){
str++;
n++;
}
return n;
}
int main(void){
char str[100];
gets(str);
printf("len=%d\n", getStrLen(str));
return 0;
}
```
5 写一函数将一个3×3 的矩阵转置
```c
#include <stdio.h>
void revse(int (*num)[3]){
int *start, *end;
int temp;
start = *num;//第一个数组的首个元素地址
end = *(num+2)+2;//第三个数组的最后一个元素地址
while(start < end){
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
int main(void){
int num[3][3];
int i, j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d", *(num+i)+j);
}
}
printf("\n");
revse(num);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ", *(*(num+i)+j));
}
printf("\n");
}
return 0;
}
```
6 在主函数中输入10 个等长的字符串用另一函数对它们排序然后在主函数输出这10 个已排好序的字符串
```c
#include <stdio.h>
#include <string.h>
/*
strcmp(字符串1, 字符串2); 比较两个字符串的大小 大于返回1 小于返回-1 等于返回0
strcpy(字符串1, 字符串2); 复制两个字符串 字符串2->字符串1
*/
void sort(char (*strs)[100]){
int i, j;
char temp[100];
for(i=0;i<10-1;i++){
for(j=0;j<10-i-1;j++){
if(strcmp(strs[j],strs[j+1]) > 0){
strcpy(temp ,strs[j]);
strcpy(strs[j], strs[j+1]);
strcpy(strs[j+1], temp);
}
}
}
}
int main(void){
char strs[10][100];
int i;
for(i=0;i<10;i++){
gets(*(strs+i));
}
sort(strs);
printf("\n");
for(i=0;i<10;i++){
puts(*(strs + i));
}
return 0;
}
```
7 编一程序打入月份号输出该月的英文月名例如输入"3"则输出"March"要求用指针数组处理
1: January, 2: February, 3: March, 4: April, 5: May, 6: June, 7: July, 8: August, 9: September, 10: October, 11: November, 12: December
```c
#include <stdio.h>
#include <stdlib.h>
int main(void){
//存着地址的数组 存储字符串的首地址的数组
char *month[12] = {"January", "February", "March", "April",
"May", "June", "July", "August", "September", "October",
"November", "December"};
int num;
printf("请输入月份数字形式:");
scanf("%d", &num);
printf("%s\n", *(month+num-1));
return 0;
}
```
8 写一函数完成查找串s2 在串s1 中第一次出现的位置
```c
#include <stdio.h>
#include <string.h>
int instr(char *dest, char *substr){
int i=0, j;
while(*(dest+i) != '\0'){
j=0;//对子串匹配从首个开始
while(*(substr+j)!='\0' && *(dest+i) == *(substr+j)){
i++;
j++;
}//暴力查找主串中和子串相等的字符 到子串结尾或遇到不相同元素时退出循环
if(j==0){//当前主串中没有和子串首元素相同的元素时 主串下标后移
i++;
}
//匹配到子串结尾标记时代表找到首个子串
if(*(substr+j) == '\0'){
return i-strlen(substr)+1;
}
}
return -1;//没有找到子串
}
int main(void){
char str[100];
char substr[100];
gets(str);
gets(substr);
printf("%d\n", instr(str, substr));
return 0;
}
```
9 写一函数完成将无符号十进制整数转换成十六进制字符表示并存于字符串数组中
```c
#include <stdio.h>
void decimalToHex(int dec, char *hex){
int i, j, temp, count=0;
//i, j, temp 用来数组倒置
//count 用来统计元素的个数
while(dec){
//模除十进制数字得余数后判断是否为数字 如果为 使用'0'加上该数之后存储为字符
if(dec%16 < 10){
*(hex+count++) = dec%16 + 48;
}else{
//得到A~F时使用大写字符ASCALL值将其转换为字符
*(hex+count++) = dec%16-10 + 65;
}
dec /= 16;
}
//数组元素的倒置
i = 0;
j = count - 1;
while(i < j){
temp = *(hex + i);
*(hex + i) = *(hex + j);
*(hex + j) = temp;
i++;
j--;
}
*(hex+count) = '\0';//标记结束符
}
int main(void){
int dec;//用来存储需要转换的十进制数字
char hex[1000];//用来存储转换后的数字的
printf("请输入一个数字:");
scanf("%d", &dec);
decimalToHex(dec, hex);
puts(hex);
return 0;
}
```
10 用指向指针的指针的方法对N 个整数排序并输出要求排序单独写成一个函数N 个整数和N 在主程序中输入最后在主函数中输出
```c
#include <stdio.h>
void sort(int (*arr)[10]){
int i, j, temp;
for(i=0;i<10-1;i++){
for(j=0;j<10-1-i;j++){
if((*arr)[j]> (*arr)[j+1]){
temp = (*arr)[j];
(*arr)[j] = (*arr)[j+1];
(*arr)[j+1] = temp;
}
}
}
}
int main(){
//指针->数组 int (*变量名)[数组的元素个数]
//数组指针 指向数组的指针
int num[10];
int i;
printf("请输入10个整数:");
for(i = 0;i<10;i++){
scanf("%d", num+i);
}
sort(&num);
for(i = 0;i<10;i++){
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
```
## 七、结构体与共用体
1.定义一个结构体其中包括: 职工号职工名性别年龄工资地址按结构体类型定义一个结构体数组, 从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(可设数组只有三个元素)。
2.有一批图书,每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据,希望输入后按书名的字母顺序将各书的记录排列好,供以后查询今输入一本书的书名如果查询到库中有此书打印出此书的书名,作者,编号和出版日期如果查不到此书,则打印出无此书”。
3.13 个人围成一圈,从第一个人开始顺序报号123 凡报到3者退出圈子找出最后留在圈子里的人原来的序号
4.编写一个程序,输入n (少于10 )学生的姓名性别 成绩出生年月日及入学年月日,输出成绩在80 分以上的学生的姓名性别成绩出生和入学的年份
5.将上题改为输出成绩在80 分以上的18 岁以下的女生的姓名成绩出生和入学的年份”,试编写程序实现之
6.有10 个学生,每个学生的数据包括学号姓名三门课的成绩,从键盘输入10 个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号 姓名三门课成绩平均分数)。
7.设链表中每个结点包括学号成绩和指针三个字段, 试编程序打印出链表中第1,3,5,7...结点
8.设链表中每个结点包括学号成绩和指针三个字段, 试编程序将大于平均成绩的各个结点打印出来
9.设链表中每个结点包括学号成绩和指针三个字段, 试编程序将成绩最高的结点作为链表的第一个结点,成绩最低的结点作为尾结点
10.建立一个链表,每个结点包括:学号姓名性别年龄输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去
## 八、文件
1.将10 个整数写入数据文件f3.dat ,再读出f3.dat 中的数据并求其和
2.一个以5d 格式存放20 个整数的文件f4.dat顺序号定为019输入某一顺序号之后读出相应的数据并显示在屏幕上
3.将10 名职工的数据从键盘输入 然后送入磁盘文件worker1. rec 中保存设职工数据包括职工号职工名性别年龄工资再从磁盘调入这些数据依次打印出来 fread 和fwrite 函数)。
4.将存放在worker1.rec 中的职工数据按工资高低排序将排好序的各记录存放在worker2.rec ( fread 和fwrite 函数)。
5.用scanf 函数从键盘读入 5 个学生数据包括学生名学号三门课程的分数然后求出平均分数 fprintf 函数输出所有信息到磁盘文件stud.rec 再用fscanf 函数从 stud.rec 中读入这些数据并在显示屏上显示出来
6.在文件 worker2.rec 中插入一个新职工的数据并使插入后仍保持原来的顺序按工资高低顺序插入到原有文件中然后写入worker3.rec
7.删除worker2.rec 中某个序号的职工记录再存入原文件中用fread 和fwrite 函数)。
8.有两个磁盘文件各自存放已排好序的若干个字符如a1. dat 中放"abort" a2.dat中放 "boy"要求将两个文件合并合并后仍保持有序存放在a3.dat 文件中
提示可先将两个文件中的字符存入一个字符型数组中而后对数组重新排序再将该数组写入a3.dat文件中
如果不引入一个中间数组进行重新排序该如何编程
## 附加题
1.编程序求 5X+2Y+Z=50 的所有非负整数解
2.有一长度不大于40 的字符串已知其中包含两个字符A”,求处于这两个字符A中间的字符个数并把这些字符依次打印出来
3.把25 个字母AB C、··· XY 按如下要求打印出来从最中间的字母M开始打印然后一左一右依次打印出其它字母即MLNKO,...。要求初始化时按字母表顺序赋值
4.编一个程序把一批非零整数中的偶数奇数的平均值分别计算出来用零作为终止标记
5.某单位排队形开始排成3 路纵队末尾多出了2 后改成5 路纵队末尾又多出了3 最后改成7 路纵队正好没有余数编程序求出该单位至少有多少人
6.将一个6×6 数组的第一行第六行主对角线和副对角线上的元素都存入1其余的元素都存入-1请编程序实现
要求1不许对数组初始化
2尽量少用循环
7.个位数是6且能被3 整除的五位数共有多少个
8.求100 至200 之间能同时被6 和8 整除的数把这些数打印出来并且打印这些数的和
9.雨淋湿了一道算术题9 个数字现在只能认清4 第一个数字虽模糊不清但肯定不是1
<img src="https://yp.smallkun.cn/markdown/image-20241130010005134.png!compress" alt="image-20241130010005134" style="zoom:50%;" />
请编程序找出那些看不清的数字。
10.编程序计算下述函数在X-7-107 时的值。
11.判断一个给定的5×5 方阵是否以第3 列为轴线对称?
12.编写一个函数JOIN让它实现字符串连接运算功能。
13.编写函数IND让它判断一个字符串是否为另一个字符串的子串的功能若是则返回第一次出现的起始位置否则返回0。
14.编写一个函数,由参数传来一个字符串,分别求出此字符串中字母、数字和其它字符(不包括空格)的个数,输入和输出均由主函数实现。
15.已知某年不是闰年,给定该年某一天的月份和日期,求这一天是该年的第几天。
16.找规律编程序打印6×6 的矩阵:
1 2 3 5 8 13
1 4 9 17 30 51
1 6 19 45 92 173
. . .
17.有人说在400,401,402,...499 这些数中4 这个数字共出现112 次,请编程序判定这种说法是否正确。若正确请打印出'YES',否则打印出'NO'及4 的出现次数。
18.设有8×8 的二维数组a其中每个元素取值如下
当 i=j 时 a\[i\]\[j\]=M M 是你的学号)
当 i<j a\[i\]\[j\]=ij
i>j 时 a\[i\]\[j\]=i×j
编程序求所有的数组元素之和。
19.找3 个数字,填在下面式子中,使等式成立。
<img src="https://yp.smallkun.cn/markdown/image-20241130010139383.png!compress!compress" alt="image-20241130010139383" style="zoom:50%;" />
① 若答案有多个,则打印一组即可;
② 若无满足条件的数字,则显示'NO DIGITALS'。
20.某航空公司规定在旅游旺季7─9 月份若订票超过20 张优惠票价的1520 张以下优惠5在旅游淡季1─5 月、10 月、11 月份订票超过20 张优惠3020 张以下优惠20其余月份不优惠。请编程序能根据月份和旅客订票张数决定优惠率。
21.请编程序按如下格式打印一个直角三角形的九九乘法表:
1 2 3 4 5 6 7 8 9
4 6 8 10 12 14 16 18
9 12 15 18 21 24 27
16 20 24 28 32 36
25 30 35 40 45
36 42 48 54
49 56 63
64 72
81
22.有一批实数,用零作终止标记。请编程序找出这批数中的最大值及最小值,并输出该最大值数是这批数中的第几个数(若最大值数多次出现,只打印出第一个的位置)。
23.有10 个两位整数把这些数作以下变化如果它是素数则把它乘以2若它是偶数则除以2其余的数减1请将变化后的10 个数按从小到大的次序打印出来。
24.已知有N 个无规律的正整数请编程序求出其中的素数并打印出能被5 整除的数之积。
25.把一个偶数位的数从当中分开成为两个数这两个数的和的平方等于原数。如8+12=8120+252=2025。求10 至9999 之间满足这样条件的数是哪些? 共有多少个?
26.已知有9 个数,请求出这些数中的最大值、最小值及平均值,以及有多少个数等于平均值?
27.求二维数组中每行元素的平均值,不许引入其它的数组。
28.编程序计算函数
<img src="https://yp.smallkun.cn/markdown/image-20241130010348202.png!compress" alt="image-20241130010348202" style="zoom:50%;" />
的值。要求先将X 的各项系数先输入到数组B 中然后再用循环结构求P(X)的值。
29.猜号码由随机函数产生一个1 至1000 之间的整数,让人猜之。计算机仅回答人猜的数大、小还是相等,当人猜对时,由计算机打印出人一共猜了几次。
30.编程序将一个正整数写成其它两个正整数的平方和若不能成立时输出“NO”。
例如
![image-20241130010437816](https://yp.smallkun.cn/markdown/image-20241130010437816.png!compress)
31.将一个一维数组中的偶数依次交换。例如有8 个元素, 若其中第1、4、5 三元素是偶数时应按下图交换。
<img src="https://yp.smallkun.cn/markdown/image-20241130010458976.png!compress" alt="image-20241130010458976" style="zoom:50%;" />
32.编程序将一个6×6 的二维数组左下三角部分全赋值为-1右上三角全赋值为1主对角线列下标相同上的元素送入2。把数组中的值按列对齐方式输出。
要求: 不允许使用scanf 函数。
33.用随机函数求出10 组三位正整数,每组十个数,调用一函数打印出每组数,并编一函数求出每组中的最大数。
34.已知有三个数组A,B,CA 为5 行5 列的二维数组,B、C 为只有5 个元素的一维数组,键盘输入数据的顺序如下:
23,45,6,1,-3,4,5,233,456,0,3,56,78,-56,5,6,77,8,89,9,3,6,8,9,90
请编写程序求出A 的各行之和放至数组B 的相应元素中求出数组A 的各列之和放至数组C 的相应元素之中。程序的输出部分要按下边形式显示:
![image-20241130010557737](https://yp.smallkun.cn/markdown/image-20241130010557737.png!compress)
35.假设a-1 和a+1 是大于10 的素数,验证<img src="https://yp.smallkun.cn/markdown/image-20241130010624492.png!compress" alt="image-20241130010624492" style="zoom:67%;" /> 可被120 整除。编程序输入a 的值判a-1 和a+1 是否为素数。若不是输出“NOTPRIME!”;若都是素数,再验证<img src="https://yp.smallkun.cn/markdown/image-20241130010624492.png!compress!compress" alt="image-20241130010624492" style="zoom:67%;" />是否可被120 整除。
36.有n 个整数编程序将前面的各个数依次向后移动k 个位置最后k 个数移到最前边的k 个位置见下图其中n=8k=3
<img src="https://yp.smallkun.cn/markdown/image-20241130010716416.png!compress!compress" alt="image-20241130010716416" style="zoom:50%;" />
思考: 程序中不许引入其它数组。
37.将一个数M 分解为质因数M≠0
38.将一个整数最多是10 位数从低位到高位打印出来如该数是12345 时输出应是54321只占一行
39.写一个函数比较两个字符串,如果s1=s2则返回值0如果s1>s2则返回值1如果s1<s2 则返回-1
40.求n!的末尾有多少个零可以通过检查n!含有多少个10 的因数来求它末尾零的个数因为10=2×5在n!中含有2 的因数显然多于含有5 的因数一种求n!中5 的因数的个数的算法如下:
1)输入正整数n;
2)0=>k, n=>m;
3)若m<5转第5 否则执行第4 ;
4)m/5取整=>m, k+m=>k, 转第3 步;
5)输出kn!末尾零的个数)。
41.分别输入N 和M 个数到数组A 和数组B 中。把只在其中一个数组中出现的那些数送入到数组C 中并指出它们在A 或B 数组中的位置。
42.用记录来描述一个学生的成绩情况内容包括姓名、学号、数学成绩和PASCAL成绩。要求对一个小组的10 个学生的成绩进行统计处理:
1)计算学生的总平均分,并按平均分高低排出名次,打印出姓名。
2)打印出90 分以上和不及格者的名字。
要求用子程序来完成。
43.已知M1 是3×5 的矩阵, M2 是5×2 的矩阵, 编程序求出M1 与M2 之积。
44.百马百瓦问题。有100 匹马100 块瓦大马驮3 块小马驮2 块,两个马驹驮1块。问大马、小马、马驹各多少
要求:① 不许用for 循环; ② 循环次数尽量少。
45.找规律填写N×N 方阵。如N=8 时, 其方阵为:
<img src="https://yp.smallkun.cn/markdown/image-20241130011036567.png!compress" alt="image-20241130011036567" style="zoom:50%;" />
46.插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的设手中原有3张牌已排好序抓1 张新牌若这张新牌的次序在原来的第2 张牌之后第3 张牌之前那么就把这张新牌放在第3 张牌的位置上原来的第3 张改为第4 张, 然后再抓新牌。按着这个算法,编写一个排序程序。
注:开始一张牌也没有,从第一张牌开始抓起。
47.求N 阶方阵即N×N 数组中各条反斜线上的元素之和。如4×4 数组共有7 条反斜线:
![image-20241130011108944](https://yp.smallkun.cn/markdown/image-20241130011108944.png!compress)
48.自然数N 一般写成如下形式:
![image-20241130011124712](https://yp.smallkun.cn/markdown/image-20241130011124712.png!compress!compress)
如果<img src="https://yp.smallkun.cn/markdown/image-20241130011207358.png!compress" alt="image-20241130011207358" style="zoom:50%;" />>di (i=k-1,k-2,...,1)则称N 是严格降序数;如果<img src="https://yp.smallkun.cn/markdown/image-20241130011207358.png!compress!compress" alt="image-20241130011207358" style="zoom:50%;" /><di (i=k-1,k-2,...,1)则称N 是严格升序数如果<img src="https://yp.smallkun.cn/markdown/image-20241130011232509.png!compress" alt="image-20241130011232509" style="zoom:50%;" />=di (i=k-1,k-2,...,1)则称N 是等序数此外则称N是无序数。例如 4321 是严格降序数1234 是严格升序数2222 是等序数1243 是无序数。从键盘上输入一个大于9 的整数N判它属于上述哪一类。
49.用简单迭代法解方程 <img src="https://yp.smallkun.cn/markdown/image-20241130011311960.png!compress" alt="image-20241130011311960" style="zoom:50%;" />它有两个根(如图),其迭代公式为:
![image-20241130011327616](https://yp.smallkun.cn/markdown/image-20241130011327616.png!compress!compress)
注:本程序中选取初值<img src="https://yp.smallkun.cn/markdown/image-20241130011341115.png!compress" alt="image-20241130011341115" style="zoom:50%;" /> 不同时要分别使用公式1 或公式2 迭代得原方程0 或0
的解。(公式由来略)
50.洗扑克牌。将54 张牌分别编号为1,2,…,54 号并放在数组M 中。洗牌方法如下:产生[1,54]区间内的一个随机数K将M[1]与M[K]交换;然后产生[2,54]之间的随机整数K让M[2]与M[K]交换;…,直到剩下最后一张牌为止。请编写实现上述洗牌的程序。
51.有N 张牌,计算机和你轮流取牌,每次只能取 1─2 张,谁最后取完谁胜利。编写完成此功能的程序。
要求:
1)让计算机先取。
2)你取的张数由键盘输入。
3)计算机第一次取牌时由键盘输入来确定是取1 还是取2以后它再取牌时由程序
判断来决定取几张牌。
52.已知A 是有30 个元素的整型数组编写一个对A[I1]到A[I2]I1≤I2之间的元素排序的函数从大到小排序。请调用上述函数先将A[5]至A[20]之间的元素排序然后将A中的所有元素值输出。再调用上述函数对A[15]至A[30]之间的元素排序最后再将A 中30 个元素值输出。
要求1) 输入输出均由主函数实现。
2)输出时每10 个元素占1 行。
53.编程序求3 至39 之间满足下列条件的各组素数每组有3 个素数第2 个比第一个大2第3 个比第2 个大4。例如 5,7,11 就是满足条件的一组。
要求1) 不许使用数组。
2)打印满足条件的各组素数。
3)求出满足条件的素数共有多少组。
54.已知N 是正整数, 它可拆写成三个正整数N1、N2和N3 之和的形式N=N1+N2+N3。请编程序打印出满足上式的全部组合并当N1、N2 和N3 中至少有两个是素数时打印“YES”否则打印“NO”。
<img src="https://yp.smallkun.cn/markdown/image-20241130011603125.png!compress" alt="image-20241130011603125" style="zoom:50%;" />
55.编写程序,按照 1,2, ... , 28 的顺序填一个7×7 数组的左上角,程序的输出结果为:
![image-20241130011618828](https://yp.smallkun.cn/markdown/image-20241130011618828.png!compress)
56.二维数组排序。设有4×5 的数组M通过排序使M\[1]\[1]≤M\[1]\[2]≤...≤M\[1]\[5]≤M\[2]\[1]≤M\[2]\[2]≤...≤M\[2]\[5]≤...≤M\[4]\[1]≤M\[4]\[2]≤...≤M\[4]\[5]。排序时不允许引入其它数组。
57.编写将一个十进制数M 转化成N 进制数2≤N≤16的程序。提示转化成N 进制数的各位数可以分别放在数组的各个元素中。
注意进制N 超过10 时, 用A 表示10B 表示11,…F 表示15。
58.在主函数中输入10 个不等长的字符串用另一函数对它们排序。然后在主函数中输出这10 个已排好序的字符串,用指针数组完成。
59.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除,输出最后的链表。
60.有两个链表a和b。设结点中包含学号、姓名。从a链表中删除与b链表中有相同学号的那些结点。