沈阳航空航天大学习题的整理,仅供参考。
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
#define _CRT_SECURE_NO_WARNINGS 1
#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
#define _CRT_SECURE_NO_WARNINGS 1
#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
#define _CRT_SECURE_NO_WARNINGS 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
#define _CRT_SECURE_NO_WARNINGS 1
#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
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
8.求解两点间距离
【问题描述】求解平面直角坐标系下两点间的距离,要求用结构体存储点信息。
【输入形式】输入两个点坐标。
【输出形式】输出两点间的距离。
【样例输入】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);
}
9.根据年月日计算天数
【问题描述】定义一个结构体变量(包括年、月、日),输入一个日期,计算在本年中是第几天,注意闰年问题。
(闰年判断方法是: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));
}
10.投票竞选班长程序
【问题描述】某班级选班长,有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;
}
11.查找 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);
}
}