目录

1181: 谁的年龄最小(结构体专题)
题目描述
设计一个结构体类型,包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好友的信息,输出年龄最小的好友的姓名和出生日期。
输入
首先输入一个整数n(1<=n<=10),表示好友人数,然后输入n行,每行包含一个好友的信息:姓名(不超过20位)以及三个整数,分别表示出生日期的年月日。
输出
输出年龄最小的好友的姓名和出生日期,用空格隔开,出生日期的输出格式见输出样例。
样例输入 Copy
3
Zhangling 1983 2 4
Wangliang 1983 12 11
Fangfang 1985 6 1
样例输出 Copy
Fangfang 1985-06-01
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100;
struct People
{
string name;
int year,month,day;
};
People S[N];
int cmp(const struct People &A,const struct People &B)
{
if(A.year != B.year)return A.year > B.year;
else if(A.month != B.month)return A.month > B.month;
else if(A.day != B.day)return A.day > B.day;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> S[i].name >> S[i].year >> S[i].month >> S[i].day;
sort(S + 1,S + 1 + n,cmp);
cout << S[1].name << ' ';
printf("%04d-%02d-%02d",S[1].year,S[1].month,S[1].day);
return 0;
}
1182: 查询记录(结构体专题)
题目描述
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下查找功能:输入一个学生的学号,输出该学生学号、姓名、3门课程成绩
输入
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个学号num
输出
若学号num存在,输出该学生的学号、姓名、3门课程成绩;若该学号不存在,则输出“Not Found”。
样例输入 Copy
3
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
541207010188
样例输出 Copy
541207010188 Zhangling 89 78 95
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 250;
struct Student
{
string num;
string name;
int a,b,c;
};
Student stu[N];
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> stu[i].num >> stu[i].name >> stu[i].a >> stu[i].b >> stu[i].c;
string num;
cin >> num;
int flag = 0;
for(int i = 1;i <= n;i ++ )
{
if(num == stu[i].num)
{
flag = 1;
cout << stu[i].num << ' ' << stu[i].name << ' ' << stu[i].a << ' ' << stu[i].b << ' ' << stu[i].c;
}
}
if(flag == 0)cout << "Not Found" << endl;
return 0;
}
1183: 平面点排序(一)(结构体专题)
题目描述
平面上有n个点,坐标均为整数。请按与坐标原点(0,0)距离的远近将所有点排序输出。可以自己写排序函数,也可以用qsort库函数排序。
输入
输入有两行,第一行是整数n(1<=n<=10),接下来有n行,每行一对整数(每对整数对应一个点)。
输出
输出排序后的所有点,格式为(u,v),每个点后有一个空格。测试数据保证每个点到原点的距离都不同。
样例输入 Copy
4
1 3
2 5
1 4
4 2
样例输出 Copy
(1,3) (1,4) (4,2) (2,5)
源代码
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 250;
struct Point
{
int x;
int y;
double s;
};
Point S[N];
int cmp(const struct Point &A,const struct Point &B)
{
return A.s < B.s;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )
{
cin >> S[i].x >> S[i].y;
S[i].s = sqrt(S[i].x * S[i].x + S[i].y * S[i].y);
}
sort(S + 1,S + 1 + n,cmp);
for(int i = 1;i <= n;i ++ )cout << '(' << S[i].x << ',' << S[i].y << ')' << ' ';
return 0;
}
1184: 平面点排序(二)(结构体专题)
题目描述
平面上有n个点,坐标均为整数。横坐标相同时按纵坐标排序,否则按横坐标排序。本题要求用结构体存储坐标,再进行排序。先升序排序输出,再降序排序输出,可以自己写排序函数,也可以用qsort库函数排序。
输入
第一行是整数n(1<=n<=100),表示接下来有n行,每行两个整数,表示平面上一个点的坐标。
输出
输出有两行,即排序后的点,格式为(u,v),每个点后有一个空格。第一行升序排序结果,第二行降序排序结果。
样例输入 Copy
4
1 3
2 5
1 4
4 1
样例输出 Copy
(1,3) (1,4) (2,5) (4,1)
(4,1) (2,5) (1,4) (1,3)
源代码
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 250;
struct Point
{
int x;
int y;
};
Point S[N];
int cmp(const struct Point &A,const struct Point &B)
{
if(A.x != B.x)return A.x < B.x;
else return A.y < B.y;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> S[i].x >> S[i].y;
sort(S + 1,S + 1 + n,cmp);
for(int i = 1;i <= n;i ++ )cout << '(' << S[i].x << ',' << S[i].y << ')' << ' ';
cout << endl;
for(int i = n;i >= 1;i -- )cout << '(' << S[i].x << ',' << S[i].y << ')' << ' ';
return 0;
}
1185: 添加记录(结构体专题)
题目描述
有一学生成绩表,包括学号、姓名、3门课程成绩。已知该成绩表按学号升序排序。请编程实现,添加一个新的学生信息,且使成绩表仍按学号有序;若待添加的学号与已有学号重复,则输出错误信息,拒绝添加。
输入
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个待添加的学生信息,包括学号、姓名和3门课成绩
输出
若待添加的学号与已有学号重复,则输出只有一行“error!”;否则,输出n+1行,即添加后的成绩单信息。
样例输入 Copy
3
541207010188 Zhangling 78 95 55
541207010189 Wangli 87 99 88
541207010191 Fangfang 68 76 75
541207010190 Lilei 68 79 82
样例输出 Copy
541207010188 Zhangling 78 95 55
541207010189 Wangli 87 99 88
541207010190 Lilei 68 79 82
541207010191 Fangfang 68 76 75
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 250;
struct Student
{
string num;
string name;
int a,b,c;
};
Student stu[N];
int cmp(const struct Student &A,const struct Student &B)
{
return A.num < B.num;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )
{
cin >> stu[i].num >> stu[i].name >> stu[i].a >> stu[i].b >> stu[i].c;
}
string num;
cin >> num;
int flag = 1;
for(int i = 1;i <= n;i ++ )
{
if(num == stu[i].num)
{
flag = 0;
break;
}
}
if(flag == 0)cout << "error!" << endl;
else
{
stu[n + 1].num = num;
cin >> stu[n + 1].name >> stu[n + 1].a >> stu[n + 1].b >> stu[n + 1].c;
sort(stu + 1,stu + 2 + n,cmp);
for(int i = 1;i <= n + 1;i ++ )cout << stu[i].num << ' ' << stu[i].name << ' ' << stu[i].a << ' ' << stu[i].b << ' ' << stu[i].c << endl;
}
return 0;
}
1186: 删除记录(结构体专题)
题目描述
有一学生成绩表,包括学号、姓名、3门课程成绩。请实现如下删除功能:输入一个学生的学号,删除该学生的所有信息。
输入
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个学号num。
输出
若要删除的学号不存在,则输出“error!”;否则,输出删除该学生后的所有记录。
样例输入 Copy
3
541207010188 Zhangling 78 95 55
541207010189 Wangli 87 99 88
541207010190 Fangfang 68 76 75
541207010188
样例输出 Copy
541207010189 Wangli 87 99 88
541207010190 Fangfang 68 76 75
源代码
使用数据结构的顺序表进行操作
#include <iostream>
using namespace std;
const int N = 250;
typedef struct
{
string num;
string name;
int a,b,c;
}Student;
typedef struct
{
Student *elem;
int length;
}SqList;
void InitSqList(SqList &L)
{
L.elem = new Student [N];
L.length = 0;
}
void ClearSqList(SqList &L)
{
delete [] L.elem;
}
void ListDelete(SqList &L,int i)
{
for(int j = i;j <= L.length - 1;j ++ )
{
L.elem[j - 1] = L.elem[j];
}
-- L.length;
}
void ListInsert(SqList &L,int i,Student e)
{
for(int j = L.length - 1;j >= i - 1;j -- )
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
++ L.length;
}
int find(SqList &L,string num)
{
for(int i = 0;i < L.length;i ++ )
{
if(L.elem[i].num == num)return i + 1;
}
return -2;
}
int main()
{
SqList L;
InitSqList(L);
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )
{
Student t;
cin >> t.num >> t.name >> t.a >> t.b >> t.c;
ListInsert(L,i,t);
}
string num;
cin >> num;
if(find(L,num) != -2)
{
ListDelete(L,find(L,num));
for(int i = 0;i < L.length;i ++ )
{
cout << L.elem[i].num << ' ' <<L.elem[i].name << ' ' << L.elem[i].a << ' ' << L.elem[i].b << ' ' << L.elem[i].c << endl;
}
}
else cout << "error!" << endl;
ClearSqList(L);
return 0;
}
1187: 棒棒糖(结构体专题)
题目描述
新年快到了,计算机学院新年晚会正在筹备中,今年有一个新创意:来参加晚会的所有学生都有礼物(一根棒棒糖)。老师把买棒棒糖的任务交给小明了,并指定了要买的棒棒糖的品牌和品种。俗话说得好,货比三家不吃亏。小明来到了商店,看了各个店铺里这种棒棒糖的价格,不仅如此,他还记住了每个店铺的存货量。已知小明打算购买n根棒棒糖,问他最少要花多少钱?
输入
第一行输入一个整数n,表示要购买的棒棒糖数量;第二行是一个整数m(1<=m<=10),表示明明考察过的店铺的数量;接下来m行,每行两个数,表示该店铺中棒棒糖的价格和数量,价格为一实数(最多两位小数),数量为一整数。
输出
输出一个实数,保留两位小数,表示最小费用。
样例输入 Copy
100
4
0.5 50
0.33 30
1 80
0.6 40
样例输出 Copy
46.90
源代码
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 250;
typedef struct
{
double money;
int num;
}Shop;
typedef struct
{
Shop *elem;
int length;
}SqList;
void InitSqList(SqList &L)
{
L.elem = new Shop [N];
L.length = 0;
}
void ClearSqList(SqList &L)
{
delete [] L.elem;
}
void ListDelete(SqList &L,int i)
{
for(int j = i;j <= L.length - 1;j ++ )
{
L.elem[j - 1] = L.elem[j];
}
-- L.length;
}
void ListInsert(SqList &L,int i,Shop e)
{
for(int j = L.length - 1;j >= i - 1;j -- )
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
++ L.length;
}
void SortSqList(SqList &L)
{
for(int i = 0;i < L.length;i ++ )
{
for(int j = i + 1;j < L.length;j ++ )
{
if(L.elem[i].money > L.elem[j].money)
{
Shop t;
t = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = t;
}
else if(L.elem[i].money == L.elem[j].money)
{
if(L.elem[i].num < L.elem[j].num)
{
Shop t;
t = L.elem[i];
L.elem[i] = L.elem[j];
L.elem[j] = t;
}
}
}
}
}
int main()
{
SqList L;
InitSqList(L);
double sum,ans = 0;
cin >> sum;
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )
{
Shop t;
cin >> t.money >> t.num;
ListInsert(L,i,t);
}
SortSqList(L);
for(int i = 0;i < L.length;i ++ )
{
if(sum == 0)break;
if(sum >= L.elem[i].num)
{
sum -= L.elem[i].num;
ans += L.elem[i].money * L.elem[i].num;
}
else
{
ans += (L.elem[i].num - sum) * L.elem[i].money;
sum = 0;
}
}
cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl;
ClearSqList(L);
return 0;
}
1188: 选票统计(一)(结构体专题)
题目描述
1483. 某单位进行选举,有5位候选人:zhang、wang、zhao、liu、miao。编写程序,统计每人所得的票数。要求每人的信息里包括两部分:name和votes,分别描述姓名和所得票数。每个人的信息用一个结构体来表示,5个人的信息使用结构体数组。
输入
首先输入一个整数n,表示一张选票,接下来n行,每行是一个由小写英文字母组成的字符串,表示以上5个候选人之一。
输出
输出5行,按zhang、wang、zhao、liu、miao的顺序输出5个候选人的姓名和所得票数,用空格隔开。
样例输入 Copy
8
zhang
wang
zhang
zhao
wang
liu
wang
wang
样例输出 Copy
zhang 2
wang 4
zhao 1
liu 1
miao 0
源代码
#include <iostream>
#include <algorithm>
using namespace std;
struct People
{
string name;
int num = 0;
};
People S[10];
int main()
{
S[1].name = "zhang";
S[2].name = "wang";
S[3].name = "zhao";
S[4].name = "liu";
S[5].name = "miao";
int n;
cin >> n;
while(n -- )
{
string s;
cin >> s;
for(int i = 1;i <= 5;i ++ )if(S[i].name == s)S[i].num ++ ;
}
for(int i = 1;i <= 5;i ++ )cout << S[i].name << ' ' << S[i].num << endl;
return 0;
}
1189: 选票统计(二)(结构体专题)
题目描述
计算机与通信工程学院2012届学生会主席投票选举工作定于1月6日在电教楼前隆重举行。本次投票将采用电脑统计选票的方式,当投票选举正式开始后,同学们将排队一一走到电脑前,投上自己神圣的一票:在电脑前输入一个姓名,然后输入回车表示确认。
当所同学投票结束,工作人员只需要输入一个”#”并回车确认,表示投票结束,电脑立即显示出得票最高的同学姓名,该同学将当选为新一届计算机与通信工程学院学生会主席。
选举大会的准备工作正在紧张进行,编程统计投票的工作就交给你了。
输入
本题为单实例测试。输入包含多行,每行是一个由小写英文字母组成的字符串,表示一个姓名,遇到#时表示输入结束。 你可以假定,参加投票学生的人数不超过500人,每个学生姓名字符串的长度小于20。
输出
输出为一个字符串——当选为学生会主席的学生姓名
样例输入 Copy
wanglin
liming
wanglin
wanglin
fangfang
liming
#
样例输出 Copy
wanglin
源代码
#include <iostream>
#include <algorithm>
using namespace std;
struct People
{
string name;
int num = 1;
};
int cmp(const struct People &A,const struct People &B)
{
return A.num > B.num;
}
People S[550];
int main()
{
string s;
int idx = 1;
while(cin >> s,s != "#")
{
int flag = 0;
for(int i = 1;i <= idx;i ++ )
{
if(S[i].name == s)
{
flag = 1;
S[i].num ++ ;
break;
}
}
if(flag == 0)S[idx ++ ].name = s;
}
sort(S + 1,S + 1 + idx,cmp);
cout << S[1].name << endl;
return 0;
}
1190: 按出生日期排序(结构体专题)
题目描述
送人玫瑰手有余香,小明希望自己能带给他人快乐,于是小明在每个好友生日的时候发去一份生日祝福。小明希望将自己的通讯录按好友的生日排序,这样就查看起来方便多了,也避免错过好友的生日。为了小明的美好愿望,你帮帮他吧。小明的好友信息包含姓名、出生日期。其中出生日期又包含年、月、日三部分信息。输入n个好友的信息,按生日的月份和日期升序输出所有好友信息。
输入
首先输入一个整数n(1<=n<=10),表示好友人数,然后输入n行,每行包含一个好友的信息:姓名(不超过20位),以及三个整数,分别表示出生日期的年月日。
输出
按过生日的先后(月份和日期)输出所有好友的姓名和出生日期,用空格隔开,出生日期的输出格式见输出样例。
样例输入 Copy
3
Zhangling 1985 2 4
Wangliang 1985 12 11
Fangfang 1983 6 1
样例输出 Copy
Zhangling 1985-02-04
Fangfang 1983-06-01
Wangliang 1985-12-11
源代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100;
struct People
{
string name;
int year,month,day;
};
People S[N];
int cmp(const struct People &A,const struct People &B)
{
if(A.month != B.month)return A.month < B.month;
else if(A.day != B.day)return A.day < B.day;
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++ )cin >> S[i].name >> S[i].year >> S[i].month >> S[i].day;
sort(S + 1,S + 1 + n,cmp);
for(int i = 1;i <= n;i ++ )
{
cout << S[i].name << ' ';
printf("%04d-%02d-%02d\n",S[i].year,S[i].month,S[i].day);
}
return 0;
}