实验十五 结构体和共用体
班级______________姓名___________指导老师_____________成绩___________
第_____________机房___________号机器 时间:________________________
实验目的:1,理解结构体和共用体的定义方式和内存分配情况。
2,掌握指向结构体的类型数据的指针定义与使用。
3,掌握链表的建立、插入和删除等操作。
实验要求:上机实验前,认真预习实验内容,先人工分析程序写出应得分析结果,然后上机运行、调试程序,得出最终正确结果。
实 验 内 容
一、读程序
要求:编辑下面源程序,并且读懂与分析运行程序,上机运行程序,并与分析结果相对比。
1,
#include <stdio.h>
void main( )
{
struct complex
{int x,y;
}cnum[2]={1,3,2,7};
printf(“\n%d”,cnum[0].y/cnum[0].x*cnum[1].x);
}
分析结果
运行结果
2,
include<stdio.h>
main()
{ static struct SX
{char c[4],*x;
}sx1={“abc”,”def”};
static struct SY
{char *cp;
struct SX sx2;
第一部分 C语言程序设计上机指导
·83·
·83·
}sy1={“ghi”,{“jkl”,”mno”}};
printf(“sx1.c[0]=%c\t *sx1.x=%s\n”,sx1.c[0],*sx1.x);
printf(“sx1.c=%s\t sx1.x=%s\n”,sx1.c,sx1.x);
printf(“sy1.cp=%s\t sy1.sx2.x=%s\n”,sy1.cp,sy1.sx2.x);
printf(“++sy1.cp=%s\t ++sy1.sx2.x=%x\n”,++sy1.cp,++sy1.sx2.x);
}
分析结果
运行结果
3,
# include <stdio.h>
void main( )
{
union
{char s[2];
int i;
}g;
g.i=0x4142;
printf(“g,i=%x\n”,g,i);
printf(“g,s[0]=%x,g,s[1]=%x\n”,g,s[0],g.s[1]);
g.s[0]=1; g.s[1]=0;
printf(“g,i=%x\n”,g,i);
}
分析结果
运行结果
4,
#include <stdio.h>
struct stru
{int x;
char c;
};
void func(struct stru b);
void main( )
{struct stru a={10,’x’};
func(a);
printf(“\n%d,%c/n”,a.x,a.c);
}
void func(struct stru b)
{b.x=20;
b.c=’y’;
}
分析结果
运行结果
C语言程序设计上机指导与同步训练
·84·
·84·
5,
#include <stdio.h>
#define n 10
struct data
{int no;
int num;
};
void main()
{
int i,j;
struct data array[n],temp;
printf(“输入10个整数:”);
for(i=0;i<n;i++)
{
scanf(“%d”,&array[i].num);
array[i].no=i;
}
for(i=0;i<n;i++)
for(j=0;j<n-i-1;j++)
{
if(array[j].num>array[j+1].num)
{temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
printf(“输出结果\n”);
printf(“序号 值 原序号\n”);
for(i=0;i<n;i++)
printf(“%3d%4d%4d\n”,i,array[i].num,array[i].no);
printf(“\n”);
}
6,
#include <stdio.h>
main()
{struct
{int x;
int y;
}s[2]={{1,2},{3,4}},*p=s;
printf(“\n%d”,++p→x);
printf(“\n%d”,(++p)→x);
}
两条printf语句改为一条:printf(“\n%d,%d”,++p→x,(++p) →x);重新运行程序。
分析结果
运行结果
第一部分 C语言程序设计上机指导
·85·
·85·
分析结果
运行结果
7,
#include <stdio.h>
void main()
{
struct example
{
union
{
int x;
int y;
}in;
int a;
int b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf(“\n%d,%d”,e.in.x,e.in.y);
}
分析结果
运行结果
二、完成程序
要求:依据题目要求,分析已给出的语句,填写空白。但是不要增行或删行,不要改动程序的结构。
1,编程:输入一个长整数,分别取出该数各字节的值。
#include <stdio.h>
union data
{
char s[5];
long n;
};
void main()
{
union data val;
int i,ns=sizeof(long);
printf(“输入一个长整数:”);
scanf( );
printf(“各字节如下:;\n)
for(i=0;i<ns;i++)
printf(“第%d个字节:%s\n”,i,val.s[i]);
printf(“\n”);
}
C语言程序设计上机指导与同步训练
·86·
·86·
2,编程:输入一串整数,以0标识结束,将输入的整数构成一个单链表并显示输出。
#include <stdio.h>
#include <malloc.h>
#define null 0
struct node
{
int data;
struct node *next;
};
struct node *create ( )
{
int d;
struct node *h=null,*r,*s;
printf(“创建单链表\n”);
while(1)
{printf(“输入整数:”);
scanf(“%d”,&d);
if(d==0) break;
______________;
s->data=d;s->next=null;
if(h==null)
{
h=s;r=s; /*h指向单链表的第一个节点*/
}
else
{
r->next=s;r=s; /*r始终指向最后一个结点*/
}
}
return h;
}
3,输入三角形三边长的值a,b,c,求周长和面积。
#include <math.h>
{
float a;
float b;
float c;
};
main( )
{
struct triangle tra;
tra.a=13.5;
tra.b=16.5;
tra.c=21;
printf(“tra.a=%f,tra.b=%f,tra.c=%f\n”,tra.a,tra.b,tra.c);
fcom(tra);
printf(“%d\n”,tra.a);
第一部分 C语言程序设计上机指导
·87·
·87·
}
int fcom(d)
struct triangle d;
{
float p,s;
p=d.a+d.b+d.c;
p=p/2;
s=p*(p-d.a)*(p-d.b)*(p-d.c);
s= ;
printf(“perimeter=%f,area=%f”,p,s);
}
4,输入年、月、日后,计算它是该年的第几天。
#include <stdio.h>
struct date
{
int day;
int month;
int year;
int yesterday;
char mon_name[3];
};
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}};
main( )
{ int i,leap;
struct date *pd;
printf(“Enter year/month/day:”),
scanf(“%d/%d/%d”,&(*pd).year,&(*pd).month,&(*pd.day);
leap=pd→year%4==0&&pd→year%100!=0||pd→year%400==0;
pd→yesterday=____________;
for(i=0;i<pd→month;i++)
pd→yesterday+=day_tab[leap][i];
printf(“The year passed day=%d\n”,pd→yesterday);
}
5,打印某一学生的成绩。
#include <stdio.h>
struct studentinfo
{long student_num;
char name[10];
char sex;
int age;
float score;
char addr[30];
};
void print_score(struct studentinfo *st)
{printf(“%5.2f”,st->score);}
main()
{struct studentinfo stu={20050506,“Li”,18,‘M’,86.5,“Rm305 Bldg4”};
C语言程序设计上机指导与同步训练
·88·
·88·
______________;
}
6,建立一个链表并遍历。
#include <stdio.h>
#define n 4
main( )
{struct node
{char ch;
struct node *next;
}*first,*last,*p;
int i;
char ch;
p=(struct node*)malloc(sizeof(struct node));
ch=getchar( );
p->ch=ch;
p->next=null;
first=last=p;
for(i=2;i<=n;i++)
{ch=getchar( );
p=(struct node*)malloc(sizeof(struct node));
p->ch=ch;
p->_______;
last->next=p;
last=p;
}
p=first;
while(p!=null)
{putchar(p->ch);
putchar(‘’);
p=_______;
}
}
7,有N个学生,每个学生的信息包括:学号、性别、姓名、四门课的成绩,从键盘上输入N个学生的信息,要求输出总平均成绩最高的学生信息,包括学号、性别、姓名和平均成绩。
#include <stdio.h>
#define n 3
struct student
{ long stunum;
char sex;
char name[15];
int score[4];
float average;
};
main( )
{ int i,j,index;
float sum,max;
struct student stuarr[20];
第一部分 C语言程序设计上机指导
·89·
·89·
for(i=0;i<n;i++)
{ printf(“请输入第%d个学生的信息:\n”,i+1);
scanf(“%ld,%c,%s”,&stuarr[i].stunum,&stuarr[i].sex,stuarr[i].name);
for(j=0;j<4;j++)
scanf(“%d”,&stuarr[i].score[j]);
}
for(i=0;i<n;i++)
{ sum=0.0;
for(j=0;j<4;j++)
_______________;
stuarr[i].average=sum/4.0;
}
max=stuarr[0].average;
index=0;
for(i=1;i<n;i++)
if(stuarr[i].average>max)
{max=stuarr[i].average;
index=i;
}
printf(“总平均成绩最高的学生信息是学号=%ld 性别 =%c 姓名=%s 平均成
绩=%4.1f”,stuarr[index].stunum,stuarr[index].sex,stuarr[index],
name,stuarr[index].average);
}
三、调试程序
要求:调试运行下列程序是否正确,若有错,写出错在何处?填写正确的运行结果。
1,
#include <stdio.h>
main ()
{
union
{
long a;
int b[5];
char c;
} m
printf(“%d\n”,sizeof(m));
}
正确 运行结果,
错误所在,
错误
应改为,
2,
#include <stdio.h>
main()
{ union example
C语言程序设计上机指导与同步训练
·90·
·90·
{
struct
{ int x;
int y;
}in ;
int a;
int b;
} e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf(“\n%d,%d”,e.in.x,e.in.y);
}
3,
#include <stdio.h>
union DATE
{
long i;
int k[5];
char c;
}max;
struct date
{
int cat;
int cow;
double dog;
} too ;
void main ( )
{
printf(“\n%d\n”,sizeof(date)+sizeof(max));
}
正确 运行结果,
错误所在,
错误
应改为,
4,
#include <stdio.h>
struct st
{int x;
int y;
}*p;
int s[ ]={10,20,30,40};
struct st a[ ]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};
正确 运行结果,
错误所在,
错误
应改为,
第一部分 C语言程序设计上机指导
·91·
·91·
void main( )
{p= a;
printf("\n %d",p→x);
printf("\n %d",(++ p)→x);
printf("\n %d",*(++ p)→y);
printf("\n %d",++(*(++ p)→y));
}
正确 运行结果,
错误所在,
错误
应改为,
5,该delete 函数实现将链表中的指定数值的结点删除掉,找出其中的错误语句。
struct list *delete(head,key)
struct list *head;
int key;
{
void free( );
struct list p,q;
p=head;
while(p!=NULL&&p->data!=key)
{
q=p;
p=p->next;
}
}
if(p==NULL)
return(NULL);
if(p==head)
h=head→next;
else q→next=p→next;
free(p);
return(head);
}
正确
运行结果,
错误所在,
错误
应改为,
6,
#include <stdio.h>
struct s1
{char *s1;
int i;
struct s1 *s1p;
};
main( )
{ s1 a[ ]={{“abcd”,1,a+1},{“efgh”,2,a+2},{“ijkl”,3,a}
};
C语言程序设计上机指导与同步训练
·92·
·92·
struct s1 p=a;
int i;
printf(“a[0].s=%s p→s=%s a[2].s1p→s\n”,a[0].s,p→s,
a[2]s1p→s);
for(i=0;i<2;i++)
{ printf(“—a[i].i=%d,,--a[i].i);
printf(“++a[i].s[3]=%c,,++a[i].s[3]);
putchar(‘\n’);}
printf(“%s,,++( p→s));
printf(“%s,,a[(++p)→i].s);
printf(“%s\n”,a[--(p→s1p→i)].s);
}
正确 运行结果,
错误所在,
错误
应改为,
四、写程序
1,编写在链表中插入一个元素的程序。
2,打印一些控制键的ASCII码值g708g2325g17839制和g2325g1857g17839制g709g2462其ASCII码g12538号的表示。
3,g16847取N个学生的数g6466,每个学生的数g6466包括学号、姓名、性别。g14521为g11019生g708mg709,
g17836要输入g16282g2159g8503g5132g2554g708y/ng709g727g14521为g3911生g708fg709,g17836要输入g17535高和g1319重。最后输出g17837些数g6466。