C语言中结构体在解题中的应用
1、结构体之时间设计
题目描述
定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
输入格式
年月日
输出格式
当年第几天
样例输入
2000 12 31
样例输出
366
AC代码(C语言)
#include<stdio.h>
#include<string.h>
typedef struct {
int year;
int month;
int day;
}TIME;
int isLeapYear(int year){//能被400整除,或者能被4整除但不能被100整除的年份为闰年
if(year%400==0||year%4==0&&year%100!=0)
return 1;
return 0;
}
int main(){
TIME time;
int result=0;
scanf("%d%d%d",&time.year,&time.month,&time.day);
switch (time.month){
case 1:result=time.day; break;
case 2:result=time.day+31; break;
case 3:result=time.day+31+28; break;
case 4:result=time.day+31+28+31; break;
case 5:result=time.day+31+28+31+30; break;
case 6:result=time.day+31+28+31+30+31; break;
case 7:result=time.day+31+28+31+30+31+30; break;
case 8:result=time.day+31+28+31+30+31+30+31; break;
case 9:result=time.day+31+28+31+30+31+30+31+31; break;
case 10:result=time.day+31+28+31+30+31+30+31+31+30; break;
case 11:result=time.day+31+28+31+30+31+30+31+31+30+31; break;
case 12:result=time.day+31+28+31+30+31+30+31+31+30+31+30; break;
default:
break;
}
if(isLeapYear(time.year)) result++;
printf("%d\n",result);
return 0;
}
2、结构体之成绩记录
题目描述
现有有N个学生的数据记录,每个记录包括学号、姓名、三科成绩。 编写一个函数input,用来输入一个学生的数据记录。 编写一个函数print,打印一个学生的数据记录。 在主函数调用这两个函数,读取N条记录输入,再按要求输出。 N<100
输入格式
学生数量N占一行 每个学生的学号、姓名、三科成绩占一行,空格分开。
输出格式
每个学生的学号、姓名、三科成绩占一行,逗号分开。
样例输入
2
a100 clang 70 80 90
b200 dotcpp 90 85 75
样例输出
a100,clang,70,80,90
b200,dotcpp,90,85,75
AC代码(C语言)
#include<stdio.h>
#include<string.h>
typedef struct {
char number[20];//学号
char name[20];//姓名
int math;//数学成绩
int english;//英语成绩
int chinese;//语文成绩
}Student;
Student students[105];//创建数组用来存放学生
void input(int n){
for(int i=0;i<n;i++){
scanf("%s%s%d%d%d",students[i].number,students[i].name,
&students[i].math,&students[i].english,&students[i].chinese);
}
}
void Output(int n){
for(int i=0;i<n;i++){
printf("%s,%s,%d,%d,%d\n",students[i].number,students[i].name,
students[i].math,students[i].english,students[i].chinese);
}
}
int main(){
int n;
scanf("%d",&n);
input(n);
Output(n);
return 0;
}
3、结构体之成绩统计2
题目描述
有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)
输入格式
学生数量N占一行每个学生的学号、姓名、三科成绩占一行,空格分开。
输出格式
各门课的平均成绩 最高分的学生的数据(包括学号、姓名、3门课成绩)
样例输入
2
1 blue 90 80 70
b clan 80 70 60
样例输出
85 75 65
1 blue 90 80 70
AC代码(C语言)
#include<stdio.h>
#include<string.h>
typedef struct {
char number[20];//学号
char name[20];//姓名
int math;//数学成绩
int english;//英语成绩
int chinese;//语文成绩
int total;//总分
}Student;
Student students[105];
//各科平均成绩
int aveMath,aveEnglish,aveChinese,sumMath=0,sumEnglish=0,sumChinese=0;
void calcuAve(int n){
for(int i=0;i<n;i++){
scanf("%s%s%d%d%d",students[i].number,students[i].name,&students[i].math,&students[i].english,&students[i].chinese);
students[i].total=students[i].math+students[i].english+students[i].chinese;
sumMath+=students[i].math;//各个学生单科成绩之和
sumEnglish+=students[i].english;
sumChinese+=students[i].chinese;
}
aveMath=sumMath/n;//求平均成绩
aveEnglish=sumEnglish/n;
aveChinese=sumChinese/n;
}
int main(){
int n;
scanf("%d",&n);
calcuAve(n);
int max=0;
printf("%d %d %d\n",aveMath,aveEnglish,aveChinese);
for(int i=0;i<n;i++){//求最高成绩的学生
if(students[i].total>students[max].total) max=i;
}
printf("%s %s %d %d %d\n",students[max].number,students[max].name,students[max].math,students[max].english,students[max].chinese);
return 0;
}