目录
7-5 找出总分最高的学生
给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。
输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。
输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。
输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258
代码
#include<stdio.h>
struct Student{ //定义结构类型struct student
char id[10];
char name[11];
int s1,s2,s3;
int total;
} students[11]; //定义结构数组students
int main()
{
int n;
struct Student temp; //定义结构变量temp
scanf("%d",&n); //输入整数
for(int i=0;i<n;i++) //给结构数组下标i的元素(结构)的成员赋初值
{
scanf("%s %s",students[i].id,students[i].name);
scanf("%d %d %d",&students[i].s1,&students[i].s2,&students[i].s3);
students[i].total=students[i].s1+students[i].s2+students[i].s3;//求和结果赋值给结构成员total
}
temp=students[0];//假设总分total最高的是结构数组下标为0的元素,即第一个
for(int i=1;i<n;i++)
{//循环比较,找出总分total最高的学生
if(temp.total<students[i].total)
{
temp=students[i];
}
}
printf("%s %s %d",temp.name,temp.id,temp.total);//输出学生信息
return 0;
}
7-6 通讯录的录入与显示
通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。
本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。
输入格式:
输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机
给出一条记录。其中姓名
是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd
的格式给出年月日;性别用M
表示“男”、F
表示“女”;固话
和手机
均为不超过15位的连续数字,前面有可能出现+
。
在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。
输出格式:
对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日
的格式输出该记录。若要查询的记录不存在,则输出Not Found
。
输入样例:
3
Chris 1984/03/10 F +86181779452 13707010007
LaoLao 1967/11/30 F 057187951100 +8618618623333
QiaoLin 1980/01/01 M 84172333 10086
2 1 7
输出样例:
LaoLao 057187951100 +8618618623333 F 1967/11/30
Not Found
代码
#include<stdio.h>
struct note{ //定义结构类型struct note
char name[20],birth[20],sex[20],tel[20],phone[20];
}a[10]; //定义结构数组a
int main()
{
int N;
scanf("%d",&N);//输入整数N
for(int i=0;i<N;i++)//结构数组循环赋初值
scanf("%s %s %s %s %s",a[i].name,a[i].birth,a[i].sex,a[i].tel,a[i].phone);
int K;
scanf("%d",&K);//输入整数K
int label[K]; //定义数组lable长度为K
for(int i=0;i<K;i++)
scanf(" %d",&label[i]); //给数组label赋初值
for(int i=0;i<K;i++) //for循环 执行K次
{
int t=label[i]; //将数组label的值赋给t
if(t>N-1 || t<0) //超出数组label范围,输出not found
printf("Not Found\n");
else //否则输出结构数组a的下标为t的相应信息
{
printf("%s %s %s %s %s\n",a[t].name,a[t].tel,a[t].phone,a[t].sex,a[t].birth);
}
}
return 0;
}
7-7 一帮一
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数N
(≤50),即全班学生的人数。此后N
行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
输出样例:
Amy Jack
Tom Linda
Bill Maya
Cindy John
代码
#include <stdio.h>
struct student//定义结构类型struct student
{
int sex;
char name[9];
}stu[50];//定义结构数组stu
int main()
{
int n, i, j, temp;
scanf("%d", &n);//输入整数n
for (i = 0; i < n; i++)//给结构数组的成员赋初值
{
scanf("%d %s", &stu[i].sex, stu[i].name);
}
//双重for循环
for (i = 0; i < n; i++)
{
for(j = n - 1; j >= i; j--)
{
if (stu[i].sex != stu[j].sex && stu[j].sex != 3)
{
printf("%s %s\n", stu[i].name, stu[j].name);
stu[j].sex = 3;//已经有分组的就赋值为3
break;
}
}
}
return 0;
}
7-8 考试座位号
每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。
输入格式:
输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号
。其中准考证号
由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。
考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。
输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。
输入样例:
4
3310120150912233 2 4
3310120150912119 4 1
3310120150912126 1 3
3310120150912002 3 2
2
3 4
输出样例:
3310120150912002 2
3310120150912119 1
代码
#include <stdio.h>
#define N 1000
struct stu //定义结构类型struct stu
{
char s[17];
int shi;
int kao;
};
int main ()
{
struct stu p[N];//定义结构数组p
int n,i,j,m,a[N];
scanf("%d",&n);//输入整数n
for(i=0;i<n;i++)//结构数组赋值
scanf("%s%d%d",p[i].s,&p[i].shi,&p[i].kao);
scanf("%d",&m);//输入整数m
for(i=0;i<m;i++) //数组赋值,m个试机座位号
scanf("%d",&a[i]);
for(i=0;i<m;i++)//for循环m次,m个试机座位号
{
for(j=0;j<n;j++) //for循环n次,n行数据
{
if(a[i]==p[j].shi) //试机座位号相等
printf("%s %d\n",p[j].s,p[j].kao);//输出准考生号与座位号
}
}
return 0;
}