文档库 最新最全的文档下载
当前位置:文档库 › C语言程序设计实验报告(一)

C语言程序设计实验报告(一)

C语言程序设计实验报告(一)
C语言程序设计实验报告(一)

C语言程序设计实验报告

专业:班级:日期:成绩:

实验组别:第次实验:指导教师:

学生姓名:学号:同组人姓名:

实验名称:指针实验

一、实验目的

(1)熟练掌握指针的说明、赋值、使用。

(2)掌握用指针引用数组的元素,熟悉指向数组的指针的使用。

(3)熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。

(4)掌握带有参数的main函数的用法。

二、实验内容及要求

1.源程序改错

下面的源程序中是否存在错误?如果存在,原因是什么?如果存在错误要求在计算机上对这个源程序进行调试修改,是之能够正确执行。

源程序:

#include

int main(void)

{

float * p;

scanf("%f",p);

printf("%f\n",*p);

return 0;

}

2.源程序修改替换

(1)下面源程序的功能是,通过函数指针和菜单选择来调用字符串拷贝函数或字符串连接函数。请在程序中的下划线处填写合适的表达式、语句或代码片段来完善该程序。

源程序:

#include

#include

int main(void)

{

____________________________

char a[80],b[80],c[160],*result=c;

int choice,i;

do

{

printf("\t\t1 copy string.\n");

printf("\t\t2 connect string.\n");

printf("\t\t3 exit.\n");

printf("\t\tinput a number(1-3)please! \n");

scanf("%d",&choice);

}

while(choice<1||choice>5);

switch (choice)

{

case 1:

p=strcpy;

break;

case 2:

p=strcat;

break;

case 3:

goto down;

}

getchar();

printf("input the first string please! \n");

i=0;

_______________________

printf("input the second string please!\n");

i=0;

_______________________

result=____(a,b);

printf("the result is %s\n",result);

down:

;

return 0;

}

(2)请上机运行第(1)题程序使之能按下面要求输出结果(注:(输入)表示该行数据是键盘数据):

1.copy string。

2.Connect string。

3.Exit。

Input a number(1-3)please!

2(输入)

Input the first string please!

The more you learn,(输入)

Input the second string please!

The more you get.(输入)

The result is the more you learn,the more you get.

3.跟踪调试程序

请按下面的要求对所给源程序进行操作,并回答问题和排除错误。

(1)单步执行源程序。进入strcpy时,watches窗口中s为何值?返回main时,watches窗口中s为何值?

(2)排除源程序中的错误,使程序输出结果为:there is a boat on the lake.

源程序:

#include

char * strcpy(char*,char*);

int main(void)

{

char a[20],b[60]="there is a boat on the lack.";

printf("%s\n",strcpy(a,b));

return 0;

}

char *strcpy(char*s,char*t)

{

while(*s++=*t++)

;

return (s);

}

4.程序设计

编写并上机调试运行能实现以下功能的程序或函数:

(1)已知一个长整形变量占四个字符,其中每个字节又分高四位和低四位。试编写一个程序,从该长整形变量的高字节开始,依次取出每个字节的高四位和低四位并以数字字符的形式进行显示。

(2)利用大小为n的指针数组指向用gets函数输入的n行,每行不超过80个字符。试编写一个函数,它将每一行中连续的多个空格字符压缩为一个空格字符。在调用函数中输出压缩空格后的各行,空行不予输出。

(3)编写一个程序,输入n个整数,排序后输出。排序的原则由命令行可选参数-d决定,并且有参数-d时按递减顺序,否则按递增顺序排序。要求将排序算法定义成函数,利用指向函数的指针是该函数实现递增或递减排序。

(4)设每个班有n个学生,每个学生所修的M门课程的成绩,并且都存放到相应的数组中,试编写以下函数:

①计算每个学生各门课程平均成绩

②计算全班每门课程的平均成绩

③分别统计低于全班各门课程平均成绩的人数

④分别统计全班各门课程不及格的人数和90分以上(包含90)的人数。

在调用函数中输出结果(要求都用指针操作,不得用下标)

5.选做题

(1)编写并上机调试运行能实现以下功能的程序:

设有N位整数和M位小数(N=20,M=10)的两个数据a,b。编程计算a+b并输出结果。如:

12345678912345678912.1234567891+98765432109876543210.0123456789

(2)编写一个使用复杂声明的“char *(*p[2])(const char*,const char *);”的程序。

提示:p中元素可为strcmp,strstr等函数名。

三、实验步骤及结果

1.源程序改错

错误:悬挂指针,指针未初始化

改后程序:

#include

int main(void)

{

float *p,a;

p=&a;

scanf("%f",p);

printf("%f\n",*p);

return 0;

}

2.源程序完善、修改、替换

#include

#include

int main(void)

{

char *(*p)(char *a,char *b);

char a[80],b[80],c[160],*result=c;

int choice,i;

do

{

printf("\t\t1 copy string.\n");

printf("\t\t2 connect string.\n");

printf("\t\t3 exit.\n");

printf("\t\tinput a number(1-3)please!\n");

scanf("%d",&choice);

}

while(choice<1||choice>5);

switch(choice)

{

case 1:

p=strcpy;

break;

case 2:

p=strcat;

break;

case 3:

goto down;

}

getchar();

printf("input the first string please!\n");

i=0;

while((a[i]=getchar())!='\n')

i++;

a[i]='\0';

printf("input the second string please!\n");

i=0;

while((b[i]=getchar())!='\n')

i++;

b[i]='\0';

result=(*p)(a,b);

printf("the result is %s\n",result);

down:

;

return 0;

}

3.跟踪调试程序

#include

char * strcpy(char*,char*); int main(void)

{

char a[20],b[60]="there is a boat on the lack.";

printf("%s\n",strcpy(a,b));

return 0;

}

char *strcpy(char*s,char*t)

{

char *m;

m=s;

while(*s++=*t++)

;

return (m);

}

4.程序设计

(1)

#include

#include

#define MAX 32

int main()

{

long int n;

int i;

char s[MAX];

printf("please input a number:\n");

scanf("%ld",&n);

if(n>=-2147483647&&n<=2147483647) ;

else

{

printf("wrong:the number is too large");

return -1;

}

if(n>=0)

{

for(i=0;n!=0;i++)

{

s[i]=n%2+'0';

n/=2;

}

for(;i<=MAX-1;i++)

s[i]='0';

}

else

{

n=-(n+1);

for(i=0;n!=0;i++)

{

s[i]=n%2+'0';

n/=2;

}

for(;i<=MAX-2;i++)

s[i]='0';

for(i=0;i

if(s[i]=='1')

s[i]='0';

else if(s[i]=='0')

s[i]='1';

s[i]='1';

}

for(i=31;i>=28;i--)

putchar(s[i]);

putchar('\t');

for(i=27;i>=24;i--)

putchar(s[i]);

putchar('\t');

for(i=23;i>=20;i--)

putchar(s[i]);

putchar('\t');

for(i=19;i>=16;i--)

putchar(s[i]);

putchar('\t');

for(i=15;i>=12;i--)

putchar(s[i]);

putchar('\t');

for(i=11;i>=8;i--)

putchar(s[i]);

putchar('\t');

for(i=7;i>=4;i--)

putchar(s[i]);

putchar('\t');

for(i=3;i>=0;i--)

putchar(s[i]);

putchar('\t');

return 0;

}

(2)

#include

#include

#include

#define N 3

void output(char*s);

int main(void)

{

int i;

char *s[N];

printf("please input your massage:\n");

for(i=0;i

{

s[i]=malloc(80);

gets(s[i]);

}

printf("your massage has been changed into;\n");

for(i=0;i

{

output(s[i]);

printf("%s\n",s[i]);

}

return 0;

}

void output(char*s)

{

int i,j;

for(i=0,j=0;s[i]!='\0';i++,j++)

{

if(isspace(s[i]))

{

for(;isspace(s[i]);i++)

;

s[j++]=' ';

s[j]=s[i];

}

else

s[j]=s[i];

}

s[j]=s[i];

}

(3)

#include

#define MAX 5

void swap(int v[],int i,int j);

void qsort(int v[],int left,int right);

int main(int argc,char *argv[])

{

int i=0,s[MAX];

if(--argc>0&&(*++argv)[0]=='-')

{

if((*argv)[1]=='d')

{

while(i

scanf("%d",&s[i++]);

qsort(s,0,MAX-1);

for(i=MAX-1;i>=0;i--)

printf("%d\t",s[i]);

}

else

printf("wrong:\n");

}

else

{

while(i

scanf("%d",&s[i++]);

qsort(s,0,MAX-1);

for(i=0;i

printf("%d\t",s[i]);

}

return 0;

}

void qsort(int v[],int left,int right) {

int i,last;

void swap(int v[],int i,int j);

if(left>right)

return;

swap(v,left,(left+right)/2);

last=left;

for(i=left+1;i<=right;i++)

if(v[i]

swap(v,++last,i);

swap(v,left,last);

qsort(v,left,last-1);

qsort(v,last+1,right);

}

void swap(int v[],int i,int j)

{

int temp;

temp=v[i];

v[i]=v[j];

v[j]=temp;

}

(4)

#include

#define N 5

#define M 3

struct course

{

char *s;

int d[N];

} sm[M];

void saverage(struct course *sm);

void caverage(struct course *sm);

void summary_below(struct course *sm);

void summary_both(struct course *sm);

int main(void)

{

int i;

printf("Please input the names of the %d courses.\n",M);

for(i=0;i

if(gets((sm+i)->s=malloc(10))==NULL)

printf("ERROR");

for(i=0;i

{

int k;

printf("Please input the grades of %d students of the %s subject\n",N,(sm+i)->s);

for(k=0;k

scanf("%d",(sm+i)->d+k);

}

saverage(sm);

caverage(sm);

summary_below(sm);

summary_both(sm);

return 0;

}

void saverage(struct course *sm)

{

double sum=0,av;

int i,k;

for(i=0;i

{

printf("This is the %d student's average grade\t",i+1);

for(k=0;k

{

sum+=*((sm+k)->d+i);

}

av=sum/M;

printf("%lf\n",av);

sum=0;

}

}

void caverage(struct course *sm)

{

double sum=0,av;

int i,k;

for(i=0;i

{

printf("This is the average grade of %s\t",(sm+i)->s);

for(k=0;k

{

sum+=*((sm+i)->d+k);

}

av=sum/N;

printf("%lf\n",av);

sum=0;

}

}

void summary_below(struct course *sm)

{

double sum=0,av;

int i,k;

for(i=0;i

{

for(k=0;k

{

sum+=*((sm+i)->d+k);

}

av=sum/N;

printf("In %s the number of below-average student is\t",(sm+i)->s);

for(sum=0,k=0;k

if(*((sm+i)->d+k)

sum++;

printf("%d\n",(int)sum);

sum=0;

}

}

void summary_both(struct course *sm)

{

int i,k;

int fsum=0,esum=0;

for(i=0;i

{

printf("The course is %s\t",(*(sm+i)).s);

for(k=0;k

{

if(*((sm+i)->d+k)<60)

fsum++;

if(*((sm+i)->d+k)>90)

esum++;

}

printf("the failed is %d,while the above 90 is %d\n",fsum,esum);

fsum=0,esum=0;

}

}

5.选做题

(1)

#include

int main(void)

{

int i,t=0;

char a[]="12345678912345678912.1234567891";

char b[]="98765432109876543210.0123456789";

int s[32];

s[0]=0;

for(i=0;i<32;i++)

s[i]=0;

for(i=30;i>=0;i--)

{

if(a[i]=='.')

i--;

int m,n,k;

m=a[i]-'0'+t;

n=b[i]-'0';

k=m+n;

if(k>=10)

{

t=k/10;

s[i+1]=k%10;

}

else

{

s[i+1]=k%10;

t=0;

}

k=0;

}

s[0]=t;

for(i=0;i<32;i++)

{

if(i==21)

printf(".");

else

printf("%d",s[i]);

}

return 0;

}

(2)

#include

#include

#include

int main(void)

{

int n;

char *(*p[2])(const char*,const char*);

char *a;char *b;char *c;

printf("please input string one:\n");

a=malloc(20);

gets(a);

printf("please input string two:\n");

b=malloc(20);

gets(b);

printf("please input a number:\n0 to choose the strcpy\n1 to choose the strcat\n");

scanf("%d",&n);

p[0]=strcpy;

p[1]=strcat;

if(n>2||n<0)

{

printf("wrong");

return -1;

}

else

c=(*p[n])(a,b);

printf("now the string is:\n%s\n",c);

return 0;

}

四、实验体会

知道了指向数组的指针的用法,明白了指向函数的指针的用途

相关文档