资源描述
《 C语言程序设计 》
实验报告
实验时间: 6月7号
实验班级: 计算机双学位1501
实验报告总份(片)数: 1 份(片)
实验教师: 饶东宁
计算机 学院 工一 实验室
广东工业大学
《 C语言程序设计 》
实验报告
实验题目: 实验10
实验时间: 6月7号
实验班级: 双学位1501
实验人学号: 3213010359
实验人姓名: 梁雪卿
实验教师: 饶东宁
计算机 学院 工一 实验室
广东工业大学
实验10 指针2
1 实验目得
(1) 进一步掌握指针得应用
(2) 能正确使用数组得指针与指向数组得指针变量
(3) 能正确使用字符串得指针与指向字符串得指针变量
(4) 了解指向指针得指针得用法
2 实验内容
根据题目要求,编写程序(要求用指针处理),运行程序,分析结果,并进行必要得讨论分析。
(1) 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3得人退出圈子,问最后留下得就是原来得第几号得人。
输入人数n
算法说明:
指针指向数组开头
for i=0 to i=n1
当m<n1
输出结果
*(p+i)=i+1
i=0 k=0 m=0
真 *(p+1)≠0 假
k++
真 k=3 假
*(p+i)=0
k=0
m++
i++
真 i=n 假
i=0
当*p=0
p++
程序清单:
#include <stdio、h>
int main
{
int i,k,m,n,num[50],*p;
scanf("n=%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;
i=0;
k=0;
m=0;
while(m<n1)
{
if(*(p+1)!=0) k++;
if(k==3)
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n) i=0;
}
while(*p==0) p++;
printf("The last one is NO、%d\n",*p);
return 0;
}
运行结果:
分析与思考:
以1到n为序给每个人编号,i为每次循环时计数变量,k为按1,2,3报数时得计数变量,m为退出人数,当退出人数比n1少时执行循环体,对推村恩编号为0,报数到尾i恢复为0,循环继续。
(2) 将一个5*5得矩阵(二维数组)中最大元素放在中心,4个角分别放4个最小得元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
算法说明:
定义a[5][5],*p,I,j
for i=0 to i=4
for j=0 to j=4
输入a[i][j]
p=&a[0][0]
调用函数change(p)
for j=0 to j=4
for i=0 to i=4
输出a[i][j]
change(int *p)
定义 i,j,temp,*pmax,*pmin
pmax=p
pmin=p
for i=0 to i=4
for j=i to j=4
temp=*(p+12) *(p+12)=*pmax *pmax=temp
temp=*p *p=*pmin *pmin=temp pmin=p+1
for i=0 to i=4
/
真 *pmax<*(p+5*i+j) 假
pmax=p+5*i+j
真 *pmin>*(p+5*i+j) 假
pmin=p+5*i+j
for j=0 to j=4
continue
真 i==0&&j==0 假
真 *pmin>*(p+5*i+j) 假
pmin=p+5*i+j
temp=*pmin *pmin=*(p+4) *(p+4)=temp pmin=p+1
for i=0 to i=4
for j=0 to j=4
真 (i==0&&j==0)||(i==0&&j==4) 假
temp=*pmin *pmin=*(p+20) *(p+20)=temp pmin=p+1
pmin=p+5*i+j
真 *pmin>*(p+5*i+j) 假
continue
for i=0 to i=4
for j=0 to j=4
continue
真 (i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0) 假
真 *pmin>*(p+5*i+j) 假
temp=*pmin
*pmin=*(p+24)
*(p+24)=temp
pmin=p+5*i+j
程序清单:
#include <stdio、h>
int main
{
void change(int *p);
int a[5][5],i,j,*q;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
q=&a[0][0];
change(q);
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
void change(int *p)
{
int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(*pmax<*(p+i*5+j)) pmax=p+i*5+j;
if(*pmin>*(p+5*i+j)) pmin=p+i*5+j;
}
}
temp=*(p+12);
*(p+12)=*pmax;
*pmax=temp;
temp=*p;
*p=*pmin;
*pmin=temp;
pmin=p+1;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{if(i==0&&j==0) continue;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}
}
temp=*pmin;
*pmin=*(p+4);
*(p+4)=temp;
pmin=p+1;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{if((i==0&&j==0)||(i==0&&j==4)) continue;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}
}
temp=*pmin;
*pmin=*(p+20);
*(p+20)=temp;
pmin=p+1;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{if((i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0)) continue;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;}
}
temp=*pmin;
*pmin=*(p+24);
*(p+24)=temp;
}
运行结果:
分析与思考:
change函数实现元素值交换。找出最大最小之,最大值与中心元素呼唤,最小值与左上角得元素互换。找出全部元素中得次小值,第三小值,第四小值,分别与剩下得三个角互换。元素地址均以元素做单位得地址。
(3) 有一个班4个学生,5门课程。
1, 求第一门课程得平均分。
2, 找出有两门以上课程不及格得学生,输出她们得学号与全部课程成绩及平军成绩。
3, 找出平均成绩在90分以上或全部课程成绩在85分以上得学生。分别编3个函数实现以上3个要求。
定义score[4][5],aver[4],*pscore,*paver,course[5][10],(*pcourse)[10]
pcourse=course
for i=0 to i=4
算法说明:
输入course[i]
for i=0 to i=4
输出course[i]
pscore=&score[0][0]
pnum=&num
for i=0 to i=3
输入pnum+i
for j=0 to j=4
输出pscore+5*i+j
paver &aver[0]
调用avsco(pscore,paver)
调用avcour1(pcourse,pscore)
调用fali2(pcourse,pnum,pscore,paver)
调用good(pcourse,pnum,pscore,paver)
avsco
sum=0、0
for j=0 to j=4
定义I,j,sum,average
for i=0 to i=3
average=sum/5
*(paver+i)=average
sum=sum+(*(pscore+5*i+j))
avcour1
定义I,sum,average1
sum=0、0
for i=0 to i=3
sum=sum+(*(pscore+5*i))
average1= sum/4
输出*pcourse,average1
fali2
定义I,j,k,label
for i=0 to i=4
输出course[i]
for i=0 to i=3
label=0
for j=0 to j=4
真 *(pscore+5*i+j)<60、0 假
label++
真 label>=2 假
输出num[i]
for k=0 to k=4
输出*(pscore+5*i+k)
输出aver[i]
good
定义I,j,k,n
for i=0 to i=4
输出course[i]
for i=0 to i=3
n=o
for j=0 to j=4
真 *(pscore+5*i+j)>85、0 假
n++
真 n==5||(aver[i]>=90) 假
输出num[i]
for k=0 to k=4
输出*(pscore+5*i+k)
输出aver[i]
程序清单:
#include <stdio、h>
int main
{void avsco(float *,float *);
void avcour1(char (*)[10],float *);
void fali2(char course[5][10],int num[],float *pscore,float aver[4]);
void good(char course[5][10],int num[4],float *pscore,float aver[4]);
int i,j,*pnum,num[4];
float score[4][5],aver[4],*pscore,*paver;
char course[5][10],(*pcourse)[10];
printf("input course:\n");
pcourse=course;
for(i=0;i<5;i++)
scanf("%s",course[i]);
printf("input NO、 and scores:\n");
printf("NO、");
for(i=0;i<5;i++)
printf(",%s",course[i]);
printf("\n");
pscore=&score[0][0];
pnum=&num[0];
for(i=0;i<4;i++)
{scanf("%d",pnum+i);
for(j=0;j<5;j++)
scanf("%f",pscore+5*i+j);}
paver=&aver[0];
printf("\n\n");
avsco(pscore,paver);
avcour1(pcourse,pscore);
printf("\n\n");
fali2(pcourse,pnum,pscore,paver);
printf("\n\n");
good(pcourse,pnum,pscore,paver);
return 0;
}
void avsco(float *pscore,float *paver)
{
int i,j;
float sum,average;
for(i=0;i<4;i++)
{sum=0、0;
for(j=0;j<5;j++)
sum=sum+(*(pscore+5*i+j));
average=sum/5;
*(paver+i)=average;
}
}
void avcour1(char (*pcourse)[10],float *pscore)
{
int i;
float sum,average1;
sum=0、0;
for(i=0;i<4;i++)
sum=sum+(*(pscore+5*i));
average1=sum/4;
printf("course 1:%s average score:%7、2f\n",*pcourse,average1);
}
void fali2(char course[5][10],int num[],float *pscore,float aver[4])
{
int i,j,k,label;
printf(" ==============Student who is fail in two course========== \n");
printf("NO、 ");
for(i=0;i<5;i++)
printf("%11s",course[i]);
printf(" average\n");
for(i=0;i<4;i++)
{label=0;
for(j=0;j<5;j++)
if(*(pscore+5*i+j)<60、0) label++;
if(label>=2)
{printf("%d",num[i]);
for(k=0;k<5;k++)
printf("%11、2f",*(pscore+5*i+k));
printf("%11、2f\n",aver[i]);
}
}
}
void good(char course[5][10],int num[4],float *pscore,float aver[4])
{
int i,j,k,n;
printf(" ==========Students whose score is good====== \n");
printf("NO、 ");
for(i=0;i<5;i++)
printf("%11s",course[i]);
printf(" average\n");
for(i=0;i<4;i++)
{n=0;
for(j=0;j<5;j++)
if(*(pscore+5*i+j)>85、0) n++;
if((n==5)||(aver[i]>=90))
{printf("%d",num[i]);
for(k=0;k<5;k++)
printf("%11、2f",*(pscore+5*i+k));
printf("%11、2f\n",aver[i]);
}
}
}
运行结果:
分析与思考:
num就是存放4个学生学号得一维数组,course就是存放5门课名字得二维字符数组,score就是存放4 个学生5门课成绩得二维数组,aver就是存放每个学生平时成绩得数组。pnum就是指向num数组得指针变量,pave就是指向aver数组得指针变量。
(4) 用指向指针得指针得方法对n个字符串排序并输出。要求将排序单独写成一个函数。n与各整数在主函数中输入。最后在主函数中输出。
把n个字符串定义为二维数组str[N][LINEMAX]
定义指针数组pstr[N]
for i=0 to i=N1
算法说明:
pstr[i]=str[i]
for i=0 to i=N1
输入字符串
p=pstr
for i=0 to i=N1
输出排序后得字符串
调用函数sort(p,N)
sort
定义i,j,*temp
for i=0 to i=x1
for j=i+1 to j=x1
真 strcmp(*(p+1),*(p+j)>0) 假
temp=*(p+i)
*(p+i)=*(p+j)
*(p+j)=temp
程序清单:
#include <stdio、h>
#include <string、h>
#define LINEMAX 20
#define N 5
int main
{
void sort(char **p,int x);
int i;
char **p;
char *pstr[N];
char str[N][LINEMAX];
printf("输入5个字符串: ");
for(i=0;i<N;i++)
pstr[i]=str[i];
for(i=0;i<N;i++)
scanf("%s",pstr[i]);
p=pstr;
sort(p,N);
printf("\n");
for(i=0;i<N;i++)
printf("%s\n",*pstr[i]);
return 0;
}
void sort(char **p,int x)
{
int i,j;
char * term;
for(i=0;i<x;i++)
{
for(j=i+1;j<x;j++)
{
if(strcmp(*(p+i),*(p+j))>0)
{term=* (p+i);
* (p+i)=* (p+j);
* (p+j)=term;
}
}
}
}
运行结果:
思考与分析:
二维数组定义就是不能包括变量,要定义宏;要给字符串留出足够得空间;调用字符串函数要包括头文件<string,h>;用冒泡法对字符串排序。
展开阅读全文