实验6、指针和结构体
【实验目的】
1.掌握地址和指针的基本概念,学会定义和使用指针变量;
2.熟悉指针与数组之间的关系,能正确使用数组的指针和指向数组的指针变量;
3.掌握指针形参的作用,熟练掌握编写指针形参的函数;
4.掌握结构体类型变量和结构体指针的定义及结构体成员的引用方式;
5.掌握结构体数组的定义及应用方法;
6.掌握链表的定义及操作,并能熟练编写链表应用程序。
【实验内容】
1、程序填空
给定程序中函数fun的功能是:对形参s所指字符串中下标为奇数的字符按ASCII码大小递增排序,并将排序后下标为奇数的字符取出,存入形参p所指字符数组中,形成一个新串。
例如,形参s所指字符串为baawrskjghzlicda,执行后p所指字符数组中的字符串应为aachjlsw。
在以下程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。
不得增行或删行,也不得更改程序结构。
程序填空如下:
#include <stdio.h>
void fun(char *s,char *p)
{ int i,j,n,x,t;
n=0;
for(i=0;s[i]!=’\0’;i++) n++;
for(i=1;i<n-2;i=i+2) {
/**********found**********/
t=i ;
/**********found**********/
for(j= t +2;j<n;j=j+2)
if(t!=i)
{ x=s[i]; s[i]=s[t]; s[t]=x; }
}
for(i=1,j=0;i<n;i=i+2,j++) p[j]=s[i];
/**********found**********/
p[j]= ’\0’ ;
}
main()
{ char s[80]=“baawrskjghzlicda”,p[50];
printf(“\nThe original string is: %s\n”,s);
fun(s,p);
printf(“\nThe result is: %s\n”,p);
}
2、程序填空
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,给定函数fun的功能是:把分数最低学生的数据放在b指定的数组中,分数最低的学生可能不
止一个,函数应返回分数最低学生的人数。
在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确结果。
不得增行或删行,也不得更改程序结构。
需填空程序如下:
#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun(STREC *a,STREC *b)
{ int i,n=0,min;
min=a[0].s;
for(i=0;i<N;i++)
/**********found**********/
if( min>a[i].s )
min=a[i].s;
for(i=0;i<N;i++)
if(a[i].s==min)
/**********found**********/
{*( b+n )=a[i];
/**********found**********/
return n;
}
main()
{STREC s[N]={{“GA05”,85},{“GA03”,76},{“GA02”,69},
{“Gh04”,85},{“G A01”,91},{“GA07”,72},
{“GA08”,64},{“GA06”,87},{“GA015”,85},
{“GA013”,91},{“GA012”,64},{“GA014”,91},
{“GA011”,91},{“GA017”,64},{“GA018”,64},
{“G A016”,72}};
STREC h[N];
int i,n; FILE *out;
n=fun(s,h);
printf(“The %d lowest score: \n”,n);
for(i=0;i<n;i++)
printf(“%s %4d\n”,h[i].num,h[i].s);
printf(“\n”);
out=fopen(“out14.dat”,“w”);
fprintf(out,“%d\n”,n);
for(i=0;i<n;i++)
fprintf(out,“%4d\n”,h[i].s);
fclose(out);
}
3.程序改错
给定程序中函数fun的功能是:从低位开始取出长整型变量S中偶数位上的数,依次构成一个新数放在t中。
高位仍在高位,低值仍在低位。
例如,当S中的数为7654321时,t中的数为642。
请改正程序中指定部位的错误,使它能够得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
需改正程序如下:
#include <stdio.h>
/**********found**********/
void fun(long s, long t)
{ long s1=10;
s/=10;
*t=s%10;
/**********found**********/
while(s<0)
{ s=s/100;
*t=s%10*sl+*t;
s1=s1*10;
}
}
main()
{ long s,t;
printf(“\nPlease enter s:“); scanf(“%ld”,&s);
fun(s,&t);
printf(“The result is: %ld\n”,t);
}
正确的程序:
#include <stdio.h>
/**********found**********/
void fun(long s, long *t)
{ long s1=10;
s/=10;
*t=s%10;
/**********found**********/
while(s>0)
{ s=s/100;
*t=s%10*s1+*t;
s1=s1*10;
}
}
main()
{ long s,t;
printf(“\nPlease enter s:“); scanf(“%ld”,&s);
fun(s,&t);
printf(“The result is: %ld\n”,t);
}
4.程序改错
给定程序中函数Creatlink的功能是创建带头结点的单向链表,并为各结点数据域赋0~m-1的值。
请改正函数Creatlink中指定部位的错误,使它能够得出正确结果。
需改正程序如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct aa
{ int data;
struct aa *next;
} NODE;
NODE *Creatlink(int n,int m)
{ NODE *h=NULL,*p,*s;
int i;
/**********found***********/
p=(NODE *)malloc(sizeof(NODE));
h=p;
p->next=NULL;
for(i=1;i<=n;i++)
{ s=(NODE *)malloc(sizeof(NODE));
s->data=rand()%m; s->next=p->next;
p—>next=s; p=p->next;
}
/**********found***********/
return h;
}
outlink(NODE *h)
{ NODE *p;
p=h->next;
printf(“\n\nTHE LIST:\n\n HEAD”);
while(p)
{ printf(“->%d”,p->data);
p=p->next;
}
printf(“\n”);
}
main()
{ NODE *head;
head=Creatlink(8,22);
outlink(head);
}。