实验报告三
(四学时)
一【实验目的】
(1)了解指针的概念,理解指针的本质及特征。
(2)掌握指针变量的声明、表示、引用及赋值方法。
(3)掌握指针变量的常用运算规则和实际应用。
(4)结构体极其变量的定义和使用。
(5)指针操作结构体变量的使用方法。
二【实验内容】
第一部分:指针
【实验1—基础题】
要求:定义和实现一个函数void swap(int *p , int *q),该函数实现两个整数的交换。
在main函数中构造两个整型变量,通过调用swapt函数实现这两个整型变量的数值交换,并显示交换前和交换后的数据。
目的:地指作为形式参数的用法(传址)
实验结果:#include
void swap(int*p,int*q);
int main()
{
int a,b;
printf("请输入数a,b:");
scanf("%d,%d",&a,&b);
printf("交换前的数据:a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("交换后的数据:a=%d,b=%d\n",a,b);
return 0;
}
void swap(int*p,int*q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
【实验2—验证题】
要求:运用指针的知识实现计算学生平均分的函数编写
(1)设数组score[]保存若干学生的某一课程的成绩,定义一个函数float aver_score(float *p,int n),计算该课程的平均成绩(形式参数n表示学生个数)。
(2)在main函数中用数组存放多个学生成绩,成绩由键盘输入,然后通过调用aver_score函数计算其平均成绩并输出。
目的:指针与数组的关系及应用
实验结果:
#include
#define N 40
float Averscore(float *p,int n);
int main()
{
int n,i=-1;
float score[N],aver,*p;
p=score;
do
{
i++;
printf("Input score:");
scanf("%f",p+i);
}while(p[i]>=0);
n=i;
aver=Averscore(p,n);
printf("aver=%.2f\n",aver);
return 0;
}
float Averscore(float *p,int n)
{
int j;
float sum=0;
for(j=0;j { sum=sum + *(p+j); } return sum/n; } 【实验3—延伸训练】 要求:定义一个函数void reverse_str(char *p),实现字符串的逆序排列。 (1)调用函数reverse_str(char *p)时,把一个字符串的地址传递给指针p,由指针p对字符串进行交换,得到逆序排列的字符串。 (2)在main函数中构造一个字符串,通过调用reverse_str函数实现该字符串的逆序排列,并显示源字符串和逆序排列后的字符串。 例如:用户输入的原字符串为asdfgh,调用函数reverse_str后,输出逆序字符串为hgfdsa。 目的:指针操作字符数组的应用 实验结果: #include #define N 40 void Reverse_ste(char*p); int main() { char Str[N]; char *p=Str; printf("请输入字符:"); gets(p); Reverse_ste(p); printf("逆序排列的字符:\n"); puts(p); return 0; } void Reverse_ste(char*p) { char temp; int i=-1, n, j; do{ i++; }while(*(p+i)!='\0'); i=i-1; n=i/2; for(j=0;j<=n;j++) { temp=*(p+j); *(p+j)=*(p+i-j); *(p+i-j)=temp; } } 三【实验小结】 编程不熟练,还需要勤加练习。 第二部分:结构体 【实验1—基础题】 要求: (1)定义关于学生信息的结构体: 每个学生信息有:学号、姓名、三门课程的成绩、总分、平均分; (2)定义结构体类型的变量:定义一个学生结构体类型的变量、通过键盘输入该学生的信息;提示:其中,学号、姓名、三门课程的成绩由键盘输入; 总分和平均分通过用户输入的学生信息计算得到。 (3)分别使用“.”运算和“->”运算实现结构体数据成员的访问,输出学生的各项信息。目的:掌握结构体的定义、结构体变量定义、结构体数据成员访问 实验结果: #include typedef struct { long studentID; char studentName[10]; int score[4]; }STUDENT; int main() { int i; float sum=0,aver; STUDENT stu1; STUDENT*pt; pt=&stu1; printf("Input a record:\n"); scanf("%ld",&stu1.studentID); scanf("%s",stu1.studentName); for(i=0;i<3;i++) { scanf("%d",&stu1.score[i]); } for(i=0;i<3;i++) { sum+=stu1.score[i]; } aver=sum/3; printf("%10ld%8s%4d%4d%4d%6.1f%6.1f\n", pt->studentID, pt->studentName, pt->score[0], pt->score[1], pt->score[2],sum,aver); return 0; } 【实验2—选做】 要求:(1)在实验1的基础上对程序进行改进,实现多个学生信息的处理提示:定义该类型的数组,可以处理多个学生的信息 (2)通过键盘输入N个学生的信息并输出; 目的: 实验结果: #include #define N 40 typedef struct { long studentID; char studentName[10]; int score[4]; }STUDENT; int main() { int i,j,n; float sum[N],aver[N]; STUDENT stu[N]; STUDENT*pt; pt=&stu[0]; printf("请输入学生人数:"); scanf("%d",&n); for(j=0;j { printf("Input a record %d:\n",j+1); scanf("%ld",&stu[j].studentID); scanf("%s",stu[j].studentName); for(i=0;i<3;i++) { scanf("%d",&stu[j].score[i]); } } for(j=0;j { sum[j]=0; for(i=0;i<3;i++) { sum[j]=sum[j]+stu[j].score[i]; } aver[j]=sum[j]/3; } printf("结果为:\n"); for(j=0;j { printf("%10ld%8s%4d%4d%4d%6.1f%6.1f\n", (pt+j)->studentID, (pt+j)->studentName, (pt+j)->score[0], (pt+j)->score[1], (pt+j)->score[2], sum[j], aver[j]); } return 0; } 三【实验小结】 编程不熟练,还需要勤加练习。