实验九实验报告卓越14彭佳伟.docx

上传人:b****6 文档编号:8822559 上传时间:2023-02-01 格式:DOCX 页数:20 大小:76.53KB
下载 相关 举报
实验九实验报告卓越14彭佳伟.docx_第1页
第1页 / 共20页
实验九实验报告卓越14彭佳伟.docx_第2页
第2页 / 共20页
实验九实验报告卓越14彭佳伟.docx_第3页
第3页 / 共20页
实验九实验报告卓越14彭佳伟.docx_第4页
第4页 / 共20页
实验九实验报告卓越14彭佳伟.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

实验九实验报告卓越14彭佳伟.docx

《实验九实验报告卓越14彭佳伟.docx》由会员分享,可在线阅读,更多相关《实验九实验报告卓越14彭佳伟.docx(20页珍藏版)》请在冰豆网上搜索。

实验九实验报告卓越14彭佳伟.docx

实验九实验报告卓越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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1