指针实验陈正宁123349.docx
《指针实验陈正宁123349.docx》由会员分享,可在线阅读,更多相关《指针实验陈正宁123349.docx(23页珍藏版)》请在冰点文库上搜索。
指针实验陈正宁123349
淮海工学院计算机科学系
实验报告书
课程名:
《C语言程序设计》
题目:
实验9指针
班级:
软嵌151
学号:
2015123349
姓名:
陈正宁
1、实验内容或题目
(1)设计一个程序,将两个变量的值进行交换,要求通过函数和指针实现。
具体要求:
编写一个函数swap(int*p,int*q),交换两个参数指针所指的数据,再编写main主函数,通过调用swap()函数将两个变量的值进行交换。
(2)编写一个程序,判断用户输入的两个字符串是否相同,其中字符串可能含有空格等,以回车键表示输入结束。
(不允许使用strcmp函数)
(3)设计一个程序,用选择法或冒泡法将若干字符串按字母顺序进行排序。
要求用函数和指针完成。
具体要求:
编写一个函数strsort(char*p[],intn),对一组给定的字符串进行排序(非递减)。
其中p的每一个元素为一个字符串指针,长度n。
最后编写main主函数对下列单词进行排序后输出:
include,define,main,if,else,for,while,switch,break,continue。
(4)教材p291页习题的第11题。
(5)教材p292页习题的第12、第15第18题。
2、实验目的与要求
进一步掌握指针的概念,会定义和使用指针变量。
能正确地使用数组的指针和指向数组的指针变量。
能正确地使用字符串的指针和指向字符串的指针变量。
3、实验步骤与源程序
实验步骤
(1)、
(2)、
(3)、
(4)、
(5-1)、
(5-2)、
(5-3)、
源代码
(1)、
#include
voidswap(int*p,int*q)
{intt;
t=*p;*p=*q;*q=t;//交换p1和p2所指向的内容
}
voidmain()
{inta,b;
int*pointer_1,*pointer_2;
printf("请输入两个数字[abEnter]:
");
scanf("%d%d",&a,&b);
pointer_1=&a;pointer_2=&b;
swap(pointer_1,pointer_2);//函数调用,指针作为实参
printf("\n则交换以后为:
%d%d\n",a,b);
}
(2)、
#include
#include
intmain()
{
chara[255]={'\0'},b[225]={'\0'};
printf("请输入第一个字符串:
");
gets(a);
printf("请输入第二个字符串:
");
gets(b);
inti;
if(strlen(a)==strlen(b))
{
for(i=0;i<(int)strlen(a);i++)
if(a[i]!
=b[i])
break;
}
if(i==(int)strlen(a))
printf("两个字符串相同\n");
else
printf("两个字符串不相同\n");
}
(3)、
#include
#include
voidstrsort(char*p[])
{
inti,j;
char*temp;
for(i=0;i<9;i++)//注意是i<9
{
for(j=0;j<9;j++)//注意是j<9,因为下面要+1和后面的那个字符串比较
{
if(strcmp(p[j],p[j+1])>0)//字符串比较:
>0表示前面的字符串比后面的大则交换
{
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
}
voidprint(char*p[])
{
inti;
for(i=0;i<10;i++)
{
printf("%s",p[i]);
}
}
intmain()
{
char*p[]={"include","define","main","if","else","for","while","switch","break","continue"};
printf("原来的序列是:
\n");
print(p);
strsort(p);
printf("\n排序后的序列是:
\n");
print(p);
printf("\n\n");
return0;
}
(4)、
#include
#include
voidsort(char*s[])
{
char*temp;
inti,j;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(*(s+j),*(s+j+1))>0)
{
temp=*(s+j);
*(s+j)=*(s+j+1);
*(s+j+1)=temp;
}
}
voidmain()
{
inti;
charstr[10][6],*p[10];
printf("请输入10个等长的字符串:
\n");
for(i=0;i<10;i++)
p[i]=str[i];
for(i=0;i<10;i++)
scanf("%s",p[i]);
sort(p);
printf("则已经排好序的字符串为:
\n");
for(i=0;i<10;i++)
printf("%s\n",p[i]);
getchar();
}
(5-1)、
#include
#include
voidsort(char*s[])
{
char*temp;
inti,j;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(*(s+j),*(s+j+1))>0)
{
temp=*(s+j);
*(s+j)=*(s+j+1);
*(s+j+1)=temp;
}
}
voidmain()
{
inti;
charstr[10][6],*p[10];
printf("请输入10个不等长的字符串:
\n");
for(i=0;i<10;i++)
p[i]=str[i];
for(i=0;i<10;i++)
scanf("%s",p[i]);
sort(p);
printf("则已经排好序的字符串为:
\n");
for(i=0;i<10;i++)
printf("%s\n",p[i]);
getchar();
}
(5-2)、
#include
intmain()
{
voidavsco(float*,float*);
voidavcour1(char(*)[10],float*);
voidfali2(charcourse[5][10],intnum[],float*pscore,floataver[4]);
voidgood(charcourse[5][10],intnum[4],float*pscore,floataver[4]);
inti,j,*pnum,num[4];
floatscore[4][5],aver[4],*pscore,*paver;
charcourse[5][10],(*pcourse)[10];
printf("Pleaseinputcourse:
");
pcourse=course;
for(i=0;i<5;i++)
scanf("%s",course[i]);
printf("PleaseinputNO.andscores:
\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);//找出2门课不及格的学生
printf("\n\n");
good(pcourse,pnum,pscore,paver);//找出成绩好的学生
return0;
}
voidavsco(float*pscore,float*paver)//求每个学生的平均成绩的函数
{
inti,j;
floatsum,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;
}
}
voidavcour1(char(*pcourse)[10],float*pscore)//求第一课程的平均成绩的函数
{
inti;
floatsum,average1;
sum=0.0;
for(i=0;i<4;i++)
sum=sum+(*(pscore+5*i));//累计每个学生的得分
average1=sum/4;//计算平均成绩
printf("course1:
%saveragescore:
%7.2f\n",*pcourse,average1);
}
voidfali2(charcourse[5][10],intnum[],float*pscore,floataver[4])
//找两门以上课程不及格的学生的函数
{
inti,j,k,labe1;
printf("==========Studentwhoisfailintwocourses=======\n");
printf("NO.");
for(i=0;i<5;i++)
printf("%11s",course[i]);
printf("average\n");
for(i=0;i<4;i++)
{
labe1=0;
for(j=0;j<5;j++)
if(*(pscore+5*i+j)<60.0)labe1++;
if(labe1>=2)
{
printf("%d",num[i]);
for(k=0;k<5;k++)
printf("%12.2f",*(pscore+5*i+k));
printf("%11.2f\n",aver[i]);
}
}
}
voidgood(charcourse[5][10],intnum[4],float*pscore,floataver[4])
//找成绩优秀学生(各门85以上或平均90分以上)的函数
{
inti,j,k,n;
printf("==========Studentwhoisfailintwocourses=======\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("%12.2f",*(pscore+5*i+k));
printf("%11.2f\n",aver[i]);
}
}
}
(5-3)、
#include
#include
voidmain()
{
intn;
char*name[12]={"January","February","March",
"April","May","June",
"July","August","September",
"October","November","December"};
printf("请输入月份:
");
scanf("%d",&n);
printf("\n");
printf("输入月份的英文名为:
%s\n",*(name+n-1));
}
4、测试数据与实验结果(可以抓图粘贴)
(1)、
(2)、
(3)、
(4)、
(5—1)、
(5—2)、
(5—3)、
5、结果分析与实验体会
(1)由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。
因此,将地址形象地称为“指针”。
(2)所谓数组元素的指针就是数组元素的地址。
(3)牢记*(a+i)和a[i]是等价的。
(4)注意函数的形参和实参可以分别用字符数组名或指针变量。
(5)指针是C语言的精华,必须要深入钻研。