C语言程序设计实验报告8

C语言程序设计实验报告(八) 专业计算机科学与技术班级卓越工程师班日期 20xx年12月16日实验组别第一组成绩第八次实验指针实验指导教师李开学生姓名邱金源学号U201114493

实验名称指针实验

(一) 实验目的

(1)

(2)

(3)

(4)

(5) 熟练掌握指针的说明、赋值、使用。 掌握用指针引用数组的元素,熟悉指向数组的指针的使用。 熟练掌握字符数组与字符串的使用,掌握指针数组及字符指针数组的用法。 掌握指针函数与函数指针的用法。 掌握带有参数的main函数的用法。

(二) 实验内容及要求

1. 源程序改错

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

源程序1

#include<stdio.h>

int main(void)

{

float *p;

scanf("%f", p);

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

return 0;

}

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

(1) 下面的源程序的功能是:通过函数指针和菜单选择来调用字符串拷贝函数或字符串

连接函数。请在程序中的下划线处填写合适的表达式、语句或代码片段来完善该程序。

#include<stdio.h>

#include<string.h>

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");

1 / 13

scanf ("%d", &choice);

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

switch(choice)

{

case 1: p = strcpy; break;

case 2: p = strcat; break;

case 3: gotodowm;

}

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);

dowm:

;

return 0;

}

(2) 请上机运行第(1)题程序,使之能按下面要求输出结果:

1 copy string.

2 connet string.

3 exit

input a number(1-2) 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 bote on the lake.

源程序3

#include<stdio.h>

char *strcpy(char *, char*);

int main(void)

{

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

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

2 / 13

return 0;

}

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

{

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

;

return (s);

}

4. 程序设计

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

(1) 已知一个长整型变量占4个字节,其中每个字节又分成高4位和低4位。试编写一

个程序,从该长整型变量的高字节开始,依次取出每个字节的高4位和低4位并以数字字符的形式记性显示。

(2) 利用大小为n的指针数组指向用gets函数输入的n行,每行不超过80个字符。试编

写一个函数,它将每一行中连续的多个空格字符压缩为一个空格字符。在调用函数中输出压缩空格后的各行,空行不予输出。

(3) 编写一个程序,输入n个整数,排序后输出。排序的原则由命令行可选参数-的-d决

定,并且有参数-d时按递减顺序排序,否则按递增顺序排序。要求将排序算法定义成函数,利用指向函数的指针使该函数实现递增或递减排序。

(4) 设某个班有N个学生,每个学生修了M门课程。输入M门课程的名称,然后依次

输入N个学生中每个学生所修M门课程的成绩,并且都存放到相应的数组中。试编写下列函数:

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

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

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

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

在调用函数中输出上面各函数的计算结果(要求都用指针操作,不得使用下下标操作)

5.选做题

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

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

出结果。

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

(三) 实验步骤及结果

1.源程序改错的实验步骤及结果

(1)创建一个工程

建立名为aaa的工程。

(2)编辑源文件和保存

用源程序1替换aaa工程中的main.c的源代码,编辑完毕后保存。

分析:由程序知,该程序要输出地址值,所以printf语句中应为“%p”,而不是“%f”,再将printf语句中的“*p”改为“p”。

修改后的程序和运行结果如图所示:

3 / 13

结果正确!

2.源程序完善、修改、替换的实验步骤及结果

(1) 经分析,第一处应定义一个函数指针,再根据函数strcpy和strcat的返回值,所以所

填代码应为

后三处所填代码应为

完善后的程序及运行结果如图所示

#include<stdio.h>

#include<string.h>

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;

C语言程序设计实验报告8

C语言程序设计实验报告8

C语言程序设计实验报告8

C语言程序设计实验报告8

C语言程序设计实验报告8

C语言程序设计实验报告8

break;

4 / 13

case 2:

p = strcat;

break;

case 3:

gotodowm;

}

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);

dowm:

;

return 0;

}

结果正确!

3.跟踪调试源程序的实验步骤及结果

(1)在aaa工程下创建一个新文件并编辑源程序3。

(2)单步执行源程序。

① .进入函数strcpy时,s为何值?返回main时,s为何值?

C语言程序设计实验报告8

C语言程序设计实验报告8

C语言程序设计实验报告8

5 / 13

(3)分析:while语句结束后,返回的是a[0]的地址,所以应声明一个指向s的指针。修改后的程序和运行结果如图所示。

结果正确!

4程序设计的实验步骤及结果

(1)

1)创建一个工程

建立名为prj2的工程。

2)编辑源文件和保存

程序如下

#include<stdio.h>

void f(long int);

int main()

{

longint a = 123456789;

f(a);

return 0;

}

void f(long int a)

{

char *p, x, y;

p = &a;

p = p + 3;

inti;

C语言程序设计实验报告8

C语言程序设计实验报告8

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

6 / 13

{

x = (*p) & 0x0f;

if (x < 10)

x = x + '0';

else

x = x + 'A' - 10; y = (*p >> 4) & 0x0f; if (y < 10)

y = y + '0';

else

y = y + 'A' - 10; printf("%c %c\n", y, x);

p--;

}

}

该程序运行结果如图所示:

结果正确!

(2)

1)创建一个工程

建立名为prj3工程。

2)编辑源文件和保存

程序如下

#include<stdio.h>

#include<string.h>

#define n 3

#define MAX 80

void f(char *);

int main()

{

char a[n][MAX];

inti;

printf("input %d??×?·?:\n", n); for (i = 0; i< n; i++)

{

gets(a[i]);

f(a[i]);

C语言程序设计实验报告8

}

7 / 13

printf("?????ó??\n");

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

if (strlen(a[i]) > 0)

puts(a[i]);

return 0;

}

void f(char *p)

{

inti, j;

for (i = 0, j = 0; *(p + i) != '\0';) {

*(p + j) = *(p + i);

i++;

j++;

if((*p + i - 1) == ' ')

{

while (*(p + i) == ' ')

i++;

}

}

*(p + j) = '\0';

}

运行结果如图所示

结果正确!

(3)

1)创建一个工程

建立名为prj4程。

2)编辑源文件和保存

程序如下

#include<stdio.h>

#include<string.h>

#define n 5

void sort1(int *, int);

C语言程序设计实验报告8

void sort2(int *, int);

8 / 13

int main(intargc, char *argv[])

{

int a[n];

inti;

void (*p)(int *, int);

printf("input %d integers:\n", n); for (i = 0; i< n; i++)

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

if (argc> 1 && !strcmp(argv[1], "-d")) p = sort1;

else

p = sort2;

p(a, n);

printf("after sort:\n");

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

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

return 0;

}

void sort1(int *a, int m)

{

inti, j, t;

for(i = 0; i< m - 1; i++)

for(j = 0; j < m - 1 - i; j++)

{

if(*(a + j) < *(a + j + 1))

{

t = *(a + j);

*(a + j) = *(a + j + 1); *(a + j + 1) = t; }

}

}

void sort2(int *a, int m)

{

inti, j, t;

for(i = 0; i< m - 1; i++)

for(j = 0; j < m - 1 - i; j++)

{

if(*(a + j) > * (a + j + 1)) {

t = *(a + j);

*(a + j) = *(a + j + 1); *(a + j + 1) = t; }

9 / 13

}

}

程序运行结果如图所示

未输入“-d”

输入“-d”后

结果正确!

(4)

1)创建一个工程

建立名为prj5程。

2)编辑源文件和保存

程序如下

#include<stdio.h>

#include<string.h>

#define N 3

#define M 3

double f1(int *p1);

double f2(int *p2);

int f3(int *p3);

int f4(int *p4);

int f5(int *p5);

int main()

{

inti, j;

int a[M][N];

char b[M][10];

char (*pb)[10] = b;

printf("输入%d门课程名称

C语言程序设计实验报告8

C语言程序设计实验报告8

:\n", M);

10 / 13

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

gets(pb[i]);

printf("输入%d个学生%d门课程的成绩:\n", N, M); for(i = 0; i< N; i++)

for(j = 0; j < M; j++)

scanf("%d", &a[i][j]);

printf("个人平均成绩:\n");

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

printf("%lf\t", f1(*a + i * M));

printf("\n全班平均成绩:\n");

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

printf("%s\t%lf\n", *(pb + i), f2(*a + i)); printf("\n低于全班各门平均分人数:\n");

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

printf("%s\t%d\n", *(pb + i), f3(*a + i)); printf("\n不及格人数:\n");

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

printf("%s\t%d\n", *(pb + i), f4(*a + i)); printf("\n90分以上人数:\n");

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

printf("%s\t%d\n", *(pb + i), f5(*a + i)); return 0;

}

double f1(int *p1)

{

inti;

doubleave = 0;

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

ave += *(p1 + i);

ave /= M;

returnave;

}

double f2(int *p2)

{

inti;

doubleave = 0;

for(i = 0; i< M * N; i += M)

ave += *(p2 + i);

ave /= N;

returnave;

}

int f3(int *p3)

{

inti;

11 / 13

int j = 0;

for(i = 0; i< M * N; i += M) if (*(p3 + i) < f2(p3)) j++;

return j;

}

int f4(int *p4)

{

inti;

int j = 0;

for(i = 0; i< M * N; i += M) if (*(p4 + i) < 60 ) j++;

return j;

}

int f5(int *p5)

{

inti;

int j = 0;

for(i = 0; i< M * N; i += M) if (*(p5 + i) >= 90 ) j++;

return j;

}

程序运行结果如图所示

C语言程序设计实验报告8

12 / 13

(四) 实验体会

编写C语言程序应熟练掌握指针的说明,赋值,使用;熟悉指向数组指针的使用;同时还要掌握指针函数、函数指针以及指针数组的用法。掌握带有参数的main函数的用法。带参数的main函数提供了一种向程序传输命令行参数的途径。在所传递的两个参数中,第一个整型形参表示命令行中字符串的个数,另一个则是指向命令行中各字符的字符指针数组。带参数main函数的运用提供了命令行可选参数,是程序编写、问题的解决更加多样化。

在本次实验过程中,自己在指针数组应用这方面还不是很熟练,在用指针表示一维和多维数组时总是不能一次性得到正确的结果,今后在这方面还有待加强,还要多加训练。在函数指针这方面,我有时还是不能准确用指针定义函数的形参,经常出错,在修改程序上花费了好多时间。如果能准确高效而且熟练的运用指针,那将成为编写程序的有力工具!我们现在还都是初学者,还要努力,多加练习。要做到能够熟练运用指针!

13 / 13

相关推荐