实验六 参考答案

更新时间:2024-03-25 19:47:01 阅读量: 综合文库 文档下载

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

实验六 指针与数组(参考答案)

1、设计程序sy6-1.c,有三个整形变量i,j,k。设置三个指针变量p1,p2,p3,分别指向i,j,k。然后通过指针变量使i,j,k三个变量的值顺序交换,即原来i的值赋给j,把j的原值赋给k,把k的原值赋给i。i,j,k的原值由键盘输入,要求输出i,j,k的原值和新值。 算法分析:

以前能实现两个数的交换,现在换为3个数的交换。算法应先将k的值赋给中间变量,然后依次将j赋给k,i赋给j,最后将保存在中间变量中的k赋给i;用指针实现,就是去访问每个变量都用指向该变量的指针去间接访问。 参考答案:

# include void main() {

int i,j,k,*p1,*p2,*p3,t; printf(\请输入 i,j,k: \

scanf(\%d%d\

printf(\交换前: i=%d j=%d,k=%d\\n\

p1=&i; p2=&j; p3=&k; //p1指向i,p2指向j, p3指向k

t=*p3; *p3=*p2;*p2=*p1,*p1=t; //通过指针间接访问i,j,k并实现交换 printf(\交换后: i=%d j=%d k=%d\\n\

}

运行结果:

2、设计程序sy6-2.c,已知数组{1,3,5,7,9},在其中分别用下标法、地址法和指针法访问数组元素,将它们输出。 算法分析:

指针p指向了一维数组a,则对数组元素的访问可以有如下几种方式:a[i],p[i],*(a+i),*(p+i) 参考答案:

# include void main() {

int a[5]={1,3,5,7,9},i,*p; printf(\下标法a[i]: \for(i=0;i<5;i++)

printf(\a[i]);

printf(\地址法*(a+i):*(a+i): \for(i=0;i<5;i++)

printf(\*(a+i));

printf(\指针法*p: \for(p=a;p

} 运行结果

3、设计程序sy6-3.c,利用字符指针编程,要求在一行文字:“I have 50 Yuan.”中,删去字符‘0’,使其变成:“I have 5 Yuan.”,并输出结果。 算法分析:

将字符串保存在字符数组中,然后令两个字符指针p、q变量同时指向该字符数组,p指针逐一去遍历字符串直到’\\0’结束,遍历过程中,p的目标单元只要不是要被删除的字符就把它赋给q的目标单元,赋一次值q++一次。循环完,给被删除‘0’字符的新串添上结束标志’\\0’,最后输出新串。 参考答案:

# include void main() {

char str[]=\

char *p,*q; //定义两个字符指针

p=q=str; //两个字符指针都指向字符串str

while(*p!='\\0') //p的目标单元等于'\\0'循环结束

{ if(*p!='0') //如果p的目标单元不为要被删除的字符'0' {*q=*p;q++;} //就把它赋值给q的目标单位 p++; //赋值一次,p后移一个存储单元 }

*q='\\0'; //给新的字符串添加结束标志'\\0' printf(\删除0字符后的字符串 : %s\\n\}?? 运行结果

4、 设计程序sy6-4.c,要求输入三行字符(每行不超过80个字符)存于二维字符数组中,统计出其中大写字母、小写字母、空格及其它字符的个数。(要求使用指向一维数组的

指针变量)

算法分析:

遍历二维字符数组与遍历二维字符数组的方式基本相同,都要用双重循环,内循环访问每一行时,结束的标志为该行字符串的结束标志’\\0’;另外需要用到指向一行的字符指针变量去遍历和访问每个元素。 参考答案:

# include void main() {

char ch,s[3][80],(*p)[80]; //p为指向一维数组的行指针变量 int i,j,lower=0,uppr=0,space=0,other=0; printf(\请输入3个字符串:\\n\

for(i=0;i<3;i++) //等待从键盘接收3个可以带空格的字符串 gets(s[i]); //分别赋给s[i],s[i]-第i行的首地址 p=s;

for(i=0;i<3;i++) //分别从0行到第2行

for( j=0 ; ( ch=*(*(p+i)+j)) != '\\0' ; j++ )//*(*(p+i)+j))等同于p[i][j]和a[i][j] //每行访问到当前行的结束标志即'\\0'结束 if(ch>='A' && ch<='Z') uppr++; //当前字符为大写字母,uppr++; else if(ch>='a' && ch<='z') lower++;//当前字符为小写字母,lower++; else if(ch==' ') space++; //当前字符为空格,space++; else other++; //否则,other++; printf(\小写字母个数: %d\\n\ printf(\大写字母个数 : %d\\n\ printf(\空格的个数: %d\\n\ printf(\其它字符个数 : %d\\n\}?? 运行结果

5、 设计程序sy6-5.c,请用指向一维数组的指针变量实现二维矩阵的转置,二维矩阵为int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};转置后的结果存在int b[4][3]里面。 算法分析:

转置的方法以前已经掌握,这里要用指针来处理,注意定义的指针指向a数组的行应包含4个整形数,而指向转置结果的指针变量应包含3个整形数据的行指针。 参考答案:

#include

void main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i,j, (*p)[4],(*q)[3]; //p为行指针,即可以指向一行包含4个整形数的一行

int b[4][3]; //数组b用来存放转置后的结果

p=a; q=b; //p为行指针,将行指针常量a赋给它,q指向转置后的数组b printf(\转置以前a:\\n\for(i=0;i<3;i++) {for(j=0;j<4;j++)

{printf(\ *(*(p+i)+j)); //*(*(p+i)+j)等同于p[i][j],a[i][j] q[j][i]=p[i][j]; //转置

}

printf(\ //输出一行4个数换行 }

printf(\转置后b:\\n\

for(i=0;i<4;i++) {for(j=0;j<3;j++) printf(\*(*(q+i)+j)); //*(*(q+i)+j)等同于q[i][j],b[i][j] printf(\ //输出一行3个数换行 }

}

运行结果

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

Top