实验九实验报告卓越14彭佳伟.docx
《实验九实验报告卓越14彭佳伟.docx》由会员分享,可在线阅读,更多相关《实验九实验报告卓越14彭佳伟.docx(20页珍藏版)》请在冰豆网上搜索。
实验九实验报告卓越14彭佳伟
C语言程序设计实验报告
专业计算机科学与技术班级卓越工程师班
日期2014年1月13日成绩
第九次实验结构与联合实验指导教师李开
学生姓名彭佳伟学号U201414716
实验组别同组人姓名
实验名称结构与联合实验
一、实验目的
(1)熟悉和掌握结构的说明和引用、结构的指针、结构数组,以及函数中使用结构的方法。
(2)掌握动态存储分配函数的用法,掌握自引用结构和单向链表的创建、遍历、结点的增删、查找等操作。
(3)了解字段结构和联合的用法。
二、实验任务
1.表达式求值的程序验证
设有说明:
charu[]="UVWXYZ";
charv[]="xyz";
structT{
intx;
charc;
char*t;
}a[]={{11,'A',u},{100,'B',v}},*p=a;
请先自己计算表2.1中表达式的值,然后编写程序并运行来加以验证。
(各表达式相互无关)
表2.1表达式值的计算
序号
表达式
计算值
验证值
1
(++p)->x
2
p++,p->c
3
*p++->t,*p->t
4
*(++p)->t
5
*++p->t
6
++*p->t
2.源程序修改、替换
下面所给源程序的功能是:
给定一批整数,以0作为结束标志且不作为结点,将其建成一个先进先出的链表。
先进先出链表的头指针始终指向最先创建的结点(链头),先建结点指向后建结点,后建结点始终是尾结点。
请完成以下工作:
(1)源程序中存在什么样的错误(先观察执行结果)?
对程序进行修改、调试。
使之能够正确完成指定任务。
(2)修改替换creat_list函数,将其建成一个后进先出的链表。
后进先出的链表的头指针始终指向最后创建的结点(链头),后建结点指向先建结点,先建结点始终是尾结点。
源程序
#include
#include
structs_list{
intdata;
structs_list*next;
};
voidcreat_list(structs_list*headp,int*p);
intmain(void)
{
structs_list*head=NULL,*p;
ints[]={1,2,3,4,5,6,7,8,0};
creat_list(head,s);
p=head;
while(p)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
return0;
}
voidcreat_list(structs_list*headp,int*p)
{
structs_list*loc_head=NULL,*tail;
if(p[0]==0)
;
else
{
loc_head=(structs_list*)malloc(sizeof(structs_list));
loc_head->data=*p++;
tail=loc_head;
while(*p)
{
tail->next=(structs_list*)malloc(sizeof(structs_list));
tail=tail->next;
tail->data=*p++;
}
tail->next=NULL;
}
headp=loc_head;
}
3.程序设计
编写并上机调试运行能实现以下功能的程序或函数:
(1)编写一个程序,实现以下功能:
定义一个字段结构structbits,它将一个8位无符号字节从最低位向最高位声明为8个字段,各字段依次为bit0,bit1,……bit7,且bit0的优先级最高。
同时设计8个函数,第i个函数以biti(i=0,1,……7)为参数,并且在函数体内输出biti的值。
将8个函数的名字存入一个函数指针数组p_fun。
如果bit0为1,调用p_fun[0]指向的函数。
如果structbits中有多位为1,则根据优先级从高到低依次调用函数指针数组p_fun中相应元素指向的函数。
8个函数中的第0个函数可以设计为
Voidf0(structbitsb)
{
Printf(“thefunction%discalled!
\n”,b);
}
(3)设计用单词链表建立一张班级成绩单,包括每个学生的学号、姓名、英语、高等数学、普通物理、C语言程序设计四门课程的成绩,试用函数编程实现下列功能:
1输入每个学生的各项信息。
2输出每个学生的各项信息。
3修改指定学生的指定数据项的内容。
4统计每个同学的平均成绩(保留两位小数)。
5输出各位同学的学号、姓名、四门课程的总成绩和平均成绩。
4.选做题
(1)对上述程序设计题中第
(2)题的程序,增加按照平均成绩进行升序排序的函数,试写出用交换结点数据域的方法升序排序的函数,排序可用选择法或冒泡法。
(2)对选做题第
(1)题,进一步写出用交换结点指针域的方法升序排序的函数。
(3)采用双向链表重做编程设计题中的第
(2)题。
三、实验步骤及结果
1、
序号
表达式
计算值
验证值
1
(++p)->x
100
100
2
p++,p->c
‘B’
‘B’
3
*p++->t,*p->t
‘X’
‘X’
4
*(++p)->t
‘X’
‘X’
5
*++p->t
‘V’
‘V’
6
++*p->t
‘V’
‘V’
2、
(1)错误:
create_list函数中传入的是一级指针,应该传入二级指针。
修改后代码:
#include
#include
structs_list{
intdata;
structs_list*next;
};
voidcreat_list(structs_list**headp,int*p);
intmain(void)
{
structs_list*head=NULL,*p;
ints[]={1,2,3,4,5,6,7,8,0};
creat_list(&head,s);
p=head;
while(p)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
return0;
}
voidcreat_list(structs_list**headp,int*p)
{
structs_list*loc_head=NULL,*tail;
if(p[0]==0)
;
else
{
loc_head=(structs_list*)malloc(sizeof(structs_list));
loc_head->data=*p++;
tail=loc_head;
while(*p)
{
tail->next=(structs_list*)malloc(sizeof(structs_list));
tail=tail->next;
tail->data=*p++;
}
tail->next=NULL;
}
*headp=loc_head;
}
运行结果:
(2)源代码:
#include
#include
structs_list{
intdata;
structs_list*next;
};
voidcreat_list(structs_list**headp,int*p);
intmain(void)
{
structs_list*head=NULL,*p;
ints[]={1,2,3,4,5,6,7,8,0};
creat_list(&head,s);
p=head;
while(p)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
return0;
}
voidcreat_list(structs_list**headp,int*p)
{
structs_list*loc_head=NULL,*temp=NULL;
if(p[0]==0)
;
else
{
while(*p)
{
loc_head=(structs_list*)malloc(sizeof(structs_list));
loc_head->data=*p++;
loc_head->next=temp;
temp=loc_head;
}
}
*headp=loc_head;
}
运行结果:
3、
(1)源代码:
#include
structbits
{
unsignedcharbit0:
1;
unsignedcharbit1:
1;
unsignedcharbit2:
1;
unsignedcharbit3:
1;
unsignedcharbit4:
1;
unsignedcharbit5:
1;
unsignedcharbit6:
1;
unsignedcharbit7:
1;
};
unionw
{
structbitsa;
unsignedchart;
}m;
voidf0(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
voidf1(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
voidf2(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
voidf3(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
voidf4(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
voidf5(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
voidf6(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
voidf7(unsignedcharbit)
{
printf("thefunction%discalled!
\n",bit);
}
intmain(intargc,charconst*argv[])
{
unsignedintn;
void(*p_fun[8])(unsignedcharb);
printf("inputn:
");
scanf("%d",&n);
m.t=n;
p_fun[0]=f0;
p_fun[1]=f1;
p_fun[2]=f2;
p_fun[3]=f3;
p_fun[4]=f4;
p_fun[5]=f5;
p_fun[6]=f6;
p_fun[7]=f7;
if(m.a.bit0)
p_fun[0](m.a.bit0);
if(m.a.bit1)
p_fun[1](m.a.bit1);
if(m.a.bit2)
p_fun[2](m.a.bit2);
if(m.a.bit3)
p_fun[3](m.a.bit3);
if(m.a.bit4)
p_fun[4](m.a.bit4);
if(m.a.bit5)
p_fun[5](m.a.bit5);
if(m.a.bit6)
p_fun[6](m.a.bit6);
if(m.a.bit7)
p_fun[7](m.a.bit7);
return0;
}
运行结果:
3.
(2)源代码:
#include
#include
#include
#include
typedefstructStudentStudent;
structStudent
{
intnumber;
charname[10];
floatenglish;
floatmath;
floatphysics;
floatc;
floataverage;
floatsum;
Student*next;
};
voidInput(Student**head);
voidOutput(Student*head);
voidChangeInfo(Student*head);
voidSort(Student*head);
intmain(void)
{
Student*head=NULL;
intn;
intflag=1;
while(flag==1)
{
printf("Pleaseinputthenumberofoptions:
\n");
printf("1:
InputInformation\t2:
ChangeInformation\n");
printf("3:
OutputInformation\t4:
SortInformation\n");
printf("5:
Quit\n");
scanf("%d",&n);
switch(n)
{
case1:
Input(&head);
break;
case2:
ChangeInfo(head);
break;
case3:
Output(head);
break;
case4:
Sort(head);
break;
case5:
flag=0;
break;
default:
printf("IllegalInput!
Pleaseinputagain.");
break;
}
printf("\n\n");
}
return0;
}
voidInput(Student**head)
{
//采用的是后进先出的单向链表
charanswer='y';
while(answer=='y')
{
Student*current=NULL;
current=(Student*)malloc(sizeof(Student));
current->next=*head;
*head=current;
printf("\nPleaseinputthestudent'snumber:
");
scanf("%d",¤t->number);
printf("Pleaseinputthestudent'sname:
");
scanf("%s",current->name);
printf("Pleaseinputthescoreofenglish:
");
scanf("%f",¤t->english);
printf("Pleaseinputthescoreofmath:
");
scanf("%f",¤t->math);
printf("Pleaseinputthescoreofphysics:
");
scanf("%f",¤t->physics);
printf("Pleaseinputthescoreofc:
");
scanf("%f",¤t->c);
current->sum=current->english+current->math+current->physics+current->c;
current->average=current->sum/4;
printf("Doyouwanttoinputtheinfomationofanotherstudent?
(Y/N)");
scanf("%c",&answer);
answer=tolower(answer);
}
}
voidOutput(Student*head)
{
if(head==NULL)
{
printf("Youhavenotinputanyinformation!
");
}
else
{
printf("\n\n\t\tTheInfomationOfStudents\n");
do{
printf("name:
%s\t\t",head->name);
printf("number:
%d\t\t",head->number);
printf("english:
%.2f\t",head->english);
printf("math:
%.2f\t",head->math);
printf("physics:
%.2f\n\n",head->physics);
printf("c:
%.2f\t",head->c);
printf("sum:
%.2f",head->sum);
printf("average:
%.2f",head->average);
head=head->next;
}while(head!
=NULL);
}
}
voidChangeInfo(Student*head)
{
if(head==NULL)
{
printf("Youhavenotinputanyinformation!
");
}
else
{
Student*current=head;
charname[10];
intflag=0;
intn;
printf("Pleaseinputthestudent'sname:
");
scanf("%s",name);
while(current->next!
=NULL)
{
if(strcmp(name,current->name)!
=0)
{
current=current->next;
}
else
{
flag=1;
printf("Pleaseinputthenumberofoptions:
\n");
printf("1:
english\t2:
math\t3:
physics\t4:
c\t5:
name\t6:
number\n");
scanf("%d",&n);
switch(n)
{
case1:
printf("Pleaseinputthescoreofenglish:
");
scanf("%f",¤t->english);
break;
case2:
printf("Pleaseinputthescoreofmath:
");
scanf("%f",¤t->math);
break;
case3:
printf("Pleaseinputthescoreofphysics:
");
scanf("%f",¤t->physics);
break;
case4:
printf("Pleaseinputthescoreofc:
");
scanf("%f",¤t->c);
break;
case5:
printf("Pleaseinputthestudent'sname:
");
scanf("%s",current->name);
break;
case6:
printf("Pleaseinputthestudent'snumber:
");
scanf("%d",¤t->number);
default:
break;
}
}
if(n<=3)
{
current->sum=current->english+current->math+current->physics+current->c;
current->average=current->sum/4;
}
break;
}
}
}
voidSort(Student*head)
{
//采用的是冒泡排序
//交换的是数据域,不是指针
if(head==NULL)
{
printf("Youhavenotinputanyinformation!
");
}
else
{
Studenttemp;
while(head->next!
=NULL)
{
Student*current=head;
while(current->next!
=NULL)
{
if(current->averagenext->average)
{
temp=*current;
temp.next=current->next->n