1、 if(*p!=0) i+; /该位置的人未退出,则报数 if(i-3)=0) *p=0;i=0;k-; /报数为3,则退出(数组元素赋值0),剩余人数减1 p+; /移动到下一个位置 for(i=1;i=N;i+) /寻找未退出的数组元素的值(排号) if(ai!=0) printf(The last number is %dn,ai);是否理解以上代码?指针变量p的作用是什么?2、程序改错调试下列程序的功能为:通过调用函数实现对所输入的任意两个整数,交换它们的值。程序中有三处错误。#includeswap(int *p1,int *p2) /1 int *p; /2*p=*p1; /3*p
2、1=*p2; /4*p2=*p; /5main() /6 int a,b; /7scanf(%d%d,&a,&b); /8printf(a=%dtb=%dn,a,b); /9swap(& /10 /113、程序填空通过指针变量的自增运算,扫描一维数组中全部元素的地址,并引用它们各自的值,同时对数组中的正整数求和。#include stdio.h#define N 10main() int i,k,aN,sum,count,*p; /所有变量和数组a的基类型都是int count=sum=0; do printf( input k: n); scanf(%dk); / 总共要求输入k个数 whi
3、le (kN); / 直到型循环确保0kN printf( input a0a%d:n,k-1); for (p=a;a+k;p+) / 指针p指向数组a的首地址,p依次求出后继值 scanf(, 【1】 ); / 此处的p等价于&ai if ( 【2】 ) / 引用指针变量p所指变量的值 sum+=*p; / 指针p所指变量*p的值0者相加 count+; / 正整数个数统计 【3】 ; / 指针复位,重新指向数组a 的首地址 while (p0 is : %dn,count); Sum of ,sum);4、程序调试分析:先分析程序运行结果,然后通过单步执行方式,观察每一步执行情况及运行结
4、果。(提示:理解*与+的混合使用) int a=1,3,5,7,9,*p=a; printf(,(*p+);,(*+p);%dn,(*+p)+);(提示:理解指针变量自加的作用,指针变量的值与指针变量所指向变量的值的区别) int a10=1,2,3,4,5,6,7,8,9,10; int *p; for(p=a;a+10;p+) printf(address=%xt,p); printf(value=%dn,*p); %dt回答以下几个问题:修改指针变量值的输出格式,即把程序中的printf(改为printf(address=%dt,重新运行程序,观察结果,这样是否更清楚?(提示:格式符%x
5、是以16进制整数输出,t是转义字符)程序运行后最后一行显示的数据是哪个单元的数据?画一张图来看看;能否用*p=10;对这个单元赋值?将程序中所有的int换成float,数据输出格式改为%f,观察指针变量的变化规律;这次相邻地址值相差多少?通过以上,你对指针变量的含义理解了吗?指针变量+(如p+)是指针地址值加1吗?如果只将程序中的float *p;改为int *p;编译出现什么警告?说明什么?三、实验小结实验2、指针(2)1、进一步熟悉和掌握指向变量的指针变量、指向一维数组的指针变量的应用2、掌握指向字符数组的指针变量的应用;3、熟悉指针数组、指向指针的指针变量的应用;4、了解指针与二维数组的
6、关系,理解行指针的概念;5、进一步掌握程序调试的方法。1、程序改错调试下列程序的功能为:统计已知字符串中数字符的个数。程序中有两处错误。int digits(char *s) /1 int c=0; while(s) /3 if(*s =0&*s =9) /4 c+; /5 s+; /6 return c; /7main() /8 char s80;请输入一行字符n gets(s);数字字符长度是:,digits(s); /12下面程序的功能是:通过调用函数fun找出一维数组元素中最大的值和它所在的下标,最大值的和它所在的下标通过形参指针p和q传回。数组元素中的值在主函数中赋予,主函数中x是数
7、组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标。程序中有处错误。#include /1void fun(int a,int n, int *p, int *q) /2 int i; /3 *p=a0; /4 *q=0; /5 for(i=1;n;i+) /6 if(*pai) /7 *p=ai; /8 q=i; /9 main() /10 int i, x50,max,index, n=10; /11 for(i=0;i+) /12 scanf(xi); /13%4d,xi); /14 fun(x,n,max,index); /15 nMax=%d,Index=
8、%dn,max,index); /162、程序填空以下程序的作用是扫描字符数组a和字符数组b,并输出对应位置相同的字符。 char a10=language,b=programe; 【1】 ; int k; p1=a; p2=b; for(k=0;k8;k+) if(*(p1+k)= 【2】 )%cn,*(p1+k);函数void delete_blank(char *p)的功能为将指针p所指向的字符串中的空格给去掉。#define N 80 void delete_blank(char *p); char aN,i; char *p; 【3】 ; gets(a); 【4】 ;/ void 调
9、用delete_blank(char *p)函数 puts(a);void delete_blank(char *p) char *q; q=p; while(*q!=0 if(*q! ) 【5】 ; /p指针所指向的内存单元赋值,并将p指针后移 q+; *p=以下两段程序是分别用数组、指针来实现的统计一个字符子串sunstr在一个字符串str中出现的次数(如:字符子串boy在字符串that boy is a good boy!中出现2次)。请填空以实现所要求的功能(注意对比!)。3、程序调试分析:(知识点:指向二维数组的指针变量,画图理解!move(int *pointer) int i,j
10、,t;3;i+) for(j=i;j char str100,*p; int a100,*q=a,num=0,i;input a string: gets(str); for(p=str;*p! if(*p0 *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、掌握结构类型的声明、结构体类型变量和结构体类型数
11、组的定义和使用;2、熟悉利用结构变量名、结构指针引用结构体成员的方法;1、分析以下各个程序的执行结果,并与运行结果进行比较,理解结构体类型数组的使用。 struct myweek char name12; int day; ; struct myweek week7=Monday,1,Tuesday,2,Wednesday,3,Thursday,4,Firday,5,Sataday,6,Sunday,7;,week2.name1); 比较以下两段程序,想想为什么结果不同? struct stu char num5; float score3; struct stu a3=01,60,70,80
12、,02,70,75,80,03,90,95,92,*p=a; float sum=0; for (i=0; sum=sum+p-scorei;%6.2fn struct stu,90,95,92; sum=sum+ai.scorei; #include struct stu int num; char name10; int age; void fun(struct stu *p) printf(,(*p).name); struct stu students3=9801,Zhang,20,9802,Wang,19,9803,Zhao,18; fun(students+2);2、程序改错调试:
13、学生姓名(name)和年龄(age)存于结构体数组person中,函数fun的功能是:找出年龄最小的那名学生并输出该学生的姓名和成绩。struct stud char name20; int age;fun(struct stud person,int n) /1 int min,i; min=0; /3i+) /4 if(personi name, 【2】 )=0) printf (price is %dn, 【3】 ); break; if( 【4】 ) No found !有3名学生,每个学生信息包含学号、姓名、数学成绩、英语成绩、C语言成绩和三门课程的总分。编写一个程序,对学生的各项数
14、据进行输入、计算每个学生三门课的总分并输出。定义一个描述平面上一个点的结构体Point(自行设计一个合适的结构体类型,包含必要的成员),编程实现下列功能:为点输入坐标值。求两个点中点坐标。求两点间距离。(本题选做)某唱歌比赛决赛有5名选手入围,共有六位评委分别给每位选手打分;对每个选手,去掉一个最高分和一个最低分后,取剩余的四个得分的平均值作为该选手的最后得分;编程实现按选手最后得分的降序排列,依此输出选手的名次、参赛编号、姓名以及最后得分。(自行设计一个合适的结构体类型,包含必要的成员)实验4、链表1、掌握静态、动态链表的基本概念;2、了解链表的创建方法及其基本操作1、程序分析:下面程序的功
15、能是构造一个如下图所示的三个结点的单向静态链表,并顺序输出链表中结点的数据。阅读、输入、编译、连接,运行并观察结果。体会构造和使用静态链表的方法。201030hNULL a b cstruct node int data; struct node *next; /* 指向本结点类型的指针是实现链表的基础 */ struct node a,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)%dn ,p-data); p=p-next; /* 指针移到下一个结点 */下面程序的功能是构造一个如下图所示的三个结点的单向动态链表,并输出链表中相关结点的数据之和。体会构造和使用动态链表的方法。321 p1 p2 p3 stdlib.h int num; struct node *p1,*p2,*p3; p1=(st