前言
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)上,判断占用空间大小。当使用结构体变量时,使用.来获取数据;使用结构体指针变量时,使用箭头。