1.实验目的
(1)掌握结构体的定义与使用;
(2)掌握结构体数组的概念和应用;
(3)掌握链表的概念、设计与实现、以及应用。
2.实验内容
(1)课本例题,例9.7, 例9.11, 例9.12
(2)输入并运行以下程序:
#include <stdio.h>
union data
{
int i[2];
float a;
long b;
char c[4];
}u;
void main()
{
scanf("%d,%d",&u.i[0],&u.i[1]);
printf("i[0]=%d,i[1]=%d,a=%f,b=%ld,c[0]=%c,c[1]=%c,c[2]=%c,c[3]=%c\n",u.i[0],u.i[1],u. a,u.b,u.c[0],u.c[1],u.c[2],u.c[3]);
}
请分析以上程序运行的结果?
(3) 儿童信息链表构建
#include <stdio.h>
#include <stdlib.h>
struct Child // 链表结点结构体
{
// 结点数据
float height; float weight; int age; char gender;
// 后继结点地址
struct Child *next;
};
typedef struct Child ChildNode;
void inputChild( ChildNode* child ) // 结点数据输入函数
{
printf( "Age: " );
scanf( "%d", &child->age);
getchar();
printf( "Gender: " );
scanf( "%c", &child->gender);
printf( "Height: " );
scanf( "%f", &child->height);
printf( "Weight: " );
scanf( "%f", &child->weight);
}
void printList( ChildNode* child )
{
ChildNode *current;
current = child; // 遍历指针初始状态指向表头
while( current->next != NULL ){
current = current->next; // 当前指针移动到下一个结点
printf( "Age %d\t", current->age );
printf( "Gender %c\t", current->gender );
printf( "Height %f\t", current->height );
printf( "Weight %f\n", current->weight );
}
}
ChildNode* createList( int n ) // 生成链表
{
ChildNode *p, *child; int i;
// 建立一个空的头结点
child = (ChildNode*)malloc(sizeof(ChildNode));
child->next = NULL; // 初始化指针域
for( i = n; i > 0; --i ){ // 依次建立并向表头插入结点
// 创建新结点
p = (ChildNode *)malloc(sizeof(ChildNode));
inputChild( p ); // 输入数据到新结点
// 将新结点插入到表头结点之后
p->next = child->next; child->next = p;
}
return child;
}
void main()
{
ChildNode *childList = NULL;
int n;
printf( "Number of children: " );
scanf( "%d", &n );
childList = createList( n ); // 构造链表
printList(childList);
}
例题1
#include<stdio.h>
#define N 3
struct Student
{ int num;
char name[20];
float score[3];
float aver;
};
int main()
{
void input(struct Student stu[]);
struct Student max(struct Student stu[]);
void print(struct Student stu);
struct Student stu[N],*p=stu;
input(p);
print(max(p));
return 0;
}
void input(struct Student stu[])
{ int i;
printf("请输入各学生的信息:学号、姓名、三门课成绩:\n");
for(i=0;i<N;i++)
{scanf("%d%s%f%f%f",&stu[i].num ,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;}
}
struct Student max(struct Student stu[])
{ int i,m=0;
for(i=0;i<N;i++)
if(stu[i].aver>stu[m].aver) m=i;
return stu[m];
}
void print(struct Student stud)
{ printf("\n成绩最高的学生是:\n");
printf("学号:%d\n姓名:%s\n三门课成绩:%5.1f,%5.1f,%5.1f\n平均成绩:%6.2f\n",
stud.num ,stud.name ,stud.score[0],stud.score[1],stud.score[2],stud.aver);
}
#include<stdio.h>
struct
{ int num;
char name[10];
char sex;
char job;
union
{ int clas;
char position[10];
}category;
}person[2];
int main()
{ int i;
for(i=0;i<2;i++)
{ printf("please enter the data of person:\n");
scanf("%d%s%c%c",&person[i].num,&person[i].name,
&person[i].sex,&person[i].job);
if(person[i].job=='s')
scanf("%d",&person[i].category.clas);
else if(person[i].job=='t')
scanf("%s",person[i].category.position);
else
printf("Input error!");
}
printf("\n");
printf("No. name sex job class/position\n");
for(i=0;i<2;i++)
{
if(person[i].job=='s')//若是学生
printf("%-6d%-10s%-4c%-4c%-10d\n",person[i].num,person[i].name,
person[i].sex,person[i].job,person[i].category.clas);
else//若是老师
printf("%-6d%-10s%-4c%-4c%-10d\n",person[i].num,person[i].name,
person[i].sex,person[i].job,person[i].category.clas);
}
return 0;
}
例题3
#include<stdio.h>
int main()
{
enum Color{red,yellow,blue,white,black}; //声明枚举类型enum Color
int i,j,k,pri; //定义枚举变量i,j,k,pri
int n,loop;
n=0;
for(i=red;i<=black;i++) //外循环使i的值从red变到black
for(j=red;j<=black;j++) //中循环使j的值从red变到black
if(i!=j) //如果两球不同色
{ for(k=red;k<=black;k++) //内循环使k的值从red变到black
if((k!=i)&&(k!=j)) //如果三球不同色
{ n=n+1; //符合条件的次数加1
printf("%-4d",n); //输出当前是第几个符合条件的组合
for(loop=1;loop<=3;loop++) //先后对三个球分别处理
{
switch(loop) //loop的值从1变到3
{ case 1:pri=i;break; //loop的值为1时,把第1个球的颜色赋给pri
case 2:pri=j;break; //loop的值为2时,把第2个球的颜色赋给pri
case 3:pri=k;break; //loop的值为3时,把第3个球的颜色赋给pri
default:break;
}
switch(pri) //根据球的颜色输出相应的文字
{ case red:printf("%-10s","red");break; //pri的值等于枚举常量red时输出"red"
case yellow:printf("%-10s","yellow");break; //pri的值等于枚举常量yellow时输出"yellow"
case blue:printf("%-10s","blue");break; //pri的值等于枚举常量blue时输出"blue"
case white:printf("%-10s","white");break; //pri的值等于枚举常量white时输出"white"
case black:printf("%-10s","black");break; //pri的值等于枚举常量black时输出"black"
default:break;
}
}
printf("\n");
}}
printf("\ntotal:%5d\n",n);
return 0;
}