本篇提供了关于C语言程序设计中结构体和共用体部分的经典案例,可供C语言的初学者们进行一个学习和编译练习。
/*Case 1
学生信息存取
输入一名学生的学号、姓名、年龄和身高等信息,然后再把所有输入的信息一一输出到屏幕上*/
typedef struct Student {
int num;
char name[20];
int age;
float height;
}STU;
int main() {
STU stu;
scanf("%d%s%d%f", &stu.num, &stu.name, &stu.age, &stu.height);
printf("%d %s %d %.2f\n", stu.num, stu.name, stu.age, stu.height);
return 0;
}
/*Case 2
结构体指针
用两种方法把小明的基本信息输出*/
typedef struct Student {
int num;
char name[20];
int age;
float height;
}STU;
int main() {
STU ming;
STU* m; //定义一个结构体指针
m = &ming;
scanf("%d%s%d%f", &m->num, &m->name, &m->age, &m->height);
printf("First:");
printf("%d %s %d %.lf\n", ming.num, ming.name, ming.age, ming.height);
printf("Second:");
printf("%d %s %d %.lf\n", m->num, m->name, m->age, m->height);
return 0;
}
/*Case 3
求学生平均成绩
通过编程依次输入学生的学号、姓名和三门课程的成绩,计算出平均成绩并依次把每名学生的学号、姓名和平均成绩打印*/
struct student {
char num[6];
char name[10];
int score[3];
float average;
}stu[5];
int main() {
int i, k;
int j;
float sum;
for ( i = 0; i < 3; i++)
{
printf("请依次输入学生的信息:\n");
printf("请输入学号:\n");
scanf("%s", stu[i].num);
printf("请输入姓名:\n");
scanf("%s", stu[i].name);
sum = 0;
for ( j = 0; j < 3; j++)
{
printf("分数%d:\n",j+1);
scanf("%d", &stu[i].score[j]);
sum += stu[i].score[j];
}
stu[i].average = sum / 3;
printf("-----------------------------\n");
}
for ( k = 0; k < 3; k++) //输出三个学生的信息以及平均成绩
{
printf("学号:%s\n",stu[k].num);
printf("姓名:%s\n",stu[k].name);
printf("平均成绩:%.lf\n",stu[k].average);
}
return 0;
}
/*Case 4
师生信息统计表
设计一个师生信息统计表,将老师与学生的信息统计在一个表格中,如果是学生就记录其姓名、性别、角色、所在教室,如果是老师就记录其姓名、性别、角色、所在办公室。*/
struct
{
int num;
char name[20];
char gender;
char role;
union
{
int classname;
char office[10];
}dept;
}person[3];
int main() {
int i;
for ( i = 0; i < 3; i++)
{
printf("请输入第%d个人的信息:\n",i+1);
printf("姓名:");
scanf("%s", person[i].name);
getchar();
printf("性别:");
scanf("%c", &person[i].gender);
getchar();
printf("角色:");
scanf("%c", &person[i].role);
if (person[i].role=='s')
{
printf("班级:");
scanf("%d", &person[i].dept.classname);
}
else
{
printf("办公室:");
scanf("%s", &person[i].dept.office);
}
}
printf(" 姓名 性别 角色 部门\n");
for ( i = 0; i < 3; i++)
{
if (person[i].role=='s')
{
printf("%6s%6c%6c%10d\n", person[i].name, person[i].gender, person[i].role, person[i].dept.classname);
}
else
{
printf("%6s%6c%6c%10s\n", person[i].name, person[i].gender, person[i].role, person[i].dept.office);
}
}
return 0;
}
/*Case 5
打鱼还是晒网
某人从2000年1月1日开始“三天打鱼两天晒网”,任意输入某一天,判断这一天是打鱼还是晒网*/
typedef struct date {
int year;
int month;
int day;
}DATE;
int days(DATE today) {
static int day_tab[2][13] = { { 0,31,28,31,30,31,30,31,31,30,31,30,31 },
{ 0,31,29,31,30,31,30,31,31,30,31,30,31 } }; //每月的天数
int i, leap;
leap = today.year % 4 == 0 && today.year % 100 != 0 || today.year % 400 == 0;
//判断year是闰年还是平年,leap=0为平年,leap=1为闰年
for ( i = 1; i < today.month; i++) //计算本年中自1月1日起的天数
{
today.day += day_tab[leap][i];
}
return today.day;
}
int main() {
DATE today, term;
int yearday, year, day;
printf("请输入年/月/日:\n");
scanf("%d/%d/%d", &today.year, &today.month, &today.day);
term.month = 12; //设置月份初始值
term.day = 31; //设置某日的初始值
for (yearday= 0,year=2000; year < today.year; year++)
{
term.year = year;
yearday += days(term); //计算从2000年至指定年的前一年一共有多少天
}
yearday += days(today); //加上指定年中到指定日期的天数
day = yearday % 5; //求余数
if (day>0&&day<4)
{
printf("打鱼!");
}
else
{
printf("晒网!");
}
return 0;
}
/*Case 6
初识链表*/
#include <malloc.h>
struct node
{
int data;
struct node* next; //结构体指针
};
typedef struct node NODE; //取别名NODE
NODE* create(int n) //自定义一个创建链表的函数
{
int i, a;
NODE* head = NULL;
NODE* p1 = NULL;
NODE* p2 = NULL;
printf("请输入全部数据:");
for ( i = n; i >0; --i)
{
p1 = (NODE*)malloc(sizeof(NODE)); //分配空间
scanf("%d", &a);
p1->data = a; //给数据域赋值
if (NULL==head) //指定头结点
{
head = p1;
p2 = p1;
}
else
{
p2->next = p1; //指定后继结点
p2 = p1;
}
}
p2->next = NULL;
return head; //返回头节点
}
int main() {
int n;
NODE* p;
printf("请输入链表结点个数:");
scanf("%d", &n);
p = create(n);
printf("结果:\n");
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
本篇的所有代码是在VS编译环境下操作的,如有错误,望大家指正!!!