C语言-结构体成员键盘输入与嵌套结构体

【问题描述】设计程序解决问题时,如果数据的结构比较复杂,难以用简单变量或数组表示时,可采用更复杂的构造类型。

编写程序,定义结构体类型,成员包括:

学号(7),姓名(不超过4个汉字),出生日期(包括年、月和日)4个成绩(用数组表示,数组4个元素,分别表示:平时成绩、实验成绩、期末成绩、总评成绩),成绩均用整型数表示,其中,总评成绩=平时成绩*0.2+实验成绩*0.3+期末成绩*0.5。

用该结构体类型定义数组,输入元素个数,输入数组元素的各成员,输出数组元素的各成员。
【输入形式】元素个数,数组元素的各成员

【输出形式】数组元素的各成员

【样例输入】

3

2021001 WangPing 2003 6 12 95 90 67

2021002 LiuLi 2002 10 20 94 96 54

2021003 TongAn 2002 12 5 95 86 45

【样例输出】

num       name      birthday    s1  s2  s3  sum

2021001   WangPing  2003/ 6/12  95  90  67  79  

2021002   LiuLi     2002/10/20  94  96  54  74  

2021003   TongAn    2002/12/5   95  86  45  67  

【样例说明】

输入样例:

第1行表示元素个数;第2~4行分别表示各个数组元素的成员,分别为学号、姓名、出生年月日、平时成绩、实验成绩、期末成绩

输出样例:

学号10列列宽,左对齐;姓名10列列宽,左对齐;出生日期的年份原样输出,月份为2列列宽右对齐,日为4列列宽左对齐;平时成绩、实验成绩、期末成绩和总评成绩均为4列列宽,左对齐

//
// Created by coder-itl on 2021/9/26.
//

#include 
/* 布尔值的库 */
#include 
/* 字符串的库 */
#include "string.h"

struct stuBirthday {
    /* 年 */
    int year;
    /* 月 */
    int month;
    /* 日 */
    int day;
};

struct StuScore {
    /* 平时成绩 */
    int normalGrades;
    /* 实验成绩 */
    int experimentalGrades;
    /* 期末成绩 */
    int finalGrades;
    /* 总评成绩 */
    int generalCommentGrades;
};

struct Members {
    /* 限制学号 为 7 位数 */
    int stuNo;
    /* 学生姓名 限制长度为: 4*/
    char stuName[9];
    /* 学生出生日期 格式: 年/月/日  */
    struct stuBirthday birthday;
    /* 总评成绩=平时成绩*0.2+实验成绩*0.3+期末成绩*0.5 */
    struct StuScore stuScore;
};


int main() {

    int num, i;

    /*
     * 结构体赋值:
     *  1. 点域"." 的方式
     *  2. 地址: ->
     * */
    /* 输入数量 */
    scanf("%d", &num);
    struct Members members[num];
    for (i = 0; i < num; i++) {
        /* 结构体赋值 */
        scanf("%d", &members[i].stuNo);

        /* 结构体字符数组元素的输入赋值 */
        scanf("%s", members[i].stuName);

        /* 输入年月日 */
        scanf("%d %d %d",
                /* 年 */
              &members[i].birthday.year,
                /* 月 */
              &members[i].birthday.month,
                /* 日 */
              &members[i].birthday.day);

        /* 输入成绩 */
        scanf("%d %d %d",
                /* 输入学生的平时成绩 */
              &members[i].stuScore.normalGrades,
                /* 输入学生的实验成绩 */
              &members[i].stuScore.experimentalGrades,
                /* 输入学生的期末成绩 */
              &members[i].stuScore.finalGrades
        );

    }

    printf("%-10s%-10s%-12s%-4s%-4s%-4s%-4s\n","num","name","birthday","s1","s2","s3","sum");
    /* 结构体输出 */
    for (i = 0; i < num; i++) {
        members[i].stuScore.generalCommentGrades = 0;

        /* 总评成绩 = 平时成绩*0.2+实验成绩*0.3+期末成绩*0.5 */
        int finallyScore = (members[i].stuScore.normalGrades * 0.2) + (members[i].stuScore.experimentalGrades * 0.3) +
                           (members[i].stuScore.finalGrades * 0.5);
        /* 学号10列列宽,左对齐;
         * 姓名10列列宽,左对齐;
         * 出生日期的年份原样输出,月份为2列列宽右对齐,日为4列列宽左对齐;
         * 平时成绩、实验成绩、期末成绩和总评成绩均为4列列宽,左对齐
         * */
        printf("%-10d%-10s%-4d/%2d/%-4d%-4d%-4d%-4d%-4d",
                /* 输出学号 */
               members[i].stuNo,
                /* 输出学生姓名 */
               members[i].stuName,
                /* 输出学生出生的年分 */
               members[i].birthday.year,
                /* 输出学生出生的月分 */
               members[i].birthday.month,
                /* 输出学生出生的 天数  */
               members[i].birthday.day,
                /* 平时成绩 */
               members[i].stuScore.normalGrades,
                /* 实验成绩 */
               members[i].stuScore.experimentalGrades,
                /* 期末成绩 */
               members[i].stuScore.finalGrades,
                /* 总评成绩= 平时成绩*0.2 + 实验成绩*0.3 + 期末成绩*0.5 */
               finallyScore
        );
        /* 完成一个学生信息后换行 */
        printf("\n");
    }
    return 0;
}

  • 列宽限制输出
	// 对于列表头可以使用字符串输出 可以实现限制列宽
	printf("%-12s","name");

	说明: 
		%-12s 以12列宽左侧对齐输出
		%12s 以12列宽右侧对齐输出
			

你可能感兴趣的:(C,c语言)