C语言程序设计 自定义数据类型

本文详细介绍了C语言中结构体、共用体的定义与使用,包括结构体数组、结构体指针的应用,以及如何在实际编程中区分它们。通过实例演示了如何存储和操作员工、学生信息,以及计算农历年份和日期转换。
摘要由CSDN通过智能技术生成

前言

  C语言程序设计实验,分享记录。

(1)掌握结构体、共用体类型的定义和使用方法;

(2)学会使用结构体数组及结构体指针;

(3)学会使用结构体变量以及结构体指针作为函数参数实现函数调用;

(4)掌握结构体和共用体在定义及使用上的区别,并能在编程时合理应用。

程序题目及实现

(1)定义一个员工数据的结构体变量,其中包括员工编号、姓名、性别、年龄、所在部门等信息。编写一个程序,从键盘输入这些数据并显示出来。 
提示:注意结构体各成员数据类型的合理性;通过键盘输入时应注意在输入字符串与字符时,接收到的数据是否正确。 

# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <string.h>
void main() {
	struct member
	{
		int sno;
		char sname[20];
		char ssex[1];
		int sage;
		char sdept[50];
	};
	struct member scm;
	printf("-------请输入员工相关信息-------");
	printf("\n请输入员工编号:");
	scanf("%d", &scm.sno);
	printf("请输入员工姓名:");
	scanf("%s", scm.sname);
	printf("请输入员工性别:");
	scanf("%s", scm.ssex);
	printf("请输入员工年龄:");
	scanf("%d", &scm.sage);
	printf("请输入员工部门:");
	scanf("%s", scm.sdept);
	printf("\n员工编号\t姓名\t性别\t年龄\t部门\n");
	printf("%d\t%s\t%s\t%d\t%s", scm.sno, scm.sname, scm.ssex, scm.sage, scm.sdept);
}


(2)编写程序,可以存储多名学生的各项基本信息(包括学号、姓名、性别、年龄)以及三门功课(C 语言程序设计、数据库、离散数学)的成绩,然后按照 C 语言程序设计的成绩从高分到低分进行排序,并输出各学生的所有信息。 
提示:多名学生可以用结构体数组定义,用冒泡或选择等排序方法对结构体数组的成员变量(C 语言成绩)进行排序。 

# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>

# define M 5
# define N 3
# define K 20

struct student {
    char sno[20];
    char sname[10];
    char ssex[2];
    int sage;
    float grades[N];
}st[M];

void sort(struct student arr[], int n) {
    int i, j;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j].grades[0] < arr[j + 1].grades[0]) {
                // 交换学生信息的顺序
                struct student tempSt = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tempSt;
            }
        }
    }
}

int main() {
    char course_names[N][K];

    // 输入课程名
    for (int i = 0; i < N; i++) {
        printf("请输入第 %d 门课程名:", i + 1);
        scanf("%s", course_names[i]);
    }

    // 输入学生信息和成绩
    for (int i = 0; i < M; i++) {
        printf("请输入第 %d 个学生的学号:", i + 1);
        scanf("%s", st[i].sno);

        printf("请输入第 %d 个学生的姓名:", i + 1);
        scanf("%s", st[i].sname);

        printf("请输入第 %d 个学生的性别:", i + 1);
        scanf("%s", st[i].ssex);

        printf("请输入第 %d 个学生的年龄:", i + 1);
        scanf("%d", &st[i].sage);

        for (int j = 0; j < N; j++) {
            printf("请输入第 %d 个学生的 %s 成绩:", i + 1, course_names[j]);
            scanf("%f", &st[i].grades[j]);
        }
    }

    // 对学生按照第一门课程成绩排序
    sort(st, M);

    // 输出表头信息
    printf("sno\t sname\t ssex\t sage\t");
    for (int j = 0; j < N; j++) {
        printf(" %s\t", course_names[j]);
    }
    printf("\n");

    for (int i = 0; i < M; i++) {
        printf("%s\t %s\t %s\t %d\t", st[i].sno, st[i].sname, st[i].ssex, st[i].sage);
        for (int j = 0; j < N; j++) {
            if (j == 1)
                printf("   ");
            printf("%10.2f", st[i].grades[j]);
            
        }
        printf("\n");
    }

    return 0;
}


(3)编写一个计算农历年份的程序,要求能够推演出某个年份的天干地支以及生肖。 
注意:由键盘输入某个年份。 

# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>

enum TianGan { 甲, 乙, 丙, 丁, 戊, 己, 庚, 辛, 壬, 癸 };
enum DiZhi { 子, 丑, 寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥 };
enum ShengXiao { 鼠, 牛, 虎, 兔, 龙, 蛇, 马, 羊, 猴, 鸡, 狗, 猪 };

int main() {
    int year, t, d;
    printf("请输入想要计算的年份:");
    scanf("%d", &year);
    t = (year - 4) % 10;
    d = (year - 4) % 12;
    printf("%d年,是", year);
    switch (t) {
    case 甲: printf("甲"); break;
    case 乙: printf("乙"); break;
    case 丙: printf("丙"); break;
    case 丁: printf("丁"); break;
    case 戊: printf("戊"); break;
    case 己: printf("己"); break;
    case 庚: printf("庚"); break;
    case 辛: printf("辛"); break;
    case 壬: printf("壬"); break;
    case 癸: printf("癸"); break;
    }

    switch (d) {
    case 子: printf("子"); break;
    case 丑: printf("丑"); break;
    case 寅: printf("寅"); break;
    case 卯: printf("卯"); break;
    case 辰: printf("辰"); break;
    case 巳: printf("巳"); break;
    case 午: printf("午"); break;
    case 未: printf("未"); break;
    case 申: printf("申"); break;
    case 酉: printf("酉"); break;
    case 戌: printf("戌"); break;
    case 亥: printf("亥"); break;
    }

    switch (d) {
    case 鼠: printf("鼠"); break;
    case 牛: printf("牛"); break;
    case 虎: printf("虎"); break;
    case 兔: printf("兔"); break;
    case 龙: printf("龙"); break;
    case 蛇: printf("蛇"); break;
    case 马: printf("马"); break;
    case 羊: printf("羊"); break;
    case 猴: printf("猴"); break;
    case 鸡: printf("鸡"); break;
    case 狗: printf("狗"); break;
    case 猪: printf("猪"); break;
    }
    printf("年\n");
    return 0;
}


(4)拓展题(选)编写程序,从键盘输入日期及天数,然后计算出新的日期。如:输入的日期是 2012 年 3 月 4 日,输入的天数是 45 天,则经过 45 天后的新日期是:2012 年 4 月 18 日。 
注意:计算时应该考虑闰年。

# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>

int fun(int year) {
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        return 1;
    else
        return 0;
}

int getday(int year, int month) {
    int monthday[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    if (fun(year))
        monthday[2] = 29;
    return monthday[month];
}

void newdate(int year, int month, int day, int dayadd) {
    int tempdayadd = dayadd; // 暂存添加日期,方便后面输出
    while (dayadd > 0) {
        int monthday = getday(year, month); // 计算这个月有多少天

        if (day + dayadd > monthday) {
            // 天数超过当前月的总天数,进入下一个月
            dayadd -= (monthday - day + 1); // 更新剩余天数
            day = 1;
            month++;

            if (month > 12) {
                // 进入下一年
                month = 1;
                year++;
            }
        }
        else {
            // 天数未超过当前月的总天数,结束循环
            day += dayadd;
            dayadd = 0;
        }
    }
    // 输出新日期
    printf("经过 %d 天后的新日期是:%d 年 %d 月 %d 日\n", tempdayadd, year, month, day);
}

int main() {
    int year, month, day, dayadd;

    printf("请输入日期(xx年xx月xx日):");
    scanf("%d年%d月%d日", &year, &month, &day);
    printf("请输入要添加的天数:");
    scanf("%d", &dayadd);
    newdate(year, month, day, dayadd);
    return 0;
}

总结

        在本章实验中,掌握了结构体、共用体类型的定义和使用方法,以及结构体数组及结构体指针。学会使用结构体变量以及结构体指针作为函数参数实现函数调用。还知道了结构体和共用体在定义及使用上的区别,并能在编程时合理应用。通过使用结构体还了解到了,在操作位结构体时要关注变量的位域是否在一个变量类型(uint_32或者uint_8)上,判断占用空间大小。当使用结构体变量时,使用.来获取数据;使用结构体指针变量时,使用箭头。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值