沈阳航空航天大学习题的整理,仅供参考。
注:此贴为沈阳航空航天大学大一习题汇总贴,包括【选择结构】、【单循环结构】、【三种控制结构】、【多重循环】、【数组】、【函数】、【结构体】、【链表、文件】、【程序设计实验】九个部分。内容与之前发布的文章内容相同,请放心食用。
一、程序设计基础A
选择结构
编程题
1.求圆柱体体积
【问题描述】输入圆柱体的底半径及高度,求体积,体积公式为3.14 * r * r * h。
【输入形式】从键盘输入圆柱体底的半径和高度,以回车结束。
【输出形式】圆柱体体积
【样例输入】2.6 3.21
【样例输出】68.14
【样例说明】输出结果保留两位小数
#include<stdio.h>
int main()
{
double r, h, t = 0;
scanf("%lf%lf", &r, &h);
t = 3.14 * r * r * h;
printf("%.2f", t);
return 0;
}
2.找出能够组成的最大三位数
【问题描述】输入三个正整数,这三个整数数值范围在0到9之间,且互不相同,请找出由这三个整数组成的最大三位整数。
【输入形式】输入三个整数,不考虑输入错误的情况,数据之间用单个空格隔开。
【输出形式】输出组成的最大三位整数。
【样例输入】1 2 3
【样例输出】321
#include <stdio.h>
int main()
{
int a, b, c, t;
scanf("%d%d%d", &a, &b, &c);
if (a < b)
{
t = a;
a = b;
b = t;
}
if (b < c)
{
t = b;
b = c;
c = t;
}
if (a < b)
{
t = a;
a = b;
b = t;
}
t = a * 100 + b * 10 + c;
printf("%d", t);
return 0;
}
3.判断闰年
【问题描述】写一程序,从键盘上输入年份year(大于400),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。
【输入形式】输入一个大于400的正整数,以回车结束。
【输出形式】输出判断结果。
【样例输入】2000
【样例输出】2000 is
【样例输入】2015
【样例输出】2015 not
#include<stdio.h>
int main()
{
int year;
scanf("%d", &year);
if ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0))
printf("%d is", year);
else
printf("%d not", year);
return 0;
}
4.比较三个数的大小,并计算三个数的和、积和平均值
【问题描述】编一个程序,从键盘中输入三个整数 a, b, c;比较三个数的大小,然后输出其中最大的数、最小的数、三个数的和、积和平均值。
【输入形式】输入三个整数 a b c
【输出形式】 输出最大数,最小数,三个数的和,三个数的积,平均值。
【样例输入】1 4 2
【样例输出】4 1 7 8 2.33
【样例说明】平均值保留小数点后2位。
#include<stdio.h>
int main()
{
int a, b, c, t, num, ji;
float ave;
scanf("%d%d%d", &a, &b, &c);
if (a < b)
{
t = a;
a = b;
b = t;
}
if (b < c)
{
t = b;
b = c;
c = t;
}
if (a < b)
{
t = a;
a = b;
b = t;
}
num = a + b + c;
ji = a * b * c;
ave = ( a + b + c ) / 3.0;
printf("%d %d %d %d %.2f", a, c, num, ji, ave);
return 0;
}
5.判断水仙花数
【问题描述】判断一个三位正整数是否是水仙花数。水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身,例如153。
【输入形式】输入一个三位正整数 n
【输出形式】输出 n is narcissistic number 或 n is not narcissistic number
【样例输入】153
【样例输出】153 is narcissistic number
【样例输入】100
【样例输出】100 is not narcissistic number
#include<stdio.h>
int main()
{
int a, b, c, n;
scanf("%d", &n);
a = n / 100;
b = n % 100 / 10;
c = n % 10;
if (n == a * a * a + b * b * b + c * c * c)
printf("%d is narcissistic number", n);
else
printf("%d is not narcissistic number", n);
return 0;
}
6.判断一个整数能否被3,7整除
【问题描述】编一个程序,输入一个整数 n,判断它能否被3,7整除;
若能同时被3,7整除则输出 n is divisible by 3 and 7;
能被其中一个数整除输出 n is divisible by 3 or 7;
不能被3,7整除输出 n is not divisible by 3 or 7。
【输入形式】输入正整数 n
【输出形式】 输出提示信息。
【样例输入】2
【样例输出】2 is not divisible by 3 or 7
【样例输入】7
【样例输出】7 is divisible by 3 or 7
【样例输入】105
【样例输出】105 is divisible by 3 and 7
#include<stdio.h>
int main()
{
int a;
scanf("%d", &a);
if (a % 3 == 0)
{
if (a % 7 == 0)
printf("%d is divisible by 3 and 7", a);
else
printf("%d is divisible by 3 or 7", a);
}
else
{
if (a % 7 == 0)
printf("%d is divisible by 3 or 7", a);
else
printf("%d is not divisible by 3 or 7", a);
}
return 0;
}
7.根据年和月的值输出该月的天数
【问题描述】从键盘输入年和月的值,然后输出该月的天数。
【输入形式】<年值><空格><月值>
【输出形式】<天数值>
【样例输入】2012 2
【样例输出】 February 2012 has 29 days
【样例输入】2011 7
【样例输出】July 2011 has 31 days
#include<stdio.h>
int main()
{
int year, month;
scanf("%d %d", &year, &month);
switch (month)
{
case 2:if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
printf("February %d has 29 days\n", year);
else
printf("February %d has 28 days\n", year);
break;
case 1:printf("January %d has 31 days\n", year); break;
case 3:printf("March %d has 31 days\n", year); break;
case 5:printf("May %d has 31 days\n", year); break;
case 7:printf("July %d has 31 days\n", year); break;
case 8:printf("August %d has 31 days\n", year); break;
case 10:printf("October %d has 31 days\n", year); break;
case 12:printf("December %d has 31 days\n", year); break;
case 4:printf("April %d has 30 days\n", year); break;
case 6:printf("June %d has 30 days\n", year); break;
case 9:printf("September %d has 30 days\n", year); break;
case 11:printf("November %d has 30 days\n", year); break;
}
return 0;
}
片段题
1.判断一个整数的正负
【问题描述】判断一个整数的正负。输入1个整数。如果输入的为正,则输出1;如果输入的为负则输出-1;如果输入的为0,则输出0。
【输入形式】1个整数
【输出形式】1个整数
【样例输入】-5
【样例输出】-1
#include <iostream>
#include <stdio.h>
int main()
{
int a, b;
scanf("%d", &a);
if (a < 0)
{
b = -1;
}
else if (a == 0)
{
b = 0;
}
else
{
b = 1;
}
printf("%d", b);
return 0;
}
2.一个简单计算器
【问题描述】一个简单计算器,根据用户输入的操作数和操作类型进行算术运算,最后打印计算结果。
【输入形式】2*2
【输出形式】4.000000
【评分标准】程序每个注释found下面有一个错误,共2处错误,其他内容保持不变,使之功能符合要求。
#include <iostream>
#include<stdio.h>
int main(void)
{
float x, y, z = 0;
/*************found************/
char n;
scanf("%f%c%f", &x, &n, &y);
/*************found************/
switch (n)
{
case '+': z = x + y; break;
case '-': z = x - y; break;
case '*': z = x * y; break;
case '/': z = x / y; break;
}
printf("%f", z);
return 0;
}
3.将输入的小写英文字母修改为大写英文字母
【问题描述】输入1个字符,如果是小写英文字母,则将其修改为大写英文字母,并输出该大写字母;如果是其它字符,则保持不变,原样输出。
【输入形式】1个字符
【输出形式】1个字符
【样例输入】e
【样例输出】E
【样例输入】6
【样例输出】6
#include <iostream>
#include <stdio.h>
int main()
{
char w;
scanf("%c", &w);
if (w >= 'a' && w <= 'z')
w = w - 32;
printf("%c", w);
return 0;
}
4.输入一个五分制的考试成绩输出对应的百分制分数段
【问题描述】输入一个五分制的考试成绩(大写字母A~E),输出对应的百分制分数段。
A对应90~100,
B对应80~89,
C对应70~79,
D对应60~69,
E对应<60,
其它对应error。
【输入形式】1个字符
【输出形式】1个字符串
【样例输入】D
【样例输出】60~69
#include <iostream>
#include <stdio.h>
int main()
{
char grade;
scanf("%c", &grade);
switch (grade)
{
case 'A':printf("90~100"); break;
case 'B':printf("80~89"); break;
case 'C':printf("70~79"); break;
case 'D':printf("60~69"); break;
case 'E':printf("<60"); break;
default:printf("error");
}
return 0;
}
单循环结构
编程题
1.求水仙花数的个数
【问题描述】输出区间[a, b]内所有水仙花数的个数。(水仙花数指一个三位数其各位的立方和等于该数,如:153 = 1 * 1 * 1 + 5 * 5 * 5 + 3 * 3 * 3。)
【输入形式】包含2个正整数a, b(a <= b; 例如:[100, 999])
【输出形式】输出区间[a, b]内的所有水仙花数个数
【样例输入】100 200
【样例输出】1
#include<stdio.h>
int main()
{
int m, n, a, b, c, i = 0;
scanf("%d%d", &m, &n);
while (m <= n)
{
a = m / 100;
b = m % 100 / 10;
c = m % 10;
if (m == a * a * a + b * b * b + c * c * c)
i++;
m++;
}
printf("%d\n", i);
return 0;
}
2.完数判断程序
【问题描述】一个数如果恰好等于它的真因子之和,这个数就称为"完数"。例如,6的真因子有1、2、3,而6=1+2+3,因此6是"完数"。从键盘输入一个正整数m,判断其是否是完数,并按下面格式输出判断结果:
1、m是完数:6=1+2+3
2、m不是完数,真因子之和小于m:4>1+2
2、m不是完数,真因子之和大于m:12<1+2+3+4+6
【输入形式】输入正整数m。
【输出形式】判断m是否为完数并输出可能的结果。
【样例输入】6
【样例输出】6=1+2+3
【样例输入】4
【样例输出】4>1+2
【样例输入】12
【样例输出】12<1+2+3+4+6
#include <stdio.h>
int main()
{
int n, i, sum = 0;
scanf("%d", &n);
for (i = 1; i < n; i++)
{
if (n % i == 0)
sum += i;
}
if (n == sum)
{
printf("%d=1", n);
for (i = 2; i < n; i++)
{
if (n % i == 0)
printf("+%d", i);
}
}
else if (n > sum)
{
printf("%d>1", n);
for (i = 2; i < n; i++)
{
if (n % i == 0)
printf("+%d", i);
}
}
else if (n < sum)
{
printf("%d<1", n);
for (i = 2; i < n; i++)
{
if (n % i == 0)
printf("+%d", i);
}
}
return 0;
}
3.整数反序输出
【问题描述】输入一个正整数m,将该数反序输出,如1234,反序输出为4321。
【输入形式】输入正整数m。
【输出形式】反序输出m。
【样例输入】1234
【样例输出】4321
【样例输入】100
【样例输出】1
#include <stdio.h>
int main()
{
int a, b, sum = 0;
scanf("%d", &a);
b = a;
while (b != 0)
{
sum = sum * 10 + b % 10;
b = b / 10;
}
printf("%d", sum);
return 0;
}
片段题
1..求多项式1+2+3+...+n 的前n项之和
【问题描述】求多项式 1+2+3+...+n 的前n项之和。n值由键盘输入(n不大于100)。
【输入形式】1个整数
【输出形式】1个整数
【样例输入】3
【样例输出】6
#include <iostream>
#include <stdio.h>
int main()
{
int i, n, sum;
sum = 0;//1
scanf("%d", &n);
for (i = 1; i <= n; i++)
sum = sum + i;//2
printf("%d", sum);
return 0;
}
2.某序列求和
【问题描述】从键盘输入正整数 n,编程实现序列 2/1,3/2,5/3,8/5,13/8,21/13 ...... 的前 n 项之和。
【输入形式】输入正整数 n。
【输出形式】输出求和结果,保留小数点后两位。
【样例输入】1
【样例输出】2.00
【样例输入】25
【样例输出】40.75
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
double sum = 0;
scanf("%d", &n);
int i;
double x = 2, y = 1, t;
for (i = 1; i <= n; i++)
{
sum += x / y;
t = x; //把分子的值赋给t
x = y + x; //把x+y的值赋给分母x
y = t; //把t的值赋给分子
}
printf("%.2lf", sum);
return 0;
}
三种控制结构
编程题
1.温度转换
【问题描述】输入一个以摄氏度表示的温度,根据公式转换为华氏度并输出,结果保留小数点后两位。
F=1.8C+32
【输入形式】输入摄氏度以回车结束
【输出形式】输出华氏度
【样例输入】10.5
【样例输出】50.90
#include <stdio.h>
int main()
{
float f, c;
scanf("%f", &c);
f = 1.8 * c + 32;
printf("%.2f", f);
return 0;
}
2.计算天数
【问题描述】输入年、月、日,用程序计算一下该日期是这一年的第几天。
【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。
【输出形式】输出计算的结果
【样例输入】2015 2 1
【样例输出】32
#include <stdio.h>
int main()
{
int y, m, d, t, i;
scanf("%d%d%d", &y, &m, &d);
for (t = 1; t < m; t++)
{
switch (t)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:i += 31; break;
case 4:
case 6:
case 9:
case 11:i += 30; break;
case 2:if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
{
i += 29;
break;
}
else
{
i += 28;
break;
}
}
}
i += d;
printf("%d", i);
return 0;
}
3.沈阳市居民生活用电阶梯电价收费问题
【问题描述】沈阳市居民生活用电已经实行阶梯电价,用户每月耗电第一档电量为180度及以内,每度电0.50元;第二档电量为180度以上至280度,每度电0.55元;第三档电量为280度及以上,每度0.85元。现要求输入某居民用电量,输出其应缴费用,小数点后保留1位。
【输入形式】<非负整数><enter>
【输出形式】<浮点数>
【样例输入】180
【样例输出】90.0
【样例输入】280
【样例输出】145.0
【样例输入】380
【样例输出】230.0
#include <stdio.h>
int main()
{
float a, b;
scanf("%f", &a);
if (a <= 180)
printf("%.1f", b = a * 0.5);
if (a > 180 && a <= 280)
printf("%.1f", b = (a - 180) * 0.55 + 180 * 0.5);
if (a > 280)
printf("%.1f", b = (a - 280) * 0.85 + 100 * 0.55 + 180 * 0.5);
return 0;
}
4.计算战机需要的加油量
【问题描述】不同的战机飞行时平均油耗是不同的,歼十百公里耗油是142升,F16百公里耗油是146升,苏27百公里耗油是312升,现知道飞机型号和所需飞行的公里数,请计算一下,该战机所需的油量是多少?(注:百公里耗油是指一百公里需要的油量)
【输入形式】输入两个数据,第一个整数表示战机的型号,整数1代表歼十,整数2表示F16,整数3表示苏27;第二个实数表示飞机将要飞行的公里数。
【输出形式】输出所需的油量,输出保留两位小数。
【样例输入】2 300
【样例输出】438.00
【样例输入】4 100
【样例输出】error
【样例输入】1 -100
【样例输出】error
【样例说明】程序中实数定义统一用double类型。
#include <stdio.h>
int main()
{
int a;
double b;//a战机//b公里数
scanf("%d%lf", &a, &b);
if (a > 3 || a < 1 || b < 0)
printf("error");
else
{
switch (a)
{
case 1:printf("%.2lf", b / 100 * 142); break;
case 2:printf("%.2lf", b / 100 * 146); break;
case 3:printf("%.2lf", b / 100 * 312); break;
}
}
return 0;
}
5.统计一行字符中不同字符个数
【问题描述】输入一行字符,分别统计其中的英文字母、空格、数字和其它字符的个数。
【输入形式】一行字符,以回车结束
【输出形式】<字母数> <空格数> <数字数> <其它字符数>
【样例输入】hello world 2015!
【样例输出】10 2 4 1
#include<stdio.h>
int main()
{
int c = 0, space = 0, num = 0, other = 0;
char ch;
while ((ch = getchar()) != '\n')
{
if (ch <= 'z' && ch >= 'a' || ch <= 'Z' && ch >= 'A')
{
c++;
}
else if (ch <= '9' && ch >= '0')
{
num++;
}
else if (ch == ' ')
{
space++;
}
else
{
other++;
}
}
printf("%d %d %d %d", c, space, num, other);
return 0;
}
6.电文加密
【问题描述】某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后再除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
【输入形式】输入原码,以回车结束。
【输出形式】输出密文
【样例输入】1234
【样例输出】9876
【样例输入】9876
【样例输出】1234
#include<stdio.h>
int main()
{
int a, ge, shi, bai, qian;
scanf("%d", &a);
ge = ( a % 10 + 5 ) % 10;
shi = ( a / 10 % 10 + 5 ) % 10;
bai = ( a / 100 % 10 + 5 ) % 10;
qian = ( a / 1000 % 10 + 5 ) % 10;
printf("%d", ge * 1000 + shi * 100 + bai * 10 + qian);
return 0;
}
7.统计N以内的完全平方数
【问题描述】统计N(N<100000)以内的完全平方数的个数(一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数,也叫做平方数,比如:0,1,4,9,16,25,36等。)
【输入形式】整数N
【输出形式】个数
【样例输入】25
【样例输出】6
#include<stdio.h>
int main()
{
int N, i, n = 0;
scanf("%d", &N);
for (i = 0; i * i <= N; i++)
n++;
printf("%d", n);
return 0;
}
片段题
1.输出休息或者上班
【问题描述】用户输入一个介于 [0,100] 区间的任意整数a后,程序将a对7进行取模运算后,转换为一个介于 [1,7] 区间的整数b。如果b是6或者是7,则打印“休息”;否则打印“上班”。
【输入形式】1个整数
【输出形式】1个字符串
【样例输入】0
【样例输出】上班
#include <iostream>
#include "stdio.h"
int main()
{
int a, b;
printf("输入介于[0,100]区间的任意整数:");
scanf("%d", &a);
b = a % 7 + 1;
if (b != 6 && b != 7)
printf("上班");
else
printf("休息");
return 0;
}
2.求整数中特定位的数字并输出
【问题描述】输入2个正整数n和k,返回n中从右向左数第k位数字的值。
【输入形式】输入两个正整数,正整数之间用单个空格隔开。
【输出形式】输出一个正整数
【样例输入】231456 3
【样例输出】4
【样例输入】1456 5
【样例输出】0
#include <iostream>
#include <stdio.h>
int main()
{
long n;
int m, k;
int i = 0;
scanf("%ld%d", &n, &k);
while (i < k)
{
m = n % 10;
n = n / 10;
i++;
}
printf("%d", m);
return 0;
}
多重循环
编程题
1.百钱百鸡问题
【问题描述】原始题目:一只公鸡 5 文钱,一只母鸡 3 文钱,三只小鸡 1 文钱,用 100 文钱买 100 只鸡,请问公鸡,母鸡,小鸡各多少只?现要求钱数和要买的鸡的数量由键盘输入,列举出所有可能的购买情况。
【输入形式】输入两个正整数 m 和 c,分别表示准备的钱数和要买的鸡的总量。
【输出形式】输出所有可能的购买情况(每种购买情况占一行,按照公鸡数量递增显示;每行显示顺序为公鸡数量、母鸡数量、小鸡数量;不考虑无解情况)。
【样例输入】100 100
【样例输出】备注:输出时行与行之间无空行。
cock=4 hen=18 chicken=78
cock=8 hen=11 chicken=81
cock=12 hen=4 chicken=84
【样例说明】友情提示:购买方案不会出现 0 只,小鸡数量一定是 3 的倍数。可以用三重循环,但也完全可以用二重循环!
#include<stdio.h>
int main()
{
int m, c, cock, hen, chicken;
scanf("%d%d", &m, &c);
for (cock = 1; cock <= m / 5; cock++)
{
for (hen = 1; hen <= m / 3; hen++)
{
chicken = c - cock - hen;
if (5 * cock + 3 * hen + chicken / 3 == m && chicken % 3 == 0)
printf("cock=%d hen=%d chicken=%d\n", cock, hen, chicken);
}
}
return 0;
}
2.组成三位数问题
【问题描述】1、2、3、4、5组成互不相同且无重复数字的三位数。
【输出形式】输出的三位数按由小到大排序,数据之间用两个空格隔开。
#include<stdio.h>
int main()
{
int g, s, b;
for (b = 1; b <= 5; b++)
for (s = 1; s <= 5; s++)
for (g = 1; g <= 5; g++)
if (b != s && s != g && b != g)
printf("%d ", b * 100 + s * 10 + g);
return 0;
}
3.九九乘法表
【问题描述】输出乘法表。
【输入形式】输入要输出的乘法表行数。
【输出形式】输出相应的乘法表。
【样例输入】3
【样例输出】
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
【样例说明】
1、输入的整数应在1-9之间;
2、输出同一行的两个算式之间用两个空格隔开。
#include<stdio.h>
int main()
{
int i, h, l;
scanf("%d", &h);
for (i = 1; i <= h; i++)
{
for (l = 1; l <= i; l++)
printf("%d*%d=%d ", l, i, i * l);
printf("\n");
}
return 0;
}
4.取任意个红白黑球,共有多少种解决方案?
【问题描述】从3个红球、5个白球和6个黑球中任意取出M个球,其中必须至少有1个红球,输出共有多少种可能方案。
【输入形式】输入整数M
【输出形式】解决方案的数目sum或错误信息”The value of M is wrong!"
【样例输入】8
【样例输出】sum=17
【样例输入】1
【样例输出】sum=1
【样例输入】-2
【样例输出】The value of -2 is wrong!
【样例输入】0
【样例输出】The value of 0 is wrong!
【样例输入】15
【样例输出】The value of 15 is wrong!
#include<stdio.h>
int main()
{
int M, h, b, e, sum = 0;
scanf("%d", &M);
if (M < 1 || M > 14)
printf("The value of %d is wrong!", M);
else
{
for (h = 1; h <= 3; h++)
for (b = 0; b <= 5; b++)
for (e = 0; e <= 6; e++)
if (h + b + e == M)
sum++;
printf("sum=%d", sum);
}
return 0;
}
片段题
1.判断强数
【问题描述】强数(strong number)的意思就是,一个正整数的各位阶乘之和等于它自身。输入任一个正整数,判断它是否是强数,是则输出'y',否则'n'。
【输入形式】一个正整数
【输出形式】y||n
【样例1输入】145
【样例1输出】y
【样例2输入】200
【样例2输出】n
#include <iostream>
#include <stdio.h>
int main()
{
int n, i, p, sum, t;
scanf("%d", &n);
t = n;
while (t != 0)
{
p = t % 10;
for (i = p - 1; i > 1; i--)
p = p * i;
sum += p;
t /= 10;
}
if (n == sum)
printf("y");
else printf("n");
return 0;
}
2.求 [2,n] 区间所有素数之和
【问题描述】输入不小于2的正整数n,求 [2,n] 区间所有素数之和。其中n不大于100。
【输入形式】1个整数
【输出形式】1个整数
【样例输入】5
【样例输出】10
(1)使用sqrt
#include <iostream>
#include <stdio.h>
#include <math.h>
int main()
{
int m, i, k, n, sum = 0;
scanf("%d", &n);
for (m = 2; m <= n; m++)//1
{
k = sqrt((double)m);
for (i = 2; i <= k; i++)
if (m % i == 0)
break;//2
if (i >= k + 1)
sum = sum + m;
}
printf("%d", sum);
return 0;
}
(2)不使用sqrt
#include<stdio.h>
int main()
{
int n, i, k, sum = 0;
scanf("%d", &n);
for (i = 2; i <= n; i++)
{
for (k = 2; k < i; k++)
{
if (i % k == 0)//不是素数
break;
}
if (k == i)//是素数
sum += i;
}
printf("%d", sum);
return 0;
}
数组
编程题
1.求多个学生的平均成绩
【问题描述】一个学习小组有5个人,每个人有三门课(高数、英语和C语言)的考试成绩,求每人的平均成绩。按行输出每个学生的各科成绩及平均成绩。
【输入形式】按高数、英语和C语言课程顺序输入每个学生的成绩。
【输出形式】按行输出每个同学每个同学的每门课成绩及平均成绩。
【样例输入】
95 84 74 60 35
87 67 98 78 69
98 89 78 76 67
【样例输出】
95 87 98 93.33
84 67 89 80.00
74 98 78 83.33
60 78 76 71.33
35 69 67 57.00
【样例说明】输出每个同学信息各占一行,且平均成绩保留两位小数
#include<stdio.h>
int main()
{
int a[3][5], m, n;
float sum;
for (m = 0; m < 3; m++)
for (n = 0; n < 5; n++)
scanf("%d", &a[m][n]);
for (n = 0; n < 5; n++)
{
sum = 0;
for (m = 0; m < 3; m++)
{
printf("%d ", a[m][n]);
sum += a[m][n];
}
printf("%.2f\n", sum / 3);
}
return 0;
}
2.顺序查找
【问题描述】输入一组整数和一个待查数据,在一组整数中查找待查数据是否存在。
【输入形式】输入一个整数n,表示一组整数的个数(个数不会超过50个),输入n个整数,输入一个待查数据。
【输出形式】如果查找成功,返回该数据在数组中的下标;如果查找失败,输出no。
【样例输入】5 34 23 12 14 76 12
【样例输出】2
【样例输入】7 4 2 32 41 47 61 81 90
【样例输出】no
【样例说明】数据之间用空格隔开
#include<stdio.h>
int main()
{
int n, arr[50], i, x;//x查找数
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
scanf("%d", &x);
for (i = 0; i < n; i++)
{
if (x == arr[i])
{
printf("%d", i);
break;
}
if (i == n - 1)
printf("no");
}
return 0;
}
3.数组最大、最小元素与第一个和最后一个元素的对调
【问题描述】输入n个整数,其中n为大于等于2 的正整数。将数组中最大元素与第一个元素对调,最小元素与最后一个元素对调,并输出新数组。
【输入形式】n及n个整数
【输出形式】n个整数
【样例输入】10 1 2 3 4 5 6 7 8 9 10
【样例输出】10 2 3 4 5 6 7 8 9 1
#include<stdio.h>
int main()
{
int n, arr[100], i, s;//a最大下标,m最小下标,s换数
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
int max = arr[0], a = 0;
for (i = 0; i < n; i++)
{
if (arr[i] > max)
{
max = arr[i];
a = i;
}
}
s = arr[0];
arr[0] = arr[a];
arr[a] = s;
int min = arr[0], m = 0;
for (i = 0; i < n; i++)
{
if (arr[i] < min)
{
min = arr[i];
m = i;
}
}
s = arr[n - 1];
arr[n - 1] = arr[m];
arr[m] = s;
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
4.院士名单排序
【问题描述】2019年11月22日,中国科学院、中国工程院公布了2019年两院院士增选结果。共选举产生64名科学院院士和75名工程院院士、20名外籍科学院院士和29名外籍工程院院士。其中来自航空航天领域的新科学院院士有2名,分别是李东旭(女)和祝学军(女)。新工程院院士共8人,分别是曹喜滨、向锦武、肖龙旭、朱广生、魏毅寅、宫声凯、曹建国、李贤玉(女)。请输入某两位院士的汉语拼音,按照字典次序进行排列并输出排列结果。
【输入形式】输入两个院士名字的汉语拼音,中间用空格隔开,不包含空格。
【输出形式】排序后的两个院士的名字的汉语拼音,中间用空格隔开。
【样例输入】lidongxu zhuxuejun
【样例输出】lidongxu zhuxuejun
【样例输入】caoxibin caojianguo
【样例输出】caojianguo caoxibin
(1)使用字符串库函数
#include<stdio.h>
#include<string.h>
int main()
{
char name1[50], name2[50];
scanf("%s %s", name1, name2);
int cmp = strcmp(name1, name2);
if (cmp <= 0)
printf("%s %s", name1, name2);
else
printf("%s %s", name2, name1);
return 0;
}
(2)不使用字符串库函数
#include<stdio.h>
int main()
{
int i, t;
char a[50], b[50];
scanf("%s %s", a, b);
for (i = 0; i < 50; i++)
{
if (a[i] > b[i])
{
t = 1;
break;
}
if (a[i] < b[i])
{
t = 0;
break;
}
}
if (t == 0)
printf("%s %s", a, b);
if (t == 1)
printf("%s %s", b, a);
return 0;
}
5.计算两个二维数组的差
【问题描述】输入两个同为m*n的二维整数数组A和B(m,n<10),计算A-B的差并输出。
【输入形式】m|n|第1个m*n二维数组A|第2个m*n二维数组B
【输出形式】m*n二维数组C
【样例输入】
2
3
1 2 3
4 5 6
-1 -2 -3
-4 -5 -6
【样例输出】
2 4 6
8 10 12
#include<stdio.h>
int main()
{
int m, n;
int a[10][10], b[10][10], c[10][10];
int i, j;
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++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &b[i][j]);
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
c[i][j] = a[i][j] - b[i][j];
printf("%d ", c[i][j]);
}
printf("\n");
}
return 0;
}
6.将数组按照每5个一组分组,求其平均值
【问题描述】输入一个整数的数组,按从前到后次序进行分组,每组包含5个数,剩余不足5个数自成一组。分别对每组数计算其平均值。
【输入形式】首先输入数组个数n,再分别输入n个数组元素,数据之间用空格隔开。数组元素不超过50个。
【输出形式】输出求出的若干个平均值,每个数据之间用空格隔开,平均值用double表示,保留两位小数。
【样例输入】8 7 6 5 1 12 4 5 11
【样例输出】6.20 6.67
#include <stdio.h>
int main()
{
int n, i, j, count;
double sum = 0, avg;
int arr[100];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i += 5)
{
count = 0;
for (j = i; j < i + 5 && j < n; j++)
{
sum += arr[j];
count++;
}
avg = sum / count;
printf("%.2f ", avg);
sum = 0;
}
return 0;
}
7.折半查找
【问题描述】输入一组有序整数和一个待查整数,用折半查找法查找待查数据是否在这有序数中。
【输入形式】输入整数n代表有序数的个数(n不超过50),接着输入n个按升序排列的整数,最后输入一个待查数据。
【输出形式】如果查找成功,返回待查数据在数组中的下标;如果查找失败,输出“no“。
【样例输入】5 3 6 8 9 12 9
【样例输出】3
【样例输入】6 3 6 8 9 12 19 5
【样例输出】no
【样例说明】输入的数据之间用空格隔开
#include<stdio.h>
void zb(int x, int a[], int n)
{
int ji = 0, high = n - 1, low = 0, mid;
while (high >= low)
{
mid = (high + low) / 2;
if (x < a[mid])
high = mid - 1;
else if (x > a[mid])
low = mid + 1;
if (x == a[mid])
{
printf("%d", mid);
ji = 1;
break;
}
}
if (!ji)
printf("no");
}
int main()
{
int n, i, x, a[50];
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
scanf("%d", &x);
zb(x, a, n);
return 0;
}
8.十进制转换为R进制
【问题描述】输入一个十进制整数,将其转换成N进制数(1<N<=16)
【输入形式】一个十进制数 整数N
【输出形式】数字或字母由 (0-9,A,B,C,D,E,F)
【样例输入】300 16
【样例输出】12C
【样例输入】100 2
【样例输出】1100100
#include<stdio.h>
int main()
{
int num, n, i, j, sum = 0;
int s[1000] = { 0 };
scanf("%d%d", &num, &n);
for (i = 0; num != 0; i++)
{
sum = num % n;
num = num / n;
s[i] = sum;
}
for (j = i - 1; j >= 0; j--)
{
if (s[j] >= 10)
printf("%c", s[j] + 55);
else
printf("%d", s[j]);
}
return 0;
}
9.求整数数组组中特定值K出现次数
【问题描述】求整数数组组中特定值出现次数。
【输入形式】输入N个整数,以-1作为结束(-1不记在数组中),然后输入一个整数K,数据以空格隔开
【输出形式】整数K在N个整数中出现的次数C
【样例输入】3 1 1 2 2 3 -1 2
【样例输出】2
【样例输入】3 1 1 2 2 3 -1 0
【样例输出】0
【特殊说明】数组元素个数不超过50个
#include<stdio.h>
int main()
{
int arr[50], K, c = 0, i, N;
for (i = 0; i < 50; i++)
{
scanf("%d", &arr[i]);
if (arr[i] == -1)
break;
}
N = i;
scanf("%d", &K);
for (i = 0; i < N; i++)
if (arr[i] == K)
c++;
printf("%d", c);
return 0;
}
10.把字符串中的小写字符转换为大写字母
【问题描述】输入一段字符存在数组,将其中的小写字母转化为大写字母,最后将转化后的字符串输出。
【输入形式】输入一串字符,一回车作为结束
【输出形式】输出不包含小写字母的字符串,其他字符不变。
【样例输入】aBcdEFg
【样例输出】ABCDEFG
#include<stdio.h>
int main()
{
char c, str[66];
int i;
gets(str);
for (i = 0; (c = str[i]) != '\0'; i++)
{
if (c >= 'a' && c <= 'z')
c -= 32;
str[i] = c;
}
puts(str);
return 0;
}
11.冒泡排序
【问题描述】对数据进行数据排序(冒泡排序),其中数组有10个整数
【输入形式】输入数组
【输出形式】排序好的数组
【样例输入】10 1 2 7 6 8 9 3 4 5
【样例输出】1 2 3 4 5 6 7 8 9 10
#include<stdio.h>
int main()
{
int a[10], i, j, t;
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
for (j = 0; j < 9; j++)
for (i = 0; i < 9 - j; i++)
if (a[i] > a[i + 1])
{
t = a[i + 1];
a[i + 1] = a[i];
a[i] = t;
}
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
12.数组前半部分按升序排列,后半部分按降序排列
【问题描述】输入一串整数,以-1为结束(-1不记在数组中),数组前半部分用按升序排列,后半部分按降序排列。
【输入形式】输入一串整数,以-1为结束
【输出形式】输出排序好的数组
【样例输入】3 5 2 1 21 34 2 1 12 -1
【样例输出】1 2 3 5 21 34 12 2 1
【样例说明】如果数组个数是奇数,则中间的数据两边排序都不参加;数组元素个数不超过50。
#include<stdio.h>
int main()
{
int i, j, n, a[100], t;
for (i = 0; i < 100; i++)
{
scanf("%d", &a[i]);
if (a[i] == -1)
break;
}
n = i;
for (j = 0; j <= n / 2; j++)
for (i = 0; i < n / 2 - 1; i++)
if (a[i] > a[i + 1])
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
for (j = n - 1; j >= n / 2; j--)
for (i = n - 1; i > n / 2 + 1; i--)
if (a[i] > a[i - 1])
{
t = a[i];
a[i] = a[i - 1];
a[i - 1] = t;
}
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}
片段题
1.输入包含3种括号的的字符串,编写算法判断其各对括号是否匹配
【问题描述】输入可能包含'{'、‘}’、'['、']'、'('、')'这6种字符的字符串(不超过20个,不考虑空字符串),如果3种左右括号出现的次数能够匹配——比如出现3个左花括号和3个右花括号,2个左方括号和2个右方括号等,则认为匹配,否则不匹配。只考虑3种括号的匹配,其他字符不予考虑。
【输入形式】<字符串><enter>
【输出形式】matched||unmatched
【样例1输入】123avd{[()]}!@#
【样例1输出】matched
【样例2输入】??@{[(()]}]]]]@??
【样例1输出】unmatched
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#define N 20
int main()
{
char ss[N];
//a[2][3]用来分别存放6种括号的个数,第0行和第1行的第0列分别存放第1种左右括号的个数,第0行和第1行的第1列分别存放第2种左右括号的个数……
int a[2][3] = { 0 };
int i, j;
scanf("%s", ss);
for (i = 0; ss[i] != '\0'; i++)
{
if (ss[i] == '{')
a[0][0]++;
if (ss[i] == '}')
a[1][0]++;
if (ss[i] == '[')
a[0][1]++;
if (ss[i] == ']')
a[1][1]++;
if (ss[i] == '(')
a[0][2]++;
if (ss[i] == ')')
a[1][2]++;
}
int flag = 1;
for (j = 0; j <= 2; j++)
{
if (a[0][j] != a[1][j])
{
flag = 0;
break;
}
}
if (flag == 1)
printf("matched\n");
else printf("unmatched\n");
return 0;
}
2.将任意输入的一串英文字母按字典顺序排序并输出
【问题描述】输入输入一串英文字母,按ASCII顺序排序后输出。
【输入形式】<字符串>
【输出形式】<字符串>
【样例输入】ertSAuqW
【样例输出】ASWeqrtu
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
int main()
{
char s[N], t;
int i, j, SIZE;
gets(s);//注:若该步骤无法运行则改为gets_s(s)
SIZE = strlen(s);
for (i = 1; i < SIZE; i++)
for (j = 0; j < SIZE - 1; j++)
{
if (s[i] < s[j])
{
t = s[i];
s[i] = s[j];
s[j] = t;
}
}
puts(s);
return 0;
}
3.删除字符串中特定字符,并输出
【问题描述】任意输入一串字符s1,以回车键结束;再输入一个字符ch,把s1中所有ch删除,然后输出新字符串。
【输入形式】<字符串> <字符>
【输出形式】<字符串>
【样例输入】abcd*1@?/wdsd
d
【样例输出】abc*1@?/ws
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20
int main()
{
char s1[N], s2[N] = "\0", ch;
int i, j;
gets(s1);//若无法运行则改为gets_s(s1)
fflush(stdin);
ch = getchar();
i = 0; j = 0;
while (s1[i] != '\0')
{
if (s1[i] != ch)
{
s2[j] = s1[i];
j++;
}
i++;
}
puts(s2);
return 0;
}
4.向一个升序整数数组中插入一个整数,使之仍然保持原有序列
【问题描述】任意输入一个保持升序的整数数组a,以-1结束;再输入一个整数x,编写算法将x插入数组a中,使之仍然保持升序,并输出新升序数组。
【输入形式】升序数组 整数x
【输出形式】新升序数组,以空格隔开。
【样例输入】
1 2 3 5 6 -1
4
【样例输出】
1 2 3 4 5 6
【样例说明】数组总长度不超过20。
#include <iostream>
#include <stdio.h>
#define N 20
int main()
{
int a[N], i;
int x, t, j;
int len;
for (i = 0;; i++)
{
scanf("%d", &t);
if (t != -1)
a[i] = t;
else break;
}
len = i;
scanf("%d", &x);
for (i = 0; i < len; i++)
{
if (x <= a[i])
break;
}
for (j = len - 1; j >= i; j--)
{
a[j + 1] = a[j];
}
a[i] = x;
for (i = 0; i < len + 1; i++)
printf("%d ", a[i]);
return 0;
}
填空题
1.评分统计程序
共有8个评委打分,统计时,去掉一个最高分和去掉一个最低分,其余6个分数的平均分即是最后得分,程序最后应显示这个得分,显示精度为1位整数,两位小数,程序如下,请将程序补充完整。
#include"stdio.h"
void main()
{
float x[8] = { 9.2,9.5,9.8,7.4,8.5,9.1,9.3,8.8 };
float aver, max, min;
int i;
for (aver = 0, i = 0; i < 8; i++)
aver += x[i];
max = x[0];
min = max;
for (i = 1; i < 8; i++)
{
if (max < x[i])
max = x[i];
if (min > x[i])
min = x[i];
}
aver = (aver - max - min) / 6;
printf("average=%4.2f\n", aver);
return 0;
}
函数
片段题
1.求三个数的最大公约数
【问题描述】写一函数fun,求三个数的最大公约数。如果输入的数据非法输出-1。
【输入形式】<a> <b> <c>
【输出形式】<最大公约数>
【样例输入】 8 16 32
【样例输出】 8
【样例输入】 -8 16 32
【样例输出】 -1
#include<stdio.h>
#include<iostream>
using namespace std;
int fun2(int x, int y, int z);
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
printf("%d", fun2(a, b, c));
return 0;
}
int fun2(int x, int y, int z)
{
int i, t, num;
if (x > y)
{
t = x; x = y; y = t;
}
if (x > z)
{
t = x; x = z; z = t;
}
if (y > z)
{
t = y; y = z; z = t;
}
if ((x > 0 && y > 0 && z > 0) || (x < 0 && y < 0 && z < 0))
{
for (i = 1; i <= x; i++)
{
if (x % i == 0 && y % i == 0 && z % i == 0)
{
num = i;
}
}
return num;
}
else
return -1;
}
2.判断点的位置
【问题描述】输入一个二维坐标,判断该坐标与圆x2+y2=4的关系。用函数完成坐标与圆之间的关系。坐标的输入及关系结果的输出在主函数完成。
【输入形式】输入二维坐标值,double类型
【输出形式】在圆内输出in,在圆外输出out,在圆上输出on
【样例输入】2 2(数据之间用单个空格隔开)
【样例输出】out
【样例输入】1.25 1.25
【样例输出】in
#include <stdio.h>
#include<iostream>
using namespace std;
//编写判断函数
int judge(double a, double b)
{
if ((a * a + b * b) > 4)
return 1;
if ((a * a + b * b) == 4)
return 2;
if ((a * a + b * b) < 4)
return 3;
}
int main()
{
double x, y;
scanf("%lf%lf", &x, &y);
//函数调用及最终结果输出
if (judge(x, y) == 1)
printf("out");
if (judge(x, y) == 2)
printf("on");
if (judge(x, y) == 3)
printf("in");
return 0;
}
3.编写函数求分段函数
【问题描述】有分段函数:当x<-5时,y=|x|+10; 当-5≤x≤5时,y=x/2;当x>5时,y=2x-10.
编一函数 void fun5(double x) ; 求上述分段函数值,并在主函数中调用。结果保留4位小数。
【输入形式】x值
【输出形式】y值
【样例输入】-10.2
【样例输出】20.2000
#include <stdio.h>
#include<iostream>
using namespace std;
void fun5(double x);
int main()
{
double x;
scanf("%lf", &x);
fun5(x);
return 0;
}
void fun5(double x)
{
double y;
if (x < -5)
{
y = -x + 10;
printf("%.4f", y);
}
if (-5 <= x && x <= 5)
{
y = x / 2;
printf("%.4f", y);
}
if (x > 5)
{
y = 2 * x - 10;
printf("%.4f", y);
}
}
4.奇数求和
【问题描述】从键盘输入两个正整数 m 和 n(m<n),计算 m 到 n(包括 m 和 n)之间的所有奇数的和,输出求和结果。
【输入形式】输入两个正整数 m 和 n。
【输出形式】输出奇数求和结果。
【样例输入】3 12
【样例输出】35(求和过程:3+5+7+9+11=35)
【样例输入】6 15
【样例输出】55
#include <stdio.h>
#include <math.h>
#include<iostream>
using namespace std;
//对大于等于small小于等于big之间所有奇数求和,返回求和结果。
int fun1(int small, int big);
int main()
{
int m, n;
scanf("%d%d", &m, &n);
m = fun1(m, n);
printf("%d", m);
return 0;
}
int fun1(int small, int big)
{
int m = 0;
for (int i = small; i <= big; i++)
if (i % 2 != 0)
m += i;
return m;
}
5.编写函数求小球经过多少米
【问题描述】一个球从m米高度自由落下,每次落地后又反跳回原高度的一半,再落下,再反弹。编写函数fun3, 求它在第 n 次落地时共经过多少米。结果保留4位小数。
【输入形式】<m高度> <n次>
【输出形式】<距离>
【样例输入】10 1
【样例输出】10.0000
【样例输入】10 2
【样例输出】20.0000
【样例输入】100 10
【样例输出】299.6094
#include<stdio.h>
#include<iostream>
using namespace std;
double fun3(double x, int y);
int main()
{
double m;
int n;
scanf("%lf", &m);
scanf("%d", &n);
printf("%.4f", fun3(m, n));
return 0;
}
double fun3(double x, int y)
{
double s = x;
for (int i = 2; i <= y; i++)
{
x /= 2;
s += x * 2;
}
return s;
}
6.验证哥德巴赫猜想
【问题描述】验证哥德巴赫猜想:任一大于2的偶数,可以用两个素数之和表示。
【输入形式】一个大于2的偶数
【输出形式】每行一对素数,小的素数在前,以一个空格隔开,多组用多行表示,不考虑两个素数相等的情况。
【样例输入】10
【样例输出】3 7
【样例输入】20
【样例输出】
3 17
7 13
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//素数判断函数,是素数返回非0值,不是素数返回0。
int isPrime(int n);
int main()
{
int m, i, n;
scanf("%d", &n);
for (i = 2; i < n / 2; i++)
{
//调用素数判断函数输出满足条件的结果进行验证
m = n - i;
if (isPrime(m) && isPrime(i))
{
printf("%d %d\n", i, m);
}
}
return 0;
}
int isPrime(int n)
{
int flag = 1;//假设是素数
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)//不是素数
{
flag = 0;
break;
}
}
return flag;
}
7.编写函数求某正整数m中数字n的个数
【问题描述】在键盘上输入一个正整数m,编一个函数计算该数字中数字n的个数。
【输入形式】<m> <n>
【输出形式】<n的个数>
【样例输入】12222 2
【样例输出】4
【样例输入】12222 -2
【样例输出】0
#include<stdio.h>
#include<iostream>
using namespace std;
int fun1(int x, int y);
int main()
{
int m, n;
scanf("%d%d", &m, &n);
printf("%d", fun1(m, n));
return 0;
}
int fun1(int x, int y)
{
int count = 0;
while (x != 0)
{
if (x % 10 == y)
count++;
x /= 10;
}
return count;
}
8.求3至N之间的所有素数
【问题描述】输入一个大于 3 的正整数 n,打印 3 到该数之间的所有素数,用函数实现判断一个数是否是素数。
【输入形式】输入一个正整数。
【输出形式】输出所有素数。
【样例输入】50
【样例输出】3 5 7 11 13 17 19 23 29 31 37 41 43 47
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
int func(int m);
int main()
{
int i, n;
scanf("%d", &n);
for (i = 3; i < n; i++)
{
if (func(i) == 1)
printf("%d ", i);
}
if (func(n) == 1)
printf("%d", n);
return 0;
}
int func(int m)
{
int i;
if (m <= 1)
return 0;
else if (m == 2)
return 1;
else if (m % 2 == 0)
return 0;
else {
for (i = 3; i * i <= m; i += 2)
{
if (m % i == 0)
return 0;
}
}
return 1;
}
9.谁考了第 k 名
【问题描述】在某一次考试中,假设每个学生的成绩都不相同,从键盘输入 n 个学生的成绩(1<n<100),输入 k (k<n),输出成绩排名第 k 名的学生成绩。
【输入形式】输入正整数 n 和 k,再输入 n 个学生的成绩。
【输出形式】输出成绩排名第 k 名的学生成绩。
【样例输入】
5 2
31 97 60 88 75
【样例输出】88
【样例说明】备注:输入时行与行之间无空行。
#include <stdio.h>
#include <math.h>
#include<iostream>
using namespace std;
//输入n个有效的学生成绩
//找到第k名的成绩并返回
int fun3(int n, int k);
int main()
{
int n, k;
scanf("%d%d", &n, &k);
n = fun3(n, k);
printf("%d", n);
return 0;
}
int fun3(int n, int k)
{
int i, arr[100];
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (int j = 0; j < n - 1; j++)
{
for (i = 0; i < n - j - 1; i++)
{
if (arr[i] < arr[i + 1])
{
int t = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = t;
}
}
}
return arr[k - 1];
}
10.用递归求两个数的最大公约数
【问题描述】用递归方法求两个数的最大公约数。
【输入形式】输入两个正整数,用空格隔开
【输出形式】两个正整数的最大公约数
【样例输入】4 2
【样例输出】2
【评分标准】必须用递归完成
#include<stdio.h>
#include<iostream>
using namespace std;
//添加代码,递归函数求两个数最大公约数
int Gcd(int m, int n)
{
int i = 0;
while (i = m % n)
{
return Gcd(n, i);
}
return n;
}
int main()
{
int m, n, gcd;
scanf("%d%d", &m, &n);
//调用求最大公约数函数
gcd = Gcd(m, n);
printf("%d", gcd);
}
11.求整数中的特定位数字
【问题描述】编写函数int digit(long n,int k),函数返回n中从右边开始的第k为数字的值。
【输入形式】输入两个正整数,正整数之间用单个空格隔开
【输出形式】输出一个正整数
【样例输入】231456 3
【样例输出】4
【样例输入】1456 5
【样例输出】0
#include <stdio.h>
#include<iostream>
using namespace std;
//编写函数体
int digit(long n, int k)
{
long a[100];
for (int i = 0; i < 100; i++)
{
a[i] = n % 10;
n /= 10;
}
return a[k - 1];
}
int main()
{
long n;
int k;
scanf("%ld%d", &n, &k);
//调用函数并输出结果
int a;
a = digit(n, k);
printf("%d", a);
return 0;
}
填空题
1.求最大公约数函数
编写求最大公约数函数gcd:功能是求两数的最大公约数,并返回该数。
main函数中调用该函数,并输出最大公约数。
#include<stdio.h>
int gcd(int m, int n)//求m,n的公约数的函数
{
int r;
r = m;// r 是公约数,初值为 m
while ((m % r != 0) || (n % r != 0))//当 r 不是公约数时,循环直至找到公约数
r--;// r 减小1
return r;
}
int main()
{
int m, n;
printf("请输入两个数");
scanf("%d%d", &m, &n);
printf("最大公约数%d\n", gcd(m, n));//调用gcd函数
return 0;
}
2.完数判断
一个正整数如果恰好等于它的除自身外的因数之和,这个数称为“完数”。
例如,6的因数有1、2、3,且6=1+2+3,因此6是“完数”。
编写判别完数的函数wanshu(int x):功能判断x是否为完数,如果是,则返回1,不是,则返回0。
编写main()中让x从1循环至1000,并调wanshu函数,如果返回值为1,则输出该数。
#include <stdio.h>
int wanshu(int x)
{
int i, r = 0;
for (i = 1; i < x; i++)
{
if (x % i == 0)//判断x能整除i? 即判断i是否是x的因数
r = r + i;//将因数累加进r中
}
if (r == x)//判断因数和是否等于x,是则返回1,不是,返回0
return 1;
else
return 0;
}
int main()
{
int i;
for (i = 1; i <= 1000; i++)
{
if (wanshu(i) == 1) //调用wanshu函数,根据函数值,判断i是否为完数,
printf("%d是完数\n", i);
}
return 0;
}
结构体
编程题
1.生日相同问题
【问题描述】
在一个有n个学生的大班级中,存在两个学生生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。(只有一组生日相同的情况,不存在多组)
【输入形式】
第1行为正整数n,表示有n个学生,n≦100。
此后n行,每行包含一个字符串和两个正整数,分别表示学生的名字(名字中不含空格,且长度小于20)和出生月m、出生日d,1≦m≦12,1≦d≦31,名字、月、日之间用一个空格分隔。
【输出形式】
每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对生日相同的名字,按输入顺序输出。如果没有生日相同的学生,输出“None”。
【样例输入】
6
Avril 3 2
Candy 4 4
Tim 3 2
Sufia 4 5
Lagrange 4 7
Bill 3 2
【样例输出】
3 2 Avril Tim Bill
#include<stdio.h>
#include<string.h>
struct stu
{
char name[20];
int m, d;
};
int main()
{
int n, i, j;
scanf("%d", &n);
stu s[100] = { 0 };
for (i = 0; i < n; i++)
{
scanf("%s %d %d", s[i].name, &s[i].m, &s[i].d);
}
int flag = 0;
int m = 0;
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (s[i].m == s[j].m && s[i].d == s[j].d)
{
if (flag == 0)
{
printf("%d %d %s %s ", s[i].m, s[i].d, s[i].name, s[j].name);
flag = 1;
strcpy(s[j].name, " ");
}
else
{
printf("%s ", s[j].name);
strcpy(s[j].name, " ");
}
}
}
printf("\n");
}
if (!flag)
printf("None");
return 0;
}
2.某班劳动之星选举程序
【问题描述】某班劳动之星选举程序
某班学生信息包括以下几项:学号、姓名和性别。定义一个结构体数组来保存学生信息,从键盘输入学生数 n 和 n 个学生的数据;再输入一组投票数据:学生的学号,非正数代表输入结束。输出得票数最高的学生信息,同票的要全部输出(最多两人同票),各占一行。
【输入形式】输入学生数 n 和 n 个学生的数据;再输入一组投票数据:学生的学号。
【输出形式】输出得票数最高的学生信息。
【样例输入】
3
101 jhko F
102 it99 M
103 oiug M
101 101 101 101 103 103 102 101 0
【样例输出】
101 jhko F
【样例输入】
4
5 K F
6 T F
8 A M
9 V M
5 6 8 9 8 8 5 5 -1
【样例输出】
5 K F
8 A M
【样例说明】提示:n 个学生按照得票数进行降序排序后再输出满足条件的学生信息。不定义结构体数组0分。
#include <stdio.h>
// 定义学生结构体
typedef struct
{
int id;
char name[20];
char gender;
} Student;
int main()
{
int n, vote;
scanf("%d", &n);
// 创建并初始化学生信息数组
Student students[100];
for (int i = 0; i < n; ++i)
{
scanf("%d %s %c", &students[i].id, students[i].name, &students[i].gender);
}
// 初始化投票计数器
int votes[100];
for (int i = 0; i < n; ++i)
{
votes[i] = 0;
}
// 输入投票数据并统计票数
while (1)
{
scanf("%d", &vote);
if (vote <= 0)
{
break;
}
for (int i = 0; i < n; ++i)
{
if (students[i].id == vote)
{
votes[i]++;
break;
}
}
}
// 找出得票最多的学号及其票数
int max_votes = 0, max_count = 0;
for (int i = 0; i < n; ++i)
{
if (votes[i] > max_votes)
{
max_votes = votes[i];
max_count = 1;
} else if (votes[i] == max_votes)
{
max_count++;
}
}
// 输出得票最多的学生信息
for (int i = 0; i < n; ++i)
{
if (votes[i] == max_votes)
{
printf("%d %s %c\n", students[i].id, students[i].name, students[i].gender);
}
}
return 0;
}
3.谁的年龄是居中年龄
【问题描述】设有n个人的姓名和年龄存在数组中,输出这些人年龄居中的年龄,和同年龄的所有人姓名(如多人,姓名按字母顺序排序),如偶数算中间两人平均值,没有相同年龄则输出error。
【输入形式】人数 姓名 年龄
【输出形式】年龄 姓名
【样例输入】
5
Ewry 32
Jdkfg 54
Dfhsj 20
Kvirk 32
Sgkf 53
【样例输出】32 Ewry Kvirk
#include<stdio.h>
#include<stdlib.h>
struct man
{
char name[50];
int age;
};
struct man s[10];
int main() {
int n, i, j;
int arr[10] = { 0 };
int a = 1, f1 = 0, f2 = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s %d", s[i].name, &s[i].age);
arr[i] = s[i].age;
}
int t;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (arr[j] < arr[j + 1])
{
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
if (n % 2 != 0 && n != 1)
{
printf("%d ", arr[(n - 1) / 2]);
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (s[i].age == s[j].age)
{
f1 = 1;
printf("%s %s", s[i].name, s[j].name);
}
}
}
if (f1 == 0)
{
for (i = 0; i < n; i++)
{
if (s[i].age == arr[(n - 1) / 2])
{
printf("%s", s[i].name);
a = 0;
}
}
if (a)printf("error");
}
}
if (n == 1)
{
printf("error");
}
if (n % 2 == 0)
{
a = (arr[n / 2 - 1] + arr[n / 2]) / 2;
printf("%d ", a);
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (s[i].age == s[j].age)
{
f2 = 1;
printf("%s %s", s[i].name, s[j].name);
}
}
}
if (f2 == 0)
printf("error");
}
return 0;
}
4.奖金计算
【问题描述】
单位根据员工的销售成绩计算发给员工的奖金,A商品(单价100元)销售到达200以上,奖励总销售额的10%,200到100之间奖励总销售额的5%,100以下无奖励;B商品销售到达200以上,奖励2000元,200到100之间奖励1000,100以下奖励500;请计算给出每个员工获得的奖金数目。
【输入形式】姓名 A数量 B数量
当输入姓名为"#"时表示输入结束。
【输出形式】姓名 奖金
【样例输入】
zs 320 270
lis 207 388
we 188 46
ss 34 300
sd 56 170
# 0 0 0
【样例输出】
zs 5200
lis 4070
we 1440
ss 2000
sd 1000
#include<stdio.h>
#include<math.h>
#include<string.h>
struct
{
char name[50];
char s[50];
int m;
long a, b;
}q[50];
int main()
{
int i, j = 0;
char x[2] = { '#','\0' };
for (i = 0;; i++)
{
scanf("%s %ld %ld\n", q[i].name, &q[i].a, &q[i].b);
if (strcmp(q[i].name, x) == 0)
break;
j++;
}
for (i = 0; i < j; i++)
{
if (q[i].a > 200 && q[i].b > 200)
q[i].m = q[i].a * 100 * 0.1 + 2000;
if (q[i].a > 200 && q[i].b >= 100 && q[i].b <= 200)
q[i].m = q[i].a * 100 * 0.1 + 1000;
if (q[i].a > 200 && q[i].b < 100)
q[i].m = q[i].a * 100 * 0.1 + 500;
if (q[i].a >= 100 && q[i].a <= 200 && q[i].b > 200)
q[i].m = q[i].a * 100 * 0.05 + 2000;
if (q[i].a >= 100 && q[i].a <= 200 && q[i].b >= 100 && q[i].b <= 200)
q[i].m = q[i].a * 100 * 0.05 + 1000;
if (q[i].a >= 100 && q[i].a <= 200 && q[i].b < 100)
q[i].m = q[i].a * 100 * 0.05 + 500;
if (q[i].a < 100 && q[i].b>200)
q[i].m = 2000;
if (q[i].a < 100 && q[i].b >= 100 && q[i].b <= 200)
q[i].m = 1000;
if (q[i].a < 100 && q[i].b < 100)
q[i].m = 500;
printf("%s %ld\n", q[i].name, q[i].m);
}
return 0;
}
5.ACM比赛排名
【问题描述】ACM网络编程擂台赛比赛完后需要产生一个最终排名,排名按照完成题数多少来决定。但是有太多的队伍参与,手动计算排名已经不能满足比赛的需求。现在有一份名单记录各个队伍的ID和做出的题目数,需要你写一个程序,产生最终的排名。
为了简化题目,这里的排名规则为:做出题目数量多的队伍排在前面,假设所有队伍完成的题目数量都不同。
【输入形式】第一行有一个正整数N(0<N<100),表示队伍数量。接下来N 行包含两个整数,分别为队伍的编号,和该队做出的题数。
【输出形式】每组数据输出包含N行,第i行有两个整数,ID和M表示排在第i位的队伍的ID和做出的题数。
【样例输入】
8
1 3
16 5
11 2
20 4
3 8
26 7
7 1
22 6
【样例输出】
3 8
26 7
22 6
16 5
20 4
1 3
11 2
7 1
#include <stdio.h>
#include <cstdlib>
// 定义结构体来存储队伍信息
typedef struct
{
int id;
int solved;
} Team;
// 比较函数,用于排序时比较两个队伍的完成题数
int compare(const void* a, const void* b)
{
Team* team1 = (Team*)a;
Team* team2 = (Team*)b;
return team2->solved - team1->solved; // 降序排列(题目数量多的队伍排在前面)
}
int main()
{
int n, i;
scanf("%d", &n);
// 创建并初始化队伍数组
Team teams[n];
for (i = 0; i < n; i++)
{
scanf("%d %d", &teams[i].id, &teams[i].solved);
}
// 对队伍进行排序
qsort(teams, n, sizeof(Team), compare);
// 输出结果
for (i = 0; i < n; i++)
{
printf("%d %d\n", teams[i].id, teams[i].solved);
}
return 0;
}
6.销售记录排序
【问题描述】现有若干条销售记录,每个产品的销售记录由产品代码(整型),产品名称(字符型十位),单价(整型),数量(整型),金额(整型)五部分组成,其中:前四部分直接输入,而金额使用公式计算得出,即,金额=单价*数量。
要求:读取销售记录,使用结构体数组进行保存,编写计算金额函数,计算每条销售记录的金额,最后对销售记录按金额从小到大进行排序输出。
【输入形式】输入第一行为产品个数n(n<10),以下n行为销售记录,包括产品代码(整型),产品名称(字符型十位),单价(整型),数量(整型)
【输出形式】输出排好的销售记录,包括所有信息。
【样例输入】
8
1010 PVS1966-A1 580 22
1011 PVS1966-A2 281 95
1012 AA-LG65M-A 494 51
1013 AA-PV45M-A 128 56
1014 AA-PV45P-A 998 5
1015 AA-PV70M-A 407 29
1016 AA-PV36P-B 786 19
1017 AA-PV36P-A 149 192
【样例输出】
1014 AA-PV45P-A 998 5 4990
1013 AA-PV45M-A 128 56 7168
1015 AA-PV70M-A 407 29 11803
1010 PVS1966-A1 580 22 12760
1016 AA-PV36P-B 786 19 14934
1012 AA-LG65M-A 494 51 25194
1011 PVS1966-A2 281 95 26695
1017 AA-PV36P-A 149 192 28608
#include <stdio.h>
#include <stdlib.h>
// 定义结构体来存储销售记录信息
typedef struct
{
int code;
char name[11];
int price;
int quantity;
int amount;
} SaleRecord;
// 计算金额函数
void calculate_amount(SaleRecord* record)
{
record->amount = record->price * record->quantity;
}
// 比较函数,用于排序时比较两个销售记录的金额
int compare(const void* a, const void* b)
{
SaleRecord* sale1 = (SaleRecord*)a;
SaleRecord* sale2 = (SaleRecord*)b;
return sale1->amount - sale2->amount; // 升序排列(金额小的排在前面)
}
int main()
{
int n, i;
scanf("%d", &n);
// 创建并初始化销售记录数组
SaleRecord sales[100];
for (i = 0; i < n; i++)
{
scanf("%d %s %d %d", &sales[i].code, sales[i].name, &sales[i].price, &sales[i].quantity);
calculate_amount(&sales[i]);
}
// 对销售记录进行排序
qsort(sales, n, sizeof(SaleRecord), compare);
// 输出结果
for (i = 0; i < n; i++)
{
printf("%d %s %d %d %d\n", sales[i].code, sales[i].name, sales[i].price, sales[i].quantity, sales[i].amount);
}
return 0;
}
7.找出年龄最小的学生(结构体嵌套定义实现)
【问题描述】输入6名同学信息,同学信息包括,学号,姓名,生日(年,月,日),生日信息用一个独立的结构体表示。找出年龄最小的同学,并输出该同学的所有信息。
【输入形式】输入6名同学的信息,每个同学占一行,行内信息用空格隔开。
【输出形式】输出年龄最小的同学所有信息
【样例输入】一个同学一行,一行内每个同学的信息用单个空格隔开
11001 zhangxiao 1989 12 1
11002 wangman 1990 2 4
11003 liyu 1987 6 1
11004 shencheng 1989 12 3
11005 mengtao 1992 2 3
11006 huafeng 1992 2 5
【样例输出】输出信息之间用单个空格隔开
11006 huafeng 1992 2 5
#include<stdio.h>
struct birthday
{
int year, month, day;
};
struct student
{
int n, age;
char name[50];
struct birthday b;
}; struct student n[10];
int main()
{
int i, j;
struct student s;
for (i = 0; i < 6; i++)
{
scanf("%d %s %d %d %d\n", &n[i].n, n[i].name, &n[i].b.year, &n[i].b.month, &n[i].b.day);
}
struct student age[10] = { 0 };
for (i = 0; i < 6 - 1; i++)
{
for (j = 0; j < 6 - 1 - i; j++)
{
if (n[j].b.year > n[j + 1].b.year)
{
s = n[j]; n[j] = n[j + 1]; n[j + 1] = s;
}
}
}
for (i = 0; i < 6 - 1; i++)
{
for (j = 0; j < 6 - 1 - i; j++)
{
if (n[j].b.month > n[j + 1].b.month && n[j].b.year == n[j + 1].b.year)
{
s = n[j]; n[j] = n[j + 1]; n[j + 1] = s;
}
}
}
for (i = 0; i < 6 - 1; i++)
{
for (j = 0; j < 6 - 1 - i; j++)
{
if (n[j].b.month == n[j + 1].b.month && n[j].b.day > n[j + 1].b.day && n[j].b.year == n[j + 1].b.year)
{
s = n[j]; n[j] = n[j + 1]; n[j + 1] = s;
}
}
}
printf("%d %s %d %d %d", n[5].n, n[5].name, n[5].b.year, n[5].b.month, n[5].b.day);
return 0;
}
片段题
1.求解两点间距离
【问题描述】求解平面直角坐标系下两点间的距离,要求用结构体存储点信息。
【输入形式】输入两个点坐标。
【输出形式】输出两点间的距离。
【样例输入】2.3 2.1 5.6 1.2(首先输入第一个点的横坐标和纵坐标,然后再输入第二个点的信息,数据之间用单个空格隔开)
【样例输出】3.42(输出两点间的距离保留2位小数)
#include <iostream>
#include <stdio.h>
#include <math.h>
struct point
{
double x, y;
};
//定义距离计算函数
double distance(struct point p1, struct point p2)
{
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
int main()
{
point p1, p2;
double dis;
//输入两点坐标
scanf("%lf %lf", &p1.x, &p1.y); scanf("%lf %lf", &p2.x, &p2.y);
//调用距离计算函数
dis = distance(p1, p2);
printf("%.2lf", dis);
return 0;
}
2.根据年月日计算天数
【问题描述】定义一个结构体变量(包括年、月、日),输入一个日期,计算在本年中是第几天,注意闰年问题。
(闰年判断方法是:1、能被4整除,但不能被100整除;2、能被400整除。这两个条件有一个能满足就说明该年是闰年)
【输入形式】年<空格>月<空格>日,数据之间用单个空格隔开
【输出形式】天数
【样例输入】2015 3 18
【样例输出】77
【样例输入】2000 3 18
【样例输出】78
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
struct date
{
int year, month, day;
};
int count(struct date d)
{
int sum = 0;
int isLeap = (d.year % 4 == 0 && d.year % 100 != 0) || (d.year % 400 == 0);
// 闰年的天数数组
int leapDays[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
// 非闰年的天数数组
int normalDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
for (int i = 0; i < d.month - 1; ++i)
{
if (isLeap)
{
sum += leapDays[i];
}
else
{
sum += normalDays[i];
}
}
sum += d.day;
return sum;
}
int main()
{
struct date d;
scanf("%d %d %d", &d.year, &d.month, &d.day);
printf("%d", count(d));
return 0;
}
3.投票竞选班长程序
【问题描述】某班级选班长,有3个候选人,分别是li, liu, sun ,多名同学参加投票,输入end结束(输入字符串不能包含空格),统计每个人的得票数。
【样例输入】li li liu liu liu sun end
【样例输出】li:2 liu:3 sun:1
#include<stdio.h>
#include<string.h>
int main()
{
struct person
{
char name[20];
int count;
} leader[3] = { "li",0,"liu",0,"sun",0 };
int i, j;
char leader_name[20];
while (1)
{
scanf("%s", leader_name);
if (strcmp(leader_name, "end") == 0)
break;
for (i = 0; i < 3; i++)
{
if (strcmp(leader[i].name, leader_name) == 0)
{
leader[i].count++;
break;
}
}
}
for (i = 0; i < 3; i++)
printf("%s:%d ", leader[i].name, leader[i].count);
return 0;
}
4.查找 QQ 群不活跃成员
【问题描述】声明日期结构体类型,包括年、月两项;声明 QQ 群结构体类型,包括QQ号(建议声明为字符串),群昵称和最后说话时间三项,其中最后说话时间应声明为日期结构体类型。输入群成员和待比较日期,输出和待比较日期相比大于等于 6 个月不说话的所有群成员。
【输入形式】输入所有群成员,最后说话时间中的月份值非法代表输入结束;再输入待比较日期。
【输出形式】输出和待比较日期相比大于等于 6 个月不说话的所有群成员。
【样例输入】
853216595 ki999 2018 4
12378568 888 2018 3
51236985 k 2017 2
1085126957 sd 2018 4
1075125698 scsb 2017 5
567852 lgsb 2019 14
2018 5
【样例输出】
51236985 k 2017 2
1075125698 scsb 2017 5
【样例输入】
536589 uijh 2018 5
7856231 kjh 2017 10
78561236 jh 2018 3
51236985 k 2017 12
1085126957 sd 2018 4
1075125698 scsb 2018 -5
2018 5
【样例输出】
7856231 kjh 2017 10
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
//声明日期和群结构体类型(需补充代码3-1)
struct date
{
int year, month;
};
struct qun
{
char num[15];
char name[20];
struct date xda;
};
//输入所有群成员,将实际输入的成员数作为返回值返回
int input_data(struct qun quns[]);
//计算日期差函数,返回差了几个月,da1(2015-11)较旧,da2(2018-2)较新
//若 da1(2017-11),da2(2017-12),则函数应返回 1
int cha(struct date da1, struct date da2);
//输出比较后满足要求的数据
void output_data(struct qun quns[], struct date da, int n);
int main()
{
struct qun xquns[50];
struct date xda;
int n;
n = input_data(xquns);
//一行代码:读取待比较日期数据(需补充代码3-2)
scanf("%d %d", &xda.year, &xda.month);
output_data(xquns, xda, n);
return 0;
}
//实现自定义函数(需补充代码3-3)
int input_data(struct qun quns[])
{
int i;
for (i = 0; ; i++)
{
scanf("%s %s %d %d", quns[i].num, quns[i].name, &quns[i].xda.year, &quns[i].xda.month);
if ((quns[i].xda.month < 1) || (quns[i].xda.month > 12))
break;
}
return i;
}
int cha(struct date da1, struct date da2)
{
int i;
if (da1.year <= da2.year)
{
if (da1.month > da2.month)
i = (da2.year - da1.year) * 12 - (da1.month - da2.month);
else
i = (da2.year - da1.year) * 12 + (da2.month - da1.month);
}
else
{
if (da1.month > da2.month)
i = (da1.year - da2.year) * 12 + (da1.month - da2.month);
else
i = (da1.year - da2.year) * 12 - (da2.month - da1.month);
}
if (i < 6)
return 1;
else return 0;
}
void output_data(struct qun xquns[], struct date xda, int n)
{
int i, j;
for (i = 0; i < n; i++)
{
j = cha(xquns[i].xda, xda);
if (j == 0)
printf("%s %s %d %d\n", xquns[i].num, xquns[i].name, xquns[i].xda.year, xquns[i].xda.month);
}
}
链表、文件
编程题
1.向有序链表中插入数据并输出最大和最小值
【问题描述】输入若干按升序排列的整数,建立单向链表,后输入一个整数,把该数按原顺序插入到原链表,输出新链表中数据的最大值和最小值并输出链表中所有数据。必须用链表完成,程序中不允许有数组出现。
【输入形式】输入若干按升序排列的整数以0作为结束,和待插入的整数。用单个空格隔开。
【输出形式】输出最大值和最小值及链表中的所有数据,数据之间用单个空格隔开。
【样例输入】1 3 4 5 6 7 8 0 2
【样例输出】8 1 1 2 3 4 5 6 7 8
【样例说明】
【评分标准】链表用完后空间要释放!
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
} Node;
Node* createNode(int data)
{
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL)
{
printf("Memory allocation failed.\n");
exit(0);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
void insertNode(Node** head, int data)
{
Node* newNode = createNode(data);
if (*head == NULL || (*head)->data >= data)
{
newNode->next = *head;
*head = newNode;
}
else
{
Node* current = *head;
while (current->next != NULL && current->next->data < data)
{
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}
void printList(Node* head)
{
Node* temp = head;
while (temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
}
int main()
{
Node* head = NULL;
int num;
while (scanf("%d", &num) == 1 && num != 0)
{
insertNode(&head, num);
}
scanf("%d", &num);
insertNode(&head, num);
Node* temp = head;
int max = temp->data, min = temp->data;
while (temp != NULL)
{
if (temp->data > max)
{
max = temp->data;
}
if (temp->data < min)
{
min = temp->data;
}
temp = temp->next;
}
printf("%d %d ", max, min);
printList(head);
return 0;
}
2.输出单链表倒数第K个结点值
【问题描述】输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个结点。
【输入形式】输入第一位为K值,其后接一串以空格分隔的整型值,用-1表示结束。
【输出形式】输出为倒数第K个结点的值,若无,则输出Not Found。
【样例输入】3 13 45 54 32 1 4 98 2 -1
【样例输出】4
【样例说明】K值为3,则输出链表倒数第3个结点的值为4。
【样例输入】5 13 4 -1
【样例输出】Not Found
【样例说明】K值为5,不存在倒数第5个结点,因此输出Not Found。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
} Node;
Node* createNode(int data)
{
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL)
{
printf("Memory allocation failed.\n");
exit(0);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
Node* insertNode(Node* head, int data)
{
Node* newNode = createNode(data);
if (head == NULL)
{
head = newNode;
}
else {
Node* temp = head;
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = newNode;
}
return head;
}
int findKthFromLast(Node* head, int k)
{
if (head == NULL || k <= 0)
{
printf("Not Found\n");
return -1;
}
Node* first = head;
Node* second = head;
for (int i = 0; i < k - 1 && second != NULL; i++)
{
second = second->next;
}
if (second == NULL)
{
printf("Not Found\n");
return -1;
}
while (second->next != NULL)
{
first = first->next;
second = second->next;
}
return first->data;
}
int main()
{
Node* head = NULL;
int k, data;
scanf("%d", &k);
while (1)
{
scanf("%d", &data);
if (data == -1)
{
break;
}
head = insertNode(head, data);
}
int result = findKthFromLast(head, k);
if (result != -1)
{
printf("%d\n", result);
}
return 0;
}
3.对文件中存储的学生成绩进行统计
【问题描述】每个学生有包括学号、班级、姓名、成绩,从文件1.txt输入以上数据。
计算每个班级的平均成绩,以及所有学生的总平均成绩,计算90分以上,89-80分,79-70分,69-60分,60分以下的人数。将这些信息写入文件"2.txt"中。
【输入形式】从文件1.txt中读入学生信息
【输出形式】把统计好的成绩信息输出的2.txt文件中。
【样例输入】文件1.txt中内容,每位同学信息占一行,行内信息以单个空格分隔。
110 class1 li 90
120 class1 wang 60
130 class2 chen 75
140 class1 ma 80
150 class2 wei 65
【样例输出】文件2.txt中内容无空格,所有值取整数。第一行总平均成绩,以下各行为每个班的平均成绩,然后是全部学生中,90分以上人数,89-80人数,79-70人数,69-60人数,60分以下人数。
all ave 74
class1 ave 76
class2 ave 70
90 Above:1
89-80:1
79-70:1
69-60:2
60 Under:0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int id;
char class_name[20];
char name[20];
int score;
} Student;
int main()
{
FILE* fp1, * fp2;
fp1 = fopen("1.txt", "r");
fp2 = fopen("2.txt", "w");
if (fp1 == NULL || fp2 == NULL)
{
printf("File opening error!\n");
return 1;
}
const int classMax = 10;
int total_sum = 0, total_count = 0;
int class_count[classMax] = { 0 };
int class_sum[classMax] = { 0 };
int grade_count[6] = { 0 };
Student student;
while (fscanf(fp1, "%d %s %s %d", &student.id, student.class_name, student.name, &student.score) != EOF)
{
total_sum += student.score;
total_count++;
int class_index = atoi(student.class_name + strlen(student.class_name) - 1) - 1;
class_count[class_index]++;
class_sum[class_index] += student.score;
if (student.score >= 90)
{
grade_count[0]++;
}
else if (student.score >= 80)
{
grade_count[1]++;
}
else if (student.score >= 70)
{
grade_count[2]++;
}
else if (student.score >= 60)
{
grade_count[3]++;
}
else
{
grade_count[4]++;
}
}
fclose(fp1);
fprintf(fp2, "all ave %d\n", total_sum / total_count);
if (class_count[4] > 0)
{
fprintf(fp2, "class5 ave %d\n", class_sum[4] / class_count[4]);
}
for (int i = 0; i < 4; i++)
{
if (class_count[i] > 0)
{
fprintf(fp2, "class%d ave %d\n", i + 1, class_sum[i] / class_count[i]);
}
}
fprintf(fp2, "90 Above:%d\n", grade_count[0]);
fprintf(fp2, "89-80:%d\n", grade_count[1]);
fprintf(fp2, "79-70:%d\n", grade_count[2]);
fprintf(fp2, "69-60:%d\n", grade_count[3]);
fprintf(fp2, "60 Under:%d\n", grade_count[4]);
fclose(fp2);
return 0;
}
4.按要求对两个文件合并
【问题描述】编一个程序,合并两个已按递增排序的整数文件成一个按递增排序文件。
【输入形式】输入两个文件,文件名分别为1.txt和2.txt,在两个文件中分别输入已经排好序的整数,整数之间用单个空格隔开
【输出形式】输出按递增排好序的文件3.txt,输出文件中的整数用单个空格分隔
【样例输入】1.txt中内容为:1 3 4 5;2.txt中内容为:6 7 8
【样例输出】3.txt中内容为:1 3 4 5 6 7 8
【样例输入】1.txt中内容为:1 3 5;2.txt中内容为:2 4 6
【样例输出】3.txt中内容为:1 2 3 4 5 6
#include<stdio.h>
#include<stdlib.h>
void mergeFiles(const char* fileName1, const char* fileName2, const char* outputFileName)
{
FILE* file1 = fopen(fileName1, "r");
FILE* file2 = fopen(fileName2, "r");
FILE* outputFile = fopen(outputFileName, "w");
if (file1 == NULL || file2 == NULL || outputFile == NULL)
{
printf("Failed to open files\n");
return;
}
int num1, num2;
int readFromFile1 = fscanf(file1, "%d", &num1);
int readFromFile2 = fscanf(file2, "%d", &num2);
while (readFromFile1 == 1 && readFromFile2 == 1)
{
if (num1 <= num2)
{
fprintf(outputFile, "%d ", num1);
readFromFile1 = fscanf(file1, "%d", &num1);
}
else
{
fprintf(outputFile, "%d ", num2);
readFromFile2 = fscanf(file2, "%d", &num2);
}
}
while (readFromFile1 == 1)
{
fprintf(outputFile, "%d ", num1);
readFromFile1 = fscanf(file1, "%d", &num1);
}
while (readFromFile2 == 1)
{
fprintf(outputFile, "%d ", num2);
readFromFile2 = fscanf(file2, "%d", &num2);
}
fclose(file1);
fclose(file2);
fclose(outputFile);
}
int main()
{
mergeFiles("1.txt", "2.txt", "3.txt");
return 0;
}
片段题
1.(指针做参数的函数定义)查找数组下标
【问题描述】从键盘输入数组元素数量 n 以及这 n 个元素;再输入 2 个数,找到这2个数在数组中的位置,即数组下标。若某个数在数组中不存在,输出 -1,注意若数组中存在多个待查找的数,要全部输出位置。
【输入形式】输入数组元素数量 n 以及这 n 个整数元素;再输入2个待查找的整数。
【输出形式】输出2个数的位置信息。
【样例输入】
3 56 85 41
27 58
【样例输出】
27 -1
58 -1
【样例输入】
4 101 25 5 444
5 101
【样例输出】
5 2
101 0
【样例输入】
6 2 6 8 8 6 8
8 6
【样例输出】
8 2 3 5
6 1 4
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
//输入数组数据,将实际输入的数据数量作为返回值返回
int input_data(int* number);
//输入要查找下标的两个数,进行查找,输出结果
void output_data(int* number, int n);
int main()
{
int n, x[20];
n = input_data(x);
output_data(x, n);
return 0;
}
int input_data(int* number)
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &number[i]);
}
return n;
}
void output_data(int* number, int n)
{
int target[2], index[2][10];
int count[2] = { 0 };
for (int i = 0; i < 2; i++)
{
scanf("%d", &target[i]);
}
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < n; j++)
{
if (number[j] == target[i])
{
index[i][count[i]] = j;
count[i]++;
}
}
}
for (int i = 0; i < 2; i++)
{
if (count[i] == 0)
{
printf("%d -1\n", target[i]);
}
else
{
printf("%d ", target[i]);
for (int j = 0; j < count[i]; j++)
{
printf("%d ", index[i][j]);
}
printf("\n");
}
}
}
2.(指针做参数的函数定义)规格化数据
【问题描述】输入 10 个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:
①输入 10 个数; 函数原型声明:void input_data(int *number)
②进行处理; 函数原型声明:void handle_val(int *number)
③输出 10 个数。 函数原型声明:void output_data(int *number)
【输入形式】输入 10 个整数。
【输出形式】输出对换后的10个整数。
【样例输入】10 25 6 15 87 3 26 31 85 7
【样例输出】3 25 6 15 7 10 26 31 85 87
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
void input_data(int* number);
void handle_val(int* number);
void output_data(int* number);
int main()
{
int x[10];
input_data(x);
handle_val(x);
output_data(x);
return 0;
}
void input_data(int* number)
{
for (int i = 0; i < 10; i++)
{
scanf("%d", &number[i]);
}
}
// ②进行处理
void handle_val(int* number)
{
int min_index = 0, max_index = 9;
for (int i = 1; i < 10; i++)
{
if (number[i] < number[min_index])
{
min_index = i;
}
if (number[i] > number[max_index])
{
max_index = i;
}
}
// 将最小值与第一个数对换
int temp = number[0];
number[0] = number[min_index];
number[min_index] = temp;
// 将最大值与最后一个数对换
temp = number[9];
number[9] = number[max_index];
number[max_index] = temp;
}
// ③输出 10 个数
void output_data(int* number)
{
for (int i = 0; i < 10; i++)
{
printf("%d ", number[i]);
}
printf("\n");
}
3.创建并输出链表
【问题描述】从键盘输入一行字符,以 # 结束,建立链表,打印输出链表。
【输入形式】输入一行字符,以 # 结束。
【输出形式】输出 # 之前的字符串(注意空表输出情况)。
【样例输入】123456789#124
【样例输出】123456789
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(Node)
//用 typedef 将结构体改名字
typedef struct Node
{
char data;
struct Node* next;
} Node;
Node* create();
void print(Node* p);
int main()
{
Node* head = NULL;
head = create();
print(head);
return 0;
}
Node* create()
{
Node* head = NULL, * temp = NULL, * last = NULL;
char ch;
while ((ch = getchar()) != '#')
{
temp = (Node*)malloc(sizeof(Node));
if (temp == NULL)
{
printf("Memory allocation failed.\n");
return NULL;
}
temp->data = ch;
temp->next = NULL;
if (head == NULL)
{
head = temp;
last = temp;
}
else
{
last->next = temp;
last = temp;
}
}
return head;
}
void print(Node* p)
{
if (p == NULL)
{
return;
}
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
4.删除链表中指定结点
【问题描述】输入链表 a,链表结点中包含学号、姓名,学号输入 -1,姓名随意代表一个链表输入结束。再输入待删除结点的学号 num,请编写删除链表中结点函数,从结点中删除学号为 num 的结点,并依次输出删除后的链表。若链表中不包含学号为 num 的结点,则先输出 no data,再依次输出链表结点。
【输入形式】输入链表 a 的数据和待删除结点的学号 num。其中,学号输入 -1,姓名随意代表一个链表输入结束。
【输出形式】输出删除后的新链表。
【样例输入】
101 Wang
102 Li
105 Zhang
106 Wei
-1 x
105
【样例输出】
101 Wang 102 Li 106 Wei
【样例输入】
101 Wang
102 Li
105 Zhang
106 Wei
-1 x
103
【样例输出】
no data 101 Wang 102 Li 105 Zhang 106 Wei
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(NODE)
//用 typedef 将结构体改名字
typedef struct node
{
int num;
char name[20];
struct node* next;
} NODE;
NODE* Create_LinkList();
//读入学号,并删除指定学号的结点,
//成功删除返回正数,未找到学号返回负数。
int Delete_LinkList(NODE* head);
void Display_LinkList(NODE* head, int flag);
void Free_LinkList(NODE* head);
int main()
{
NODE* head = NULL;
int flag;
head = Create_LinkList();
flag = Delete_LinkList(head);
Display_LinkList(head, flag);
Free_LinkList(head);
return 0;
}
NODE* Create_LinkList()
{
NODE* head, * head1, * p1, * p2;
int n = 0;
head1 = (NODE*)malloc(LEN);
head = NULL;
p1 = p2 = (NODE*)malloc(LEN);
scanf("%d %s", &p1->num, p1->name);
while (p1->num != -1)
{
n += 1;
if (n == 1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (NODE*)malloc(LEN);
scanf("%d %s", &p1->num, p1->name);
}
p2->next = NULL;
head1->next = head;
return head1;
}
int Delete_LinkList(NODE* head)
{
int x = 0;
scanf("%d", &x);
NODE* p;
p = head;
int flag = -1;//没找到时flag为-1
while (p->next != NULL)
{
if (p->next->num == x)
{
NODE* temp;
temp = p->next;
p->next = p->next->next;
free(temp);
flag = 1;
break;
}
p = p->next;
}
return flag;
}
void Display_LinkList(NODE* head, int flag)
{
NODE* p;
if (flag < 0)
printf("no data ");
for (p = head->next; p != NULL; p = p->next)
printf("%d %s ", p->num, p->name);
}
void Free_LinkList(NODE* head)
{
NODE* p, * q;
p = head;
while (p->next != NULL)
{
q = p->next;
p->next = q->next;
free(q);
}
free(head);
}
5.用指针和函数实现3个数排序
【问题描述】输入 3 个整数,按由小到大的顺序输出。指针使用部分要求定义函数 void swap(int *x, int *y),函数功能是 x 和 y 两个数互换。
【输入形式】输入 3 个整数。
【输出形式】按由小到大的顺序输出,每个数用一个空格分隔。
【样例输入】5 -1 6
【样例输出】-1 5 6
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
void swap(int* x, int* y);
int main()
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if (x > y)
{
swap(&x, &y);
}
if (y > z)
{
swap(&y, &z);
}
if (x > y)
{
swap(&x, &y);
}
printf("%d %d %d", x, y, z);
return 0;
}
void swap(int* x, int* y)
{
int temp = *x;
*x = *y;
*y = temp;
}
二、程序设计基础实验
习题
1.求三角形面积
【问题描述】输入任意三角形的三边长,不考虑构不成三角形情况,求三角形面积。
求三角形面积的公式为:
area=sqrt(s(s-a)(s-b)(s-c)), 其中 sqrt 为开根号函数,s=(a+b+c)/2。
【输入形式】输入三角形的三条边长,以回车结束。
【输出形式】三角形面积,保留小数点后2位。
【样例输入】3.1 4.2 5.17
【样例输出】6.51
#include<stdio.h>
#include<math.h>
int main()
{
float a, b, c, s, area;
scanf("%f%f%f", &a, &b, &c);
s = (a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c));
printf("%.2f", area);
return 0;
}
2.找出能够组成的最大三位数
【问题描述】输入三个正整数,这三个整数数值范围在0到9之间,且互不相同,请找出由这三个整数组成的最大三位整数。
【输入形式】输入三个整数,不考虑输入错误的情况,数据之间用单个空格隔开。
【输出形式】输出组成的最大三位整数。
【样例输入】1 2 3
【样例输出】321
#include<stdio.h>
int main()
{
int a, b, c, t;
scanf("%d%d%d", &a, &b, &c);
if (a < b)
{
t = a;
a = b;
b = t;
}
if (b < c)
{
t = b;
b = c;
c = t;
}
if (a < b)
{
t = a;
a = b;
b = t;
}
t = a * 100 + b * 10 + c;
printf("%d", t);
return 0;
}
3.计算天数
【问题描述】输入年、月、日,用程序计算一下该日期是这一年的第几天。
【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。
【输出形式】输出计算的结果
【样例输入】2015 2 1
【样例输出】32
#include<stdio.h>
int main()
{
int y, m, d, i, sum = 0;
scanf("%d%d%d", &y, &m, &d);
for (i = 1; i < m; i++)
{
switch (i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:sum += 31; break;
case 4:
case 6:
case 9:
case 11:sum += 30; break;
case 2: if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
{
sum += 29; break;
}
else
{
sum += 28; break;
}
}
}
printf("%d", sum + d);
return 0;
}
4.求两个正整数的最小公倍数
【问题描述】输入两个正整数,编写函数实现求这两个正整数的最小公倍数。
【输入形式】输入两个正整数。
【输出形式】输出最小公倍数。
【样例输入】2 4
【样例输出】4
【样例输入】12 23
【样例输出】276
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
int main()
{
int lcm, m, n;
scanf("%d%d", &m, &n);
if (m < n)
{
lcm = m; m = n; n = lcm;
}
for (lcm = m;; lcm++)
if (lcm % m == 0 && lcm % n == 0)
break;
printf("%d", lcm);
return 0;
}
5.根据日期计算星期几
【问题描述】输入年、月、日,输出当天是星期几。已知2000年1月1日为星期六
【输入形式】输入三个整数,分别表示年、月、日,数与数之间用空格隔开。
【输出形式】输出一个整数。(1~7分别表示星期一至星期日)
【样例输入】2000 1 2
【样例输出】7
【样例输入】2000 1 1
【样例输出】6
【样例输入】1999 12 31
【样例输出】5
#include <stdio.h>
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int main()
{
int y, m, d;
scanf("%d %d %d", &y, &m, &d);
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
a[2] = 29;
int ans = d, i;
for (i = 1; i <= m - 1; i++)
{
ans += a[i];
}
int s, r;
s = y - 1 + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + ans;
r = s % 7;
if (r == 0)
r = 7;
printf("%d\n", r);
return 0;
}
实验一、学生计算能力进阶训练程序
1. 自定义难度等级(例如:第1级为一位数和一位数的加法,减法和乘法运算;第2级为一位数和两位数的加法,减法和乘法运算;第3级为两位数和两位数的加法,减法和乘法运算),学生可以选择不同等级练习,某个等级练习的正确率在90%以上,可以升级;正确率在60%以下,则要降级;
2. 每组难度题目数量为10题,软件随机出题,学生填写答案;
3、一组题全部答完后,显示学生成绩,并根据结果自动升降级,完成通关训练。
提示:1、同学们需自行上网查找生成随机数的方法;
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand((unsigned)time(NULL));
一:int s, r = 0, j;//s十题,r对,j结果
for (s = 1; s <= 10; s++)
{
int a = rand() % 10, b = rand() % 10, c = rand() % 3;//c运算符号
switch (c)
{
case 0:printf("%d+%d=", a, b); break;
case 1:printf("%d-%d=", a, b); break;
case 2:printf("%d*%d=", a, b); break;
}
scanf("%d", &j);
switch (c)
{
case 0:if (j == a + b)
{
r++;
break;
}
case 1:if (j == a - b)
{
r++;
break;
}
case 2:if (j == a * b)
{
r++;
break;
}
}
}
if (r <= 9)
goto 一;
二:r = 0;//s十题,r对,j结果
for (s = 1; s <= 10; s++)
{
int a = rand() % 100, b = rand() % 10, c = rand() % 3;//c运算符号
switch (c)
{
case 0:printf("%d+%d=", a, b); break;
case 1:printf("%d-%d=", a, b); break;
case 2:printf("%d*%d=", a, b); break;
}
scanf("%d", &j);
switch (c)
{
case 0:if (j == a + b)
{
r++;
break;
}
case 1:if (j == a - b)
{
r++;
break;
}
case 2:if (j == a * b)
{
r++;
break;
}
}
}
if (r <= 9 && r >= 6)
goto 二;
if (r < 6)
goto 一;
三:r = 0;//s十题,r对,j结果
for (s = 1; s <= 10; s++)
{
int a = rand() % 100, b = rand() % 100, c = rand() % 3;//c运算符号
switch (c)
{
case 0:printf("%d+%d=", a, b); break;
case 1:printf("%d-%d=", a, b); break;
case 2:printf("%d*%d=", a, b); break;
}
scanf("%d", &j);
switch (c)
{
case 0:if (j == a + b)
{
r++;
break;
}
case 1:if (j == a - b)
{
r++;
break;
}
case 2:if (j == a * b)
{
r++;
break;
}
}
}
if (r <= 9 && r >= 6)
goto 三;
if (r < 6)
goto 二;
printf("结束");
return 0;
}
实验二、中国著名科学家主要生平事迹查询程序
1、了解电脑系统或手机系统中万年历查询的基本功能;
2、了解中国著名科学家主要生平事迹信息;
3、输入包括年、月的日期,实现输出相应月历表,以及对应日期的科学家生平事迹信息的功能; 例如,钱学森的主要生平事迹简介:钱学森(英文:Qian Xuesen Qian XuesenQian Xuesen Qian XuesenQian XuesenQian Xuesen ,19111911 1911年12 月11 日—2009 20092009年10 月31 日),出生于上海,籍贯浙江杭州,中国共产党的优秀党员,忠诚的共产主义战士,享誉海内外的国家杰出贡献科学家和中国航天事业的奠基人,中国科学院、中国工程院资深院士,中国人民政治协商会议第六届、七届、八届全国委员会副主席,两弹一星功勋奖章获得者 。 钱学森1929 —1934 年就读于国立交通大学机械工程系 ;1939 年获得美国加州理工学院航空和数学博士学位 ;1947 年任麻省理工学院教授;1956 年任中国科学院力学研究所所长;1957 19571957年补选为中国科学院学部委员(院士);1965 1965 年任中华人民共和国第七机械工业部副部长;1970 年任中国人民解放军国防科学技术委员会副主任 ;1986 年6月任中国科学技术协会主席 ;19941994 1994年当选为中国工程院院士 ;钱学森主要从事应用力学、工程控制论、航空工程、火箭导弹技术、系统工程和系统科学、思维科学和人体科学以及马克思主义哲学等领域的研究 。 1991 年10 月钱学森被国务院、中央军委授予“国家杰出贡献科学家”荣誉称号,被中央军委授予一级英雄模范奖章。1999 19991999年9月被党中央、国务院、中央军委授予“两弹一星功勋奖章” 。2009 年10 月31 日在北京逝世,享年98 岁。 用户输入1991 ,10 ,程序能够输出此月份所在的月历表,并给出该月份的科学家事迹 1991 19911991年10 月钱学森被国务院、中央军委授予“国家杰出贡献科学家” 荣誉称号,被中央军委授予一级英雄模范奖章”。如果同月有其它事迹,也逐一列出。
4、提供主要生平事迹的查询显示功能,显示方式和形式自行设计。
#include<stdio.h>
#include<string.h>
void month_cd(int months);//月历函数
int year, month, day = 1, week, i, j, k;
int years[12][6][7] = { 0 };//年历数组(?)
int monthname[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
char weekname[] = "SUN MON TUE WED THU FRI SAT";
int main()
{
scanf("%d", &year);
//星期计算(固定算法)
day = year - 1 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 + day;
week = day % 7;//week·星期几
//闰年计算
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
monthname[1] = 29;
}
scanf("%d", &month);
month_cd(month);
printf("%s\n", weekname);
for (i = 0; i < 6; i++)
{
for (j = 0; j < 7; j++)
{
if (years[month - 1][i][j] == 0)
{
printf(" ");
}
else
{
printf("%-5d", years[month - 1][i][j]);
}
}
printf("\n");
}
//输出科学家事迹
if (year == 1911)
if (month == 12)
printf("出生于上海,籍贯浙江杭州,中国共产党的优秀党员,忠诚的共产主义战士,享誉海内外的国家杰出贡献科学家和中国航天事业的奠基人,中国科学院、中国工程院资深院士,中国人民政治协商会议第六届、七届、八届全国委员会副主席,两弹一星功勋奖章获得者 。\n");
if (year >= 1929 && year <= 1934)
printf("就读于国立交通大学机械工程系\n");
if (year == 1939)
printf("获得美国加州理工学院航空和数学博士学位\n");
if (year == 1947)
printf("任麻省理工学院教授\n");
if (year == 1956)
printf("任中国科学院力学研究所所长\n");
if (year == 1957)
printf("补选为中国科学院学部委员(院士)\n");
if (year == 1965)
printf("任中华人民共和国第七机械工业部副部长\n");
if (year == 1970)
printf("任中国人民解放军国防科学技术委员会副主任\n");
if (year == 1986)
if (month == 6)
printf("任中国科学技术协会主席\n");
if (year == 1994)
printf("当选为中国工程院院士 ;钱学森主要从事应用力学、工程控制论、航空工程、火箭导弹技术、系统工程和系统科学、思维科学和人体科学以及马克思主义哲学等领域的研究 。\n");
if (year == 1991)
if (month == 10)
printf("钱学森被国务院、中央军委授予“国家杰出贡献科学家”荣誉称号,被中央军委授予一级英雄模范奖章。\n");
if (year == 1999)
if (month == 9)
printf("被党中央、国务院、中央军委授予“两弹一星功勋奖章” 。\n");
if (year == 2009)
if (month == 10)
printf("在北京逝世,享年98 岁。\n");
return 0;
}
void month_cd(int months)
{//months为要计算的月份
int days = week;
int nday = 1;
for (i = 0; i < months - 1; i++)
{
days += monthname[i];
}
days = days % 7;
for (i = 0; i < 6; i++)
{
for (j = days; j < 7; j++)
{
days = 0;
years[months - 1][i][j] = nday++;
if (nday - 1 == monthname[months - 1])
{
return;
}
}
}
}
注:原实验三为多个合作实验题目,故暂不给出源代码
实验三、国产战机性能参数比较程序
1.了解国产化战斗机发展历程,查阅并了解我国战斗机的性能参数;
2.至少录入五种以上国产战斗机的性能参数,包括飞行型号、飞机名称,机身长,机身宽,翼展,最大飞行速度,最大飞行高度,航程,作战半径,载弹量等;使用正确的数据类型对以上信息进行保存;
3.至少自定义两个函数,实现对不同参数进行排序的功能;
4.设计合理的用户交互程序,实现对这些参数的显示、查询、排序等菜单功能。
#include <stdio.h>
#include <string.h>
// 国产战斗机结构体定义
typedef struct Fighter
{
char model[50];
char name[50];
int length;
int width;
int wing_span;
int max_speed;
int max_height;
int range;
int radius;
int payload;
} Fighter;
// 冒泡排序函数
void bubbleSort(Fighter arr[], int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j].max_speed < arr[j + 1].max_speed)
{
Fighter temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 显示所有战斗机信息
void displayFighters(Fighter arr[], int n)
{
printf("Model\tName\tLength\tWidth\tWing Span\tMax Speed\tMax Height\tRange\tRadius\tPayload\n");
for (int i = 0; i < n; i++)
{
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
arr[i].model, arr[i].name, arr[i].length, arr[i].width, arr[i].wing_span,
arr[i].max_speed, arr[i].max_height, arr[i].range, arr[i].radius, arr[i].payload);
}
}
// 查询战斗机信息
void searchFighter(Fighter arr[], int n)
{
char model[50];
printf("请输入要查询的飞机型号:");
scanf("%s", model);
for (int i = 0; i < n; i++)
{
if (strcmp(model, arr[i].model) == 0)
{
printf("找到的飞机信息如下:\n");
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
arr[i].model, arr[i].name, arr[i].length, arr[i].width, arr[i].wing_span,
arr[i].max_speed, arr[i].max_height, arr[i].range, arr[i].radius, arr[i].payload);
return;
}
}
printf("未找到该型号的飞机。\n");
}
int main()
{
Fighter fighters[] =
{
{"J-20", "歼-20", 20.3, 4.7, 13.6, 2100, 18000, 2000, 1100, 11},
{"J-15", "歼-15", 22.2, 9.7, 15.0, 1750, 15000, 3500, 1200, 8},
{"J-16", "歼-16", 21.9, 12.0, 14.7, 1800, 18000, 3900, 1500, 12},
{"J-10B", "歼-10B", 16.9, 9.8, 9.5, 1550, 16000, 1800, 1100, 7},
{"JF-17", "枭龙", 14.3, 9.1, 8.9, 1700, 16000, 1200, 800, 3}
};
int n = sizeof(fighters) / sizeof(fighters[0]);
while (1)
{
printf("\n请选择操作:\n");
printf("1. 显示所有战斗机信息\n");
printf("2. 根据最大速度排序\n");
printf("3. 查询战斗机信息\n");
printf("4. 退出程序\n");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:
displayFighters(fighters, n);
break;
case 2:
bubbleSort(fighters, n);
printf("已按照最大速度排序:\n");
displayFighters(fighters, n);
break;
case 3:
searchFighter(fighters, n);
break;
case 4:
return 0;
default:
printf("无效的选择,请重新输入。\n");
}
}
return 0;
}
如有问题或修改建议欢迎在评论区指出!
今天是2023年最后一天了,预祝大家新年快乐!(鞠躬)