《C语言程序设计Ⅱ》实验指导书Word格式文档下载.docx
- 文档编号:3691442
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:33
- 大小:213.99KB
《C语言程序设计Ⅱ》实验指导书Word格式文档下载.docx
《《C语言程序设计Ⅱ》实验指导书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计Ⅱ》实验指导书Word格式文档下载.docx(33页珍藏版)》请在冰点文库上搜索。
if(*p!
=0)i++;
//该位置的人未退出,则报数
if((i-3)==0){*p=0;
i=0;
k--;
}//报数为3,则退出(数组元素赋值0),剩余人数减1
p++;
//移动到下一个位置
}
for(i=1;
i<
=N;
i++)//寻找未退出的数组元素的值(排号)
if(a[i]!
=0)printf("
Thelastnumberis%d\n"
a[i]);
是否理解以上代码?
指针变量p的作用是什么?
2、程序改错调试
下列程序的功能为:
通过调用函数实现对所输入的任意两个整数,交换它们的值。
程序中有三处错误。
#include<
swap(int*p1,int*p2)//1
{int*p;
//2
*p=*p1;
//3
*p1=*p2;
//4
*p2=*p;
//5
}
main()//6
{inta,b;
//7
scanf("
%d%d"
&
a,&
b);
//8
printf("
a=%d\tb=%d\n"
a,b);
//9
swap(&
//10
//11
3、程序填空
通过指针变量的自增运算,扫描一维数组中全部元素的地址,并引用它们各自的值,同时对数组中的正整数求和。
#include"
stdio.h"
#defineN10
main()
{inti,k,a[N],sum,count,*p;
//所有变量和数组a的基类型都是int
count=sum=0;
do
{printf("
inputk:
\n"
);
scanf("
%d"
k);
//总共要求输入k个数
}while(k<
=0||k>
N);
//直到型循环确保0≤k≤N
printf("
inputa[0]~a[%d]:
\n"
k-1);
for(p=a;
a+k;
p++)//指针p指向数组a的首地址,p依次求出后继值
{scanf("
【1】);
//此处的p等价于&
a[i]
if(【2】)//引用指针变量p所指变量的值
{sum+=*p;
//指针p所指变量*p的值>
0者相加
count++;
//正整数个数统计
}
【3】;
//指针复位,重新指向数组a的首地址
while(p<
a+k)
printf("
%-5d"
【4】);
//先执行*p,取出所指变量的值,再指向数组的下一元素
\nNumberofabove>
0is:
%d\n"
count);
Sumof>
sum);
4、程序调试分析:
先分析程序运行结果,然后通过单步执行方式,观察每一步执行情况及运行结果。
⑴(提示:
理解*与++的混合使用)
{inta[]={1,3,5,7,9},*p=a;
printf("
(*p++));
(*++p));
%d\n"
(*++p)++);
⑵(提示:
理解指针变量自加的作用,指针变量的值与指针变量所指向变量的值的区别)
{inta[10]={1,2,3,4,5,6,7,8,9,10};
int*p;
for(p=a;
a+10;
p++)
{printf("
address=%x\t"
p);
printf("
value=%d\n"
*p);
}
%d\t"
回答以下几个问题:
①修改指针变量值的输出格式,即把程序中的printf("
改为printf("
address=%d\t"
,重新运行程序,观察结果,这样是否更清楚?
(提示:
格式符%x是以16进制整数输出,\t是转义字符)
②程序运行后最后一行显示的数据是哪个单元的数据?
画一张图来看看;
能否用*p=10;
对这个单元赋值?
③将程序中所有的int换成float,数据输出格式改为%f,观察指针变量的变化规律;
这次相邻地址值相差多少?
通过以上,你对指针变量的含义理解了吗?
指针变量++(如p++)是指针地址值加1吗?
④如果只将程序中的float*p;
改为int*p;
编译出现什么警告?
说明什么?
三、实验小结
实验2、指针
(2)
1、进一步熟悉和掌握指向变量的指针变量、指向一维数组的指针变量的应用
2、掌握指向字符数组的指针变量的应用;
3、熟悉指针数组、指向指针的指针变量的应用;
4、了解指针与二维数组的关系,理解行指针的概念;
5、进一步掌握程序调试的方法。
1、程序改错调试
⑴下列程序的功能为:
统计已知字符串中数字符的个数。
程序中有两处错误。
intdigits(char*s)//1
{intc=0;
while(s)//3
{if(*s>
=0&
&
*s<
=9)//4
c++;
//5
s++;
//6
returnc;
//7
main()//8
{chars[80];
请输入一行字符\n"
gets(s);
数字字符长度是:
digits(s));
//12
⑵下面程序的功能是:
通过调用函数fun找出一维数组元素中最大的值和它所在的下标,最大值的和它所在的下标通过形参指针p和q传回。
数组元素中的值在主函数中赋予,主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。
程序中有处错误。
#include<
//1
voidfun(inta[],intn,int*p,int*q)//2
{inti;
//3
*p=a[0];
//4
*q=0;
//5
for(i=1;
n;
i++)//6
if(*p<
a[i])//7
{*p=a[i];
//8
q=i;
//9
}
}
main()//10
{inti,x[50],max,index,n=10;
//11
for(i=0;
i++)//12
{scanf("
x[i]);
//13
%4d"
x[i]);
//14
}
fun(x,n,max,index);
//15
\nMax=%d,Index=%d\n"
max,index);
//16
2、程序填空
⑴以下程序的作用是扫描字符数组a和字符数组b,并输出对应位置相同的字符。
{chara[10]="
language"
b[]="
programe"
;
【1】;
intk;
p1=a;
p2=b;
for(k=0;
k<
8;
k++)
if(*(p1+k)==【2】)
%c\n"
*(p1+k));
⑵函数voiddelete_blank(char*p)的功能为将指针p所指向的字符串中的空格给去掉。
#defineN80
{voiddelete_blank(char*p);
chara[N],i;
char*p;
【3】;
gets(a);
【4】;
//void调用delete_blank(char*p)函数
puts(a);
voiddelete_blank(char*p)
{char*q;
q=p;
while(*q!
='
\0'
{if(*q!
'
)
【5】;
//p指针所指向的内存单元赋值,并将p指针后移
q++;
*p='
⑶以下两段程序是分别用数组、指针来实现的统计一个字符子串sunstr在一个字符串str中出现的次数(如:
字符子串boy在字符串thatboyisagoodboy!
中出现2次)。
请填空以实现所要求的功能(注意对比!
)。
3、程序调试分析:
⑴(知识点:
指向二维数组的指针变量,画图理解!
move(int*pointer)
{inti,j,t;
3;
i++)
for(j=i;
j<
{t=*(pointer+3*i+j);
*(pointer+3*i+j)=*(pointer+3*j+i);
*(pointer+3*j+i)=t;
}
{inta[3][3]={1,2,3,4,5,6,7,8,9},*p=a[0],i;
move(p);
调用函数后数组的各元素为:
for(i=0;
%3d%3d%3d\n"
a[i][0],a[i][1],a[i][2]);
⑵(知识点:
指针数组、指向指针的指针变量,画图理解!
{char*str[]={"
English"
"
Math"
Music"
Computer"
},**q;
inti;
q=str;
for(i=0;
4;
i++)
%s\n"
*(q++));
4、编程
⑴分别用选择法、冒泡法编写一个排序的函数voidmysort(int*p,intn)。
在主调函数中通过调用该函数,对指定的n个整数进行升序排列并输出。
⑵编写一个专门用于判断一个字符串是否为回文字符串的函数intishuiw(char*p),在主函数中接受任意一串字符,通过调用该函数,给出是否是回文的结论。
⑶编程实现以下功能:
在主函数中由键盘输入10个按升序排列的整数存放在一维数组a中,通过调用以下几个自定义函数分别输出数组a、将从键盘输入的一个整数x插入到数组a使其依然有序、输出插入x后的数组a。
要求:
定义以下几个函数(注:
函数中形参指针p用来接收实参数组名a),按上述要求依次调用它们以实现所要求的功能。
①voidmyout(int*p,intn):
该函数用于输出含有n个整数的数组;
②intmyinsert(int*p,intn,intx):
该函数用于将整数x插入到一个按升序排列的包含n个数组元素的数组中,并返回插入后数组元素的个数。
⑷(本题选做)编写一个程序实现如下功能:
输入一个字符串,内有数字和非数字字符,如:
a123x45617960?
302tab5876将其中连续的数字作为一个整数,依次存放到一数组a中。
例如123放在a[0]中,456放在a[1]中……统计共有多少个整数,并输出这些数。
string.h>
{charstr[100],*p;
inta[100],*q=a,num=0,i;
inputastring:
"
gets(str);
for(p=str;
*p!
if(*p>
0'
*p<
9'
{*q=*p-'
p++;
while(*p>
*q=(*q)*10+(*(p++))-'
num++;
q++;
for(i=0,q=a;
num;
i++,q++)
%5d"
*q);
⑸(本题选做)若有两个已经按升序排列的数列a:
1,7,9,11,13,15,17,19和数列b:
2,4,6,8,10,现要将这两个数列合并存放到c数列中,插入后的c数列仍按升序排列,要求通过指针完成。
实验3、结构体
1、掌握结构类型的声明、结构体类型变量和结构体类型数组的定义和使用;
2、熟悉利用结构变量名、结构指针引用结构体成员的方法;
1、分析以下各个程序的执行结果,并与运行结果进行比较,理解结构体类型数组的使用。
⑴structmyweek
{charname[12];
intday;
};
{structmyweek
week[7]={"
Monday"
1,"
Tuesday"
2,"
Wednesday"
3,"
Thursday"
4,"
Firday"
5,"
Sataday"
6,"
Sunday"
7};
week[2].name[1]);
⑵比较以下两段程序,想想为什么结果不同?
①structstu
{charnum[5];
floatscore[3];
};
{structstua[3]={{"
01"
60,70,80},{"
02"
70,75,80},{"
03"
90,95,92}},*p=a;
floatsum=0;
for(i=0;
sum=sum+p->
score[i];
%6.2f\n"
②structstu
90,95,92}};
sum=sum+a[i].score[i];
⑶#include<
structstu
{intnum;
charname[10];
intage;
voidfun(structstu*p)
{printf("
(*p).name);
{structstustudents[3]={{9801,"
Zhang"
20},{9802,"
Wang"
19},{9803,"
Zhao"
18}};
fun(students+2);
2、程序改错调试:
学生姓名(name)和年龄(age)存于结构体数组person中,函数fun的功能是:
找出年龄最小的那名学生并输出该学生的姓名和成绩。
structstud
{charname[20];
intage;
fun(structstudperson[],intn)//1
{intmin,i;
min=0;
//3
i++)//4
if(person[i]<
person[min])min=i;
return(person);
main()
{structstuda[]={{"
21},{"
Qian"
20},{"
Sun"
19},{"
LI"
22}};
intn=4;
structstudminpers;
minpers=fun(a,n);
%s是年龄小者,年龄是:
minpers.name,minpers.age);
3、程序填空:
以下程序的功能是:
对已经存在的几本图书,任意输入一个书名,调用函数search()进行查询,如果查到了,显示出该书的单价,否则显示“Nofound!
”。
structbook
{charname[10];
intprice;
}bk[5]={{"
aaa"
10},{"
bbb"
ccc"
30},{"
ddd"
40},{"
eee"
50}};
{voidsearch(structbook*p,char*c);
charshu[10];
/*待查图书名*/
inputthesearchname:
gets(shu);
search(【1】);
search(structbook*p,char*c)
5;
i++,p++)
if(strcmp(p->
name,【2】)==0)
{printf("
priceis%d\n"
【3】);
break;
if(【4】)
Nofound!
⑴有3名学生,每个学生信息包含学号、姓名、数学成绩、英语成绩、C语言成绩和三门课程的总分。
编写一个程序,对学生的各项数据进行输入、计算每个学生三门课的总分并输出。
⑵定义一个描述平面上一个点的结构体Point(自行设计一个合适的结构体类型,包含必要的成员),编程实现下列功能:
①为点输入坐标值。
②求两个点中点坐标。
③求两点间距离。
⑶(本题选做)某唱歌比赛决赛有5名选手入围,共有六位评委分别给每位选手打分;
对每个选手,去掉一个最高分和一个最低分后,取剩余的四个得分的平均值作为该选手的最后得分;
编程实现按选手最后得分的降序排列,依此输出选手的名次、参赛编号、姓名以及最后得分。
(自行设计一个合适的结构体类型,包含必要的成员)
实验4、链表
1、掌握静态、动态链表的基本概念;
2、了解链表的创建方法及其基本操作
1、程序分析:
⑴下面程序的功能是构造一个如下图所示的三个结点的单向静态链表,并顺序输出链表中结点的数据。
阅读、输入、编译、连接,运行并观察结果。
体会构造和使用静态链表的方法。
20
10
30
h
NULL
abc
structnode
{intdata;
structnode*next;
/*指向本结点类型的指针是实现链表的基础*/
{structnodea,b,c,*h,*p;
/*定义三个结点h是头指针*/
a.data=10;
b.data=20;
c.data=30;
/*结点的数据赋值*/
h=&
a;
/*头指针指向a结点*/
a.next=&
b;
/*a结点的指针指向b结点*/
b.next=&
c;
/*b结点的指针指向c结点*/
c.next=NULL;
/*c结点的指针值为空,表示最后一个结点*/
p=h;
/*遍历每一个结点,打印数据*/
while(p)
%d\n"
p->
data);
p=p->
next;
/*指针移到下一个结点*/
⑵下面程序的功能是构造一个如下图所示的三个结点的单向动态链表,并输出链表中相关结点的数据之和。
体会构造和使用动态链表的方法。
3
2
1
p1p2p3
stdlib.h>
{intnum;
{structnode*p1,*p2,*p3;
p1=(st
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 实验 指导书