c语言5次上机.docx
- 文档编号:17353850
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:32
- 大小:70.35KB
c语言5次上机.docx
《c语言5次上机.docx》由会员分享,可在线阅读,更多相关《c语言5次上机.docx(32页珍藏版)》请在冰点文库上搜索。
c语言5次上机
C语言程序设计实验报告
班级日期2012/6/1
学生姓名学号
第5次上机
实验结构与联合
(一)实验目的
(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
100
100
2
p++,p->c
a的首地址,‘B’
a的首地址,‘B’
3
*p++->t,*p->t
U,x
U,x
4
*(++p)->t
x
x
5
*++p->t
V
V
6
++*p->t
V
V
#include
charu[]="UVWXYZ";
charv[]="xyz";
structT{
intx;
charc;
char*t;
}a[]={{11,'A',u},{100,'B',v}},*p=a;
voidmain()
{
printf("(++p)->x=%d\n",(++p)->x);
p=a;
printf("p++=%p,&a=%p",p++,&a);
printf("p->c=%c\n",p->c);
p=a;
printf("*p++->t=%c",*p++->t);
printf("*p->t=%c\n",*p->t);
p=a;
printf("*(++p)->t=%c\n",*(++p)->t);
p=a;
printf("*++p->t=%c\n",*++p->t);
--p->t;
p=a;
printf("++*p->t=%c\n",++*p->t);
}
2.源程序修改、替换
下面所给源程序的功能是:
给定一批整数,以0作为结束标志且不作为结点,将其建成一个先进先出的链表。
先进先出链表的头指针始终指向最先创建的结点(链头),先建结点指向后建结点,后建结点始终是尾结点。
请完成以下工作:
(1)源程序中存在什么样的错误(先观察执行结果)?
对程序进行修改、调试,使之能够正确完成指定任务。
(2)修改替换create_list函数,将其建成一个后进先出的链表,后进先出链表的头指针始终指向最后创建的结点(链头),后建结点指向先建结点,先建结点始终是尾结点。
源程序:
#include"stdio.h"
#include"stdlib.h"
structs_list{
intdata;/*数据域*/
structs_list*next;/*指针域*/
};
voidcreate_list(structs_list*headp,int*p);
voidmain(void)
{
structs_list*head=NULL,*p;
ints[]={1,2,3,4,5,6,7,8,0};/*0为结束标记*/
create_list(head,s);/*创建新链表*/
p=head;/*遍历指针p指向链头*/
while(p){
printf("%d\t",p->data);/*输出数据域的值*/
p=p->next;/*遍历指针p指向下一结点*/
}
printf("\n");
}
voidcreate_list(structs_list*headp,int*p)
{
structs_list*loc_head=NULL,*tail;
if(p[0]==0)/*相当于*p==0*/
;
else{/*loc_head指向动态分配的第一个结点*/
loc_head=(structs_list*)malloc(sizeof(structs_list));
loc_head->data=*p++;/*对数据域赋值*/
tail=loc_head;/*tail指向第一个结点*/
while(*p){/*tail所指结点的指针域指向动态创建的结点*/
tail->next=(structs_list*)malloc(sizeof(structs_list));
tail=tail->next;/*tail指向新创建的结点*/
tail->data=*p++;/*向新创建的结点的数据域赋值*/
}
tail->next=NULL;/*对指针域赋NULL值*/
}
headp=loc_head;/*使头指针headp指向新创建的链表*/
}
(1)
函数第一个形参应该是双重指针
#include"stdio.h"
#include"stdlib.h"
structs_list{
intdata;/*数据域*/
structs_list*next;/*指针域*/
};
voidcreate_list(structs_list**headp,int*p);
voidmain(void)
{
structs_list*head=NULL,*p;
ints[]={1,2,3,4,5,6,7,8,0};/*0为结束标记*/
create_list(&head,s);/*创建新链表*/
p=head;/*遍历指针p指向链头*/
while(p){
printf("%d\t",p->data);/*输出数据域的值*/
p=p->next;/*遍历指针p指向下一结点*/
}
printf("\n");
}
voidcreate_list(structs_list**headp,int*p)
{
structs_list*loc_head=NULL,*tail;
if(p[0]==0)/*相当于*p==0*/
;
else{/*loc_head指向动态分配的第一个结点*/
loc_head=(structs_list*)malloc(sizeof(structs_list));
loc_head->data=*p++;/*对数据域赋值*/
tail=loc_head;/*tail指向第一个结点*/
while(*p){/*tail所指结点的指针域指向动态创建的结点*/
tail->next=(structs_list*)malloc(sizeof(structs_list));
tail=tail->next;/*tail指向新创建的结点*/
tail->data=*p++;/*向新创建的结点的数据域赋值*/
}
tail->next=NULL;/*对指针域赋NULL值*/
}
*headp=loc_head;/*使头指针headp指向新创建的链表*/
}
(2)
voidcreate_list(structs_list**headp,int*p)
{
structs_list*loc_head=NULL,*tail,*q;
if(p[0]==0)
;
else{
loc_head=(structs_list*)malloc(sizeof(structs_list));
tail=loc_head;
q=tail;
q->next=NULL;
while(*p){
q->data=*p++;
tail=(structs_list*)malloc(sizeof(structs_list));
tail->next=q;
q=tail;
}
}
*headp=q->next;
}
3.程序设计
编写并上机调试运行能实现以下功能的程序或函数:
(1)编写一个程序,实现以下功能:
定义一个字段结构structbits,它将一个8位无符号字节从最低位向最高位声明为8个字段,各字段依次为bit0,bit1,…,bit7,且bit0的优先级最高。
同时设计8个函数,第i个函数以biti(i=0,1,2,…,7)为参数,并且在函数体内输出biti的值。
将8个函数的名字存入一个函数指针数组p_fun。
如果bit0为1,调用p_fun[0]指向的函数。
如果structbits中有多位为1,则根据优先级从高到低依次调用函数指针数组p_fun中相应元素指向的函数。
8个函数中的第0个函数可以设计为:
voidf0(structbitsb)
{
Printf(“thefunction%discalled!
\n”,b);
}
参考结构:
structbits{
unsignedcharbit0:
1;
unsignedcharbit1:
1;
unsignedcharbit2:
1;
unsignedcharbit3:
1;
unsignedcharbit4:
1;
unsignedcharbit5:
1;
unsignedcharbit6:
1;
unsignedcharbit7:
1;
};
unionbits_uc{
unsignedcharuc;
structbitsb;
};
void(*p_fun[8])(structbits);
(2)假设用单向链表建立一张班级成绩单,包括每个学生的学号、姓名、英语、高等数学、普通物理、C语言程序设计四门课程的成绩,试用函数编程实现下列功能:
①输入每个学生的各项信息。
②输出每个学生的各项信息。
③修改指定学生的指定数据项的内容。
④统计每个同学的平均成绩(保留2位小数)。
⑤输出各位同学的学号、姓名、四门课程的总成绩和平均成绩。
(3)采用双向链表重做第
(2)题。
(1)
#include
#include
structbits{
unsignedcharbit0:
1;//bit0的优先级最高。
同时设计8个函数,第i个函数以biti(i=0,1,2,…,7)为参数
//并且在函数体内输出biti的值。
将8个函数的名字存入一个函数指针数组p_fun。
如果bit0为1
//调用p_fun[0]指向的函数。
如果structbits中有多位为1
//则根据优先级从高到低依次调用函数指针数组p_fun中相应元素指向的函数
unsignedcharbit1:
1;
unsignedcharbit2:
1;
unsignedcharbit3:
1;
unsignedcharbit4:
1;
unsignedcharbit5:
1;
unsignedcharbit6:
1;
unsignedcharbit7:
1;
};
unionbits_uc{
unsignedcharuc;
structbitsb;
};
voidf0(structbitsb)
{
printf("\nthefunctionf0iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
voidf1(structbitsb)
{
printf("\nthefunctionf1iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
voidf2(structbitsb)
{
printf("\nthefunctionf2iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
voidf3(structbitsb)
{
printf("\nthefunctionf3iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
voidf4(structbitsb)
{
printf("\nthefunctionf4iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
voidf5(structbitsb)
{
printf("\nthefunctionf5iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
voidf6(structbitsb)
{
printf("\nthefunctionf6iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
voidf7(structbitsb)
{
printf("\nthefunctionf7iscalled!
\
(b0~b7:
%1d%1d%1d%1d%1d%1d%1d%1d)\n",b.bit0,b.bit1,b.bit2,b.bit3,b.bit4,b.bit5,b.bit6,b.bit7);
}
intmain(void)
{
structbitsb;
unionbits_ucub;
void(*p_fun[8])(structbits);
inti;
printf("\n");
for(i=0;i<10;i++)
if(i%4==0)printf("%d",i);
printf("\n");
for(i=0;i<10;i++)
if(i%4==1)printf("%d",i);
printf("\n");
for(i=0;i<10;i++)
if(i%4==2)printf("%d",i);
printf("\n");
for(i=0;i<10;i++)
if(i%4==3)printf("%d",i);
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;
b.bit0=1,b.bit1=1,b.bit2=1,b.bit3=0,b.bit4=0,b.bit5=0,b.bit6=0,b.bit7=1;
printf("\n%d",b);
ub.uc=67;
b=ub.b;
printf("\n%d",b);
i=0;
while(i<8){
switch(i){
case0:
if(b.bit0)
f0(b);
b.bit0=0;
break;
case1:
if(b.bit1)
f1(b);
b.bit1=0;
break;
case2:
if(b.bit2)
f2(b);
b.bit2=0;
break;
case3:
if(b.bit3)
f3(b);
b.bit3=0;
break;
case4:
if(b.bit4)
f4(b);
b.bit4=0;
break;
case5:
if(b.bit5)
f5(b);
b.bit5=0;
break;
case6:
if(b.bit6)
f6(b);
b.bit6=0;
break;
case7:
if(b.bit7)
f7(b);
b.bit7=0;
break;
}
i++;
}
return0;
}
(2)
#include
#include
structstu_list{
charnum[10];
charname[10];
intenglish;
intmath;
intphysics;
intc;
floatscores;
inttotalscores;
structstu_list*next;
};
structstu_list*head;
voidscan(int);
voidprint(int);
voidmodify();
voidscore(intn);
voidmain()
{
inti=0,m,n;
structstu_list*p,*q;
printf("thetotalnumberofstudentsis");
scanf("%d",&n);
scan(n);
print(n);
modify(n);
print(n);
score(n);
p=head;
for(m=1;m<=n;m++)
{
printf("theaveragescoreofstudent%dis%.2f\n",m,p->scores);
p=p->next;
}
q=head;
for(i=1;i<=n;i++)
{printf("theinformationis%s%s%d%.2f\n",q->num,\
q->name,q->totalscores,q->scores);
q=q->next;
}
}
voidscan(intn)
{
inti;
structstu_list*p;
p=(structstu_list*)malloc(sizeof(structstu_list));
p->next=NULL;
head=p;
printf("pleaseinputtheinformationofthe%dstudents\n",n);
for(i=1;i<=n;i++)
{
printf("pleaseinputtheinformationofthestudent%d\n",i);
scanf("%s%s%d%d%d%d",p->num,p->name,&p->english,&p->math,&p->physics,&p->c);
p->next=(structstu_list*)malloc(sizeof(structstu_list));
p=p->next;
}
}
voidprint(intn)
{
inti;
structstu_list*p;
p=head;
printf("pleaseoutputtheinformationofthenstudents\n");
for(i=1;i<=n;i++)
{
printf("theinformationofstudent%d:
\n",i);
printf("%s%s%d%d%d%d\n",p->num,p->name,p->english,p->math,p->physics,p->c);
p=p->next;
}
}
voidmodify()
{
intn,item;
inti=0;
structstu_list*p;
printf("whichstudent'sinformationdoyouwanttomodify?
\n");
scanf("%d",&n);
printf("whichitemdouyouwanttomodify?
\n");
scanf("%d",&item);
p=head;
while(i { p=p->next; i++; } switch(item) { case1: printf("pleaseinputthenewnumber: \n"); scanf("%s",p->num); printf("modifysucessfully,thenewnumberis%s\n",p->num); break; case2: printf("pleaseinputthenewname: \n"); scanf("%s",p->name); printf("modifysucessfully,thenewnameis%s\n",p->name); break; case3: printf("pleaseinputthenewscoreofenglish: \n"); scanf("%d",&p->english); printf("modifysucessfully,thenewscoreis%d\n",p->english); break; case4: printf("pleaseinputthenewscoreofmath: \n"); scanf("%d",&p->math); printf("modifysucessfully,thenewscoreis%d\n",p->math); break; case5: printf("please
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 上机