【编程基础】032、C语言中结构体在解题中的应用

时间:2021-04-11 01:20:44

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;
}