第6章 程序开发

更新时间:2024-04-08 18:52:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第六章 程序开发 ........................................................................................................................... 1

6.1 指针 ........................................................................................................................... 1

6.1.1知识点复习 ...................................................................................................... 1 6.1.2基础题 .............................................................................................................. 2 6.1.3综合应用题 ...................................................................................................... 3 6.1.4测试题 .............................................................................................................. 4 6.2 链表 ............................................................................................................................ 9

6.2.1知识点复习 ...................................................................................................... 9 6.2.3综合应用题 .................................................................................................... 12 6.2.4测试题 ............................................................................................................ 13 6.3 数据文件 ................................................................................................................ 20

6.3.1知识点复习 .................................................................................................... 20 6.3.2选择题 ............................................................................................................ 21 6.3.3综合应用题 .................................................................................................... 23 6.3.4测试题 ............................................................................................................ 23

第六章 程序开发

6.1 指针 6.1.1知识点复习

1.指针变量定义形式: [存储类型] 数据类型 *指针名;

2. 一个指针变量所指的类型一经定义,就认定了如何识别首地址,只能指向定义时所规定类型的变量。

3. 指针变量定义后,变量值不确定,应用前必须先赋值。也就是进行指针变量的初始化:

[存储类型] 数据类型 *指针名=初始地址值;

4. 指针变量可指向数组,也可指向数组元素。也就是把数组的起始地址或一个元素的地址赋值给指针变量。

6.1.2基础题

1、变量的指针,其含义是指该变量的 。

A.值 B.地址 C.名 D.一个标志

2、 已有定义int k=2;int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是 。

A.k=*ptr1+*ptr2 B.ptr2=k C.ptr1=ptr2 D.k=*ptr1*(*ptr2) 3、 若有说明:int *p,m=5,n;以下程序段正确的是 。 A.p=&n ; B.p = &n ; scanf(“%d”,&p); scanf(“%d”,*p); C.scanf(“%d”,&n); D.p = &n ; *p=n ; *p = m ;

4、 若有说明:int *p1, *p2,m=5,n;以下均是正确赋值语句的选项是 。 A.p1=&m; p2=&p1 ; B.p1=&m; p2=&n; *p1=*p2 ; C.p1=&m; p2=p1 ; D.p1=&m; *p1=*p2 ;

5、 设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是 。

A.c=*p1+*p2 B.p2=c C.p1=p2 D.c=*p1*(*p2) 6、 以下说明不正确的是 。

A.char a[10]=”china” ; B.char a[10],*p=a; p=”china”; C.char *a; a=”china” ; D.char a[10],*p; p=a=”china”; 7、 若有定义:int (*p)[4];则标识符p 。

A.是一个指向整型变量的指针 B.是一个指针数组名

C.是一个指针,它指向一个含有四个整型元素的一维数组 D.定义不合法

8、 若int x ,*pb; ,则正确的赋值表达式是 。

A. pb=&x B. pb=x; C. *pb=&x; D. *pb=*x

9、 有如下程序段

int *p ,a=10 ,b=1 ; p=&a ; a=*p+b ;

执行该程序段后,a 的值为 。

A. 12 B. 11 C. 10 D. 编译出错

10、软件测试的目的是? A.软件的正确性

B.找出软件系统中存在的所有错误 C.证明软件系统中存在错误

D.尽可能多的发现软件系统中的错误

6.1.3综合应用题

1、编程实现:对在一维数组中存放的10整数进行如下的操作:从第3个元素开始直到最后一个元素,依次向前移动一个位置,输出移动后的结果,用指针的方法进行编程。 2、编程实现:在一个字符数组中存放“AbcDEfg”字符串,编写程序,把该字符串中的小写字母变为大写字母,把该字符串中的大写字母变为小写字母,用指针的方法进行编程。

3、编程实现:用字符指针变量,进行5个字符串的输入,字符串大小的比较,并且输出5个字符串中最小的字符串。

4、编程实现:通过键盘输入10个整数在一维数组中,并且把该数组中所有为偶数的数,放在另一个数组中,用指针的方法进行编程。

5、编程实现:从键盘上输入10个整数,用指针的方法编程按降序完成从大到小的排序。

6.1.4测试题

1、 若有以下定义和语句,且0≤i<10则对数组元素的错误引用是 。

int a[10]={1,2,3,4,5,6,7,8,9,10},*p,i; p=a;

A. *(a+i) B. a[p-a] C. p+i D. *(&a[i])

2、 若有定义:int a[3][4]; , 不能表示数组元素a[1][1]。

A. *(a[1]+1) B. *(&a[1][1]) C. (*(a+1)[1]) D. *(a+5)

3、 对于类型相同的两个指针变量之间,不能进行的运算是 。

A. < B. = C. + D. -

4、 若已定义:int a[9] ,*p=a;并在以后的语句中未改变p 的值,不能表示a[1] 地 址的表达式是 。

A. p+1 B. a+1 C. a++ D. ++p

5、 有如下说明

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

则数值为9 的表达式是 。

A. *p+9 B. *(p+8) C. *p+=9 D. p+8

6、程序的功能:以下函数用来在w数组中插入数x,w数组中的数已按由小到大的顺序存放,n所指存储单元中存放数组中数据的个数,x插入后数组中的数仍有序。请填空。 【本题程序】

void fun(char *w,char x,int *n) {int i,p; p=0; w[*n]=x;

while(x>w[p]) ;

for(i=*n;i>p;i--) w[i]= ; w[p]=x; ++*n; }

7、程序的功能:fun1函数的调用语句为:fun1(&a,&b,&c);它将三个整数按由大到小的顺序调整后依次放入a、b、c三个变量中,a中放最大数。请填空。 【本题程序】 void fun2(int *x, int *y) {int t;

t=*x; *x=*y; *y=t; }

void fun1(int *pa,int *pb,int *pc) {if(*pc>*pb) fun2( ); if(*pa<*pc) fun2( ); if(*pa<*pb) fun2( ); }

8、程序的功能:统计从终端输入的字符中每个大写字母的个数,用#号作为输入结束标志。请填空。 【本题程序】

#include #include void main( ) { int num[26],i; char c,*pc=&c;

for(i=0; i<26; i++) num[i]=0;

union { int i; char c; float a; }test;

则sizeof(test)的值是 。 A. 4 B. 5 C. 6 D. 7 6、若有以下程序段: struct dent { int n; int *m; };

int a=1,b=2,c=3;

struct dent s[3] = { {101,&a},{102,&b},{103,&c} }; struct dent *p=s;

则以下表达式中值为2的是 。

A. (p++)->m B. *(p++)->m C. (*p).m D. *(++p)->m

7、若有以下说明语句,则对结构变量pup中sex域的正确引用是 。 struct pupil { char name[20]; int sex; }pup,*p; p=&pup;

A. p.pup.sex B. p->pup.sex C. (*p).pup.sex D. (*p).sex 8、以下对结构变量stul中成员age的非法引用是 。

struct student { int age; int num; }stu1,*p; p=&stu1;

A.stu1.age B. student.age C. p->age D. (*p).age 9、已知:

struct sk { int a; int age; }date,*p;

如果要使指针p指向data中的成员a,正确的赋值语句是 。 A. p = (struct sk *)&data.a; B. p = (struct sk *)data.a; C. p = &data.a; D. *p = data.a; 10、设有如下定义:

struck sk { int a; float b; } data; int *p;

若要使P 指向data 中的a 域,正确的赋值语句是 。 A. p=&a; B. p=data.a; C. p=&data.a; D. *p=data.a;

6.2.3综合应用题

1、编程实现:利用指向结构体的指针编制一程序,实现输入三个学生的学号、数学期中和期末成绩,然后计算其平均成绩并输出成绩表.

2、编程实现:有四名学生,每个学生包括学号、姓名、成绩, 要求找出成绩最高者的学号、姓名和成绩(要求用指针数组方法)。

3、编程实现:有四名学生,每个学生包括学号、姓名、成绩,要求按学生成绩由高到低进行排序(要求用指针数组方法)。

4、编程实现:有n个学生,每个学生的数据包括学号(num),姓名(name[20]),性别(sex),年龄(age),三门课的成绩(score[3])。要求在main函数中输入这n个学生的数据, 然后调用一个函数count,在该函数中计算出每个学生的总分和平均分, 然后打印出所有各项数据(包括原有的和新求出的)。本题用指针方法处理,即用指针变量逐次指向数组元素,然后向指针变量所指向的数组元素输入数据,并将指针变量作为函数参数将地址值传给count函数, 在函数count中作统计,再将数据返回到main函数,在main函数中输出。 5、编程实现:建立并输出100个同学的通讯录,每个通讯录包括同学的姓名、地址、邮政编码。

6.2.4测试题

1、若有以下说明和语句,则值为6的表达式是 。 A.p++->n B.p->n++ C.(*p).n++ D.++p->n struct st { int n ;

struct st *next ; } main()

{ struct st a[3] , *p ;

a[0].n=5 ; a[0].next = &a[1] ; a[1].n=7 ; a[1].next = &a[2] ; a[2].n=9 ; a[0].next = ‘\\n’ ; p=&a[0];…… }

2、已知学生记录描述为:

struct student {

int no ; char name[20]; char sex; struct {

int year; int month ; int day ; } birth ; } s ;

设结构变量s中的“birth”应是“1985年10月1日”,则下面正确的赋值方式是 。 A.year=1985 B.birth.year=1985 month=10 birth.month=10 day=1 birth.day=1 C.s.year=1985 D.s.birth.year=1985 s.month=10 s.birth.month=10 s.day=1 s.birth.day=1 3、下面程序的运行结果是 。 main ( ) {

struct complx { int x; int y ; } cnum[2]={1,3,2,7} ;

printf(“%d\\n”,cnum[0].y/cnum[0].x*cnum[1].x) ; }

A.0 B.1 C.2 D.6 4、以下对结构体变量成员不正确的引用是 D 。 struct pupil

{

char name[20]; int age; int sex ; } pup[5], *p=pup ;

A.scanf(“%s”,pup[0].name); B.scanf(“%d”,&pup[0].age); C.scanf(“%d”,&(p->sex)); D.scanf(“%d”,p->age);

5、若已建立下面的链表结构,指针p、s分别指向图中所示的结点,则不能将s所指的结点插入到链表末尾的语句组是 。

A. s->next=NULL; p=p->next; p->next=s; B. p=p->next; s->next=p->next; p->next=s; C. p=p->next; s->next=p; p->next=s;

D. p=(*p).next; (*s).next=(*p).next; (*p).next=s;

6、程序的功能:已有以下函数creatlist用来建立一个带头节点的单链表,新的结点总是插入在链表的末尾。链表的头指针作为函数值返回,链表最后一个节点的next成员中放入NULL,作为链表结束标志。读入时字符以#表示输入结束(#不存入链表)。请填空。 【本题程序】 struct node {char data; struct node * next; };

creatlist( ) {struct node * h,* s,* r;char ch;

s head data next E p G F NULL

h=(struct node *)malloc(sizeof(struct node)); r=h; ch=getchar( ); while(ch!= ‘#’)

{s=(struct node *)malloc(sizeof(struct node)); s->data= ; r->next=s; r=s; ch=getchar( );} r->next= ; return h; }

7、设有如下说明: struct description { int len ; char *str ; } ;

struct description s[ ]={{ 0, \strcut description *p = s;

请在下列各小题前面的空白处填入相应表达式的值。 ( )(1)++p->len ( )(2)p->len++ ( )(3)(++p)->len ( )(4)(p++)->len ( )(5)++*p->str ( )(6)*p->str++

( )(7)(*p->str)++ ( )(8)*p++->str ( )(9)*++p->str ( )(10)*(++p)->str

8、程序的功能:链表遍历。链表遍历操作是这样的:(1)单向链表总是从头结点开始的;(2)每访问一个结点,就将当前指针向该结点的下一个结点移动:p=p->next;(3)直至下一结点为空p=NULL。请填空。 【本题程序】

void print (struct student *head) { struct student * p;

printf(\ p=head; if( ) do

{ printf(\ ; }while( ); }

9、程序功能是:建立一个有三个结点的简单链表。修订程序使其实现其功能。 【本题待修订程序】

/*1*/ #define NULL 0 /*2*/ struct student /*3*/ { /*4*/ int num; /*5*/ char *name; /*6*/ int age ;

/*7*/ struct student *next; /*8*/ };

/*9*/ void main() /*10*/ {

/*11*/ struct student a,b,c,*head,*p;

/*12*/ a.num=1001; a.name=\ /*对结点成员进行赋值/*13*/ b.num=1002; b.name=\/*14*/ c.num=1003; c.name=\

/*15*/ head=a; /* 建立链表,a为头结点 */ /*16*/ a.next=&b; /*17*/ b.next=&c; /*18*/ c.next=NULL;

/*19*/ p=head; /* 输出链表 */ /*20*/ do{

/*21*/ printf(\/*22*/ p=p->next;

/*23*/ }while(p=NULL); /*24*/ }

10、程序功能是:输入学生的姓名和成绩,然后输出。修订程序使其实现其功能。 【本题待修订程序】

/*1*/ #include /*2*/ struct stuinf

/*3*/ { char name[20]; /* 学生姓名 */ /*4*/ int score; /* 学生成绩 */ /*5*/ } stu, p;

*/ /*6*/ main ( )

/*7*/ { p=stu; /*8*/ printf(\; /*9*/ gets(stu.name); /*10*/ printf(\; /*11*/ scanf(\,&stu.score );

/*12*/ printf(\,p->name ,p->score ); /*13*/ }

11、程序功能是:读入一行字符(如:a、...y、z),按输入时的逆序建立一个链接式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。修订程序使其实现其功能。

【本题待修订程序】

/*1*/ #include /*2*/ main( ) /*3*/ { struct node /*4*/ { char info; /*5*/ struct node *link; /*6*/ } top,*p; /*7*/ char c; /*8*/ top=NULL;

/*9*/ while((c= getchar( )) = '\\n' )

/*10*/ { p=(struct node *)malloc(sizeof(struct node)); /*11*/ p->info=c; /*12*/ p->link=top;

/*13*/ top=p; /*14*/ }

/*15*/ while( top ) /*16*/ { p=top ; /*17*/ top=top->link; /*18*/ putchar(p->info); /*19*/ free(p); /*20*/ } /*21*/ }

12、编程实现:将一个链表按逆序排列,即将链头当链尾,链尾当链头。

13、编程实现:已有a,b两个按学号升序排列的链表,每个链表中的结点包括学号、成绩。要求把两个链表合并, 按学号升序排列。

14、编程实现:有两个链表a,b。设结点中包含学号、姓名。从a链表中删去与b链表中所有相同学号的那些结点。

15、编程实现:功能是从键盘输入一个字符串,然后反序输出输入的字符串。用指针链表的方法进行编程。注释:程序在从键盘接受字符的同时就在建立起链表,所建立的链表本身就已经是反序排列的,因此在反序输出字符串的时候实际只需沿着链表的第一个结点开始,顺序操作即可。

16、编程实现:编写函数将指针p2所指向的线性链表,串接到p1所指向的链表的末端。假定p1所指向的链表非空。

6.3 数据文件 6.3.1知识点复习

文件可分为普通文件和设备文件两种。设备文件如:显示器、打印机、键盘等;普通文件是指驻留在磁盘或其他外部介质上的一个有序数据集。

在C语言中按内容存放方式文件可分为文本文件和二进制文件两种,按处理方式文件可分为缓冲文件和非缓冲文件。

文件的操作过程 1.打开文件

函数原型:FILE *fopen(char *filename,char *mode) 调用方式:fp1=fopen(“文件名”,”模式”);

函数功能为:打开以字符串filename为文件名的文件,函数的返回值为指向该文件的FILE类型变量的首地址,当打开文件失败时,返回NULL。 2.对文件进行读写操作 文件字符读函数fgetc

函数原型:int fgetc(FILE *fp) 调用方式:ch=fgetc(fp);

函数功能:从fp指向的位置读取一个字符,将字符的ASCII值赋给ch。如果在执行函数fgetc时遇到文件结束符,函数返回一个文件结束标志EOF(-1)。读入字符后,文件读写位置向后移动一个字节。 文件字符写函数fputc

函数原型:int fputc(char ch, FILE *fp) 调用方式:fputc(ch,fp);

函数功能:在fp指向的位置写入一个字符(ch的值)。写入字符成功,函数返回值为该字符的ASCII值;写入不成功,则返回值为EOF(-1)。写入字符后,文件的读写位置向后移动一个字节。 3.关闭文件

函数原型:int fclose(FILE *stream); 调用方式:fclose(fp);

6.3.2选择题

1、C语言中标准输入文件stdin是指 。 A. 键盘 B. 显示器 C. 鼠标 D. 硬盘

2、要打开一个已存在的非空文件\用于修改,选择正确的语句 。

A. fp=fopen(\; B. fp=fopen(\; C. fp=fopen(\; D. fp=fopen('file\;

3、当顺利执行了文件关闭操作时,fclose函数的返回值是 。 A. -1 B. TRUE C. 0 D. 1 4、fscanf函数的正确调用形式是 。 A. fscanf (文件指针, 格式字符串, 输出列表); B. fscanf (格式字符串, 输出列表, 文件指针); C. fscanf (格式字符串, 文件指针, 输出列表); D. fscanf (文件指针, 格式字符串, 输入列表);

5、使用fgetc函数,则打开文件的方式必须是 。

A. 只写 B. 追加 C. 读或读/写 D. 参考答案B和C都正确 6、下面程序的输出是 。 main ( )

{ printf(\; }

A. -1 B. 0 C. 1 D. 程序是错误的 7、C语言可以处理的文件类型是 。

A. 文本文件和数据文件 B. 文本文件和二进制文件 C. 数据文件和二进制文件 D. 数据代码文件 8、C语言库函数fgets(str,n,fp)的功能是 。 A. 从文件fp中读取长度n的字符串存入str指向的内存 B. 从文件fp中读取长度不超过n-1的字符串存入str指向的内存 C. 从文件fp中读取n个字符串存入str指向的内存 D. 从str读取至多n个字符到文件fp中 9、函数rewind的作用是 。

A. 使位置指针重新返回到文件的开头 B. 将位置指针指向文件中所要求的特定位置 C. 使位置指针指向文件的末尾

D. 使位置指针自动移至下一个字符位置

10、在执行fopen函数时,若执行不成功,则函数的返回值是 。 A. TRUE B. –1 C. 1 D. NULL

6.3.3综合应用题

1、编程实现:将文件flie1.c的内容输出到屏幕,并复制到flie2.c中。 2、编程实现:统计文件letter.txt中小写字母 c的个数。

3、编程实现:从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件”test.dat”中保存。输入的字符串以回车结束。

4、编程实现:有5个学生,每个学生有3门课的成绩,从键盘输入数据。(包括学生号、姓名、三门课成绩)、计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件”stud.dat”中。

5、编程实现:统计文件中的字符的个数。

6.3.4测试题

1、若fp是指某文件的指针,且已读到文件的末尾,则表达式feof(fp)的返回值是 。

A. EOF B. –1 C. 非零值 D. NULL

2、在C程序中,可把整型数以二进制形式存放到文件中的函数是 。 A. fprintf函数 B. fread函数 C. fwrite函数 D. fputc函数 3、在C程序中,如要定义文件指针fp,定义形式为 。 A. FILE *fp; B. FILE fp; C. FILE &fp; D. FILE (fp); 4、 函数可以把文件指针定义到文件中的任何位置。 A. fprintf函数 B. fread函数 C. fseek函数 D. fputc函数

5、fgets函数的作用是从指定文件读入一个字符,该文件的打开方式必须是 。 A. 只写 B. 追加 C. 读或读/写 D. 参考答案B和C都正确

6、程序的功能:用户由键盘输入一个文件名,然后输入一串字符(用#结束输入)存放到此文件中,形成文本文件,并将字符的个数写到文件尾部。请填空。 【本题程序】 #include main( ) {FILE *fp;

char ch,fname[32]; int count=0;

printf(\:\; scanf(\,fname);

if((fp=fopen( ,\ {printf(\:%s\\n\,fname); exit(0);}

printf(\:\\n\; while((ch=getchar())!=\ {fputc(ch,fp); count++;}

fprintf( ,\,count); fclose(fp); }

7、程序的功能:把从键盘输入的字符存放到一个文件中,用字符#作为结束符。请填空。

【本题程序】 #include

main() {FILE *fp;

char ch, fname[10];

printf(“Input the name of file:\\n”); gets (fname);

if((fp=fopen( ))= =NULL) {printf(“can’t open file\\n”); exit(0); ; }

while((ch=getchar())!=‘#’) fputc ( ); fclose (fp); }

8、程序的功能:统计文件中字符的个数。请填空。 【本题程序】 #include main() {FILE *fp; long num=0;

if((fp=fopen(“fname.dat”, “r”))= =NULL) {printf(“can’t open file\\n”); exit(0); }

while {fgetc (fp);

num++;}

printf(“num=%d\\n”, num); fclose (fp); }

9、程序功能是:把从键盘输入的文件(用 @ 作为文件结束标志)复制到一个名为second.txt的新文件中。修订程序使其实现其功能。 【本题待修订程序】

/*1*/ #include

/*2*/ FILE fp; /*3*/ main() /*4*/ { char ch;

/*5*/ if(fp=fopen(\ /*6*/ exit(0);

/*7*/ while((ch=getchar())!='@') /*8*/ fputc(ch,fp); /*9*/ fclose(fp) ; /*10*/ }

2、程序功能是:将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)。修订程序使其实现其功能。 【本题待修订程序】

/*1*/ #include /*2*/ main(int argc,char *argv[]) /*3*/ { FILE &f1,*f2; /*4*/ if(argc< 3 )

/*5*/ { printf(\;

/*6*/ exit(0); /*7*/ }

/*8*/ f1=fopen(argv[1], \; /*9*/ f2=fopen(arhv[2], \; /*10*/ while(!feof(f1)或feof(f1)==0) /*11*/ fputs(fgetc(f1), f2 ); /*12*/ fclose(f2); /*13*/ fclose(f1); /*14*/ }

3、程序功能是:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。修订程序使其实现其功能。 【本题待修订程序】

/*1*/ #include \ /*2*/ main() /*3*/ { FILE *fp;

/*4*/ char ch,filename[10]; /*5*/ scanf(\

/*6*/ if((fp=fopen(filename,\ /*7*/ {printf(\ /*8*/ exit(0);} /*9*/ ch=getchar(); /*10*/ ch=getchar(); /*11*/ while(ch!='#')

/*12*/ { putchar(ch); fputc(ch,fp); /*13*/ ch=getchar();

/*14*/ } /*15*/ fclose(fp); /*16*/ }

1、程序实现:从键盘输入3个学生的数据,将它们存入文件student;然后再从文件中读出数据,显示在屏幕上。

2、程序实现:从键盘输入一行字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件\中保存。

3、程序实现:用冒泡排序将10个整数从小到大排序,排序后结果输出到屏幕及文件myf.out中。

4、程序实现:编写函数countpi,利用公式

1121231234???????????3353573579 2

-5

计算π的近似值,当某一项的值小于10时,认为达到精度要求,请完善函数。将结果

?1?显示在屏幕上并输出到文件picount.out中。

5、程序实现:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。

?

本文来源:https://www.bwwdw.com/article/lcgr.html

Top