实验十七 指针的使用
实验要求:
1、掌握指针的定义;
2、理解指针的含义;
3、掌握指针的基本使用;
4、能进行程序调试,并修改程序。
特别要求:
在实验中遇到困难时,切忌不要动不动就问老师,而是应该先思考。如果确实不能解决困难,先与坐在旁边的同学讨论,而无论这个同学在以前是否认识。如果有同学问你问题,无论你是否能解决这个问题,都应该和他讨论。如果讨论了仍然不能解决问题,就一起问老师。讨论问题的好处在于能够深刻的理解问题,记住问题。
程序设计
1. 下列函数change的功能是,将字符串中的小写字母转成大写字母,请填空。
#include<stdio.h>
#include<string.h>
void change( ) //1
{int i=0;
for(i=0; ;i++) //2
if(a[i]>='a'&&a[i]<='z')
; //3
}
void main()
{
char p[80];
gets(p) ; //读一行字符,中间可以有空格
change(p);
puts(p);
}
/*p11_1.c*/ char *a a[i]!= '\0' a[i]=a[i]-32 |
2,指向二维数组
阅读下面程序,写出结果,了解指针与二维数组地址的关系。
#include<stdio.h>
voidmain()
{
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int *p;
p=a[0];
printf("1:-----------------------\n");
printf("a=%lu\n",a);
printf("*a=%lu\n",a);
printf("p=%lu\n",p);
printf("a[0]=%lu\n",a[0]);
printf("&a[0][0]=%lu\n",&a[0][0]);
printf("2:--------------------------\n");
printf("a+1=%lu\n",a+1);
printf("*a+1=%lu\n",*a+1);
printf("p+1=%lu\n",p+1);
printf("a[0]+1=%lu\n",a[0]+1);
printf("&a[0][0]+1=%lu\n",&a[0][0]+1);
printf("3:-----------------------\n");
printf("*a+1*4+2=%lu\n",*a+1*4+2);
printf("p+1*4+2=%lu\n",p+1*4+2);
printf("a[0]+1*4+2=%lu\n",a[0]+1*4+2);
printf("&a[0][0]+1*4+2=%lu\n",&a[0][0]+1*4+2);
}
在上面的程序中,请回答以下问题:
(1)二维数组名a、*a分别代表什么含义?
(2)表达式a+1、*a+1分别代表什么含义?
(3)指针p与二维数组a的关联使用了这样的语句:p=a[0],是否还有其他的语句能将指针p与二维数组a相关联?能否使用这样的语句:p=a;相关联。
/*p11_2.c*/ 1 a表示二维数组a的首地址,而*a表示二维数组a第一行a[0]的首地址。 2 a+1 第一行首地址,*a+1 第0行第一列元素地址 。 3 p=a[0][0], 不能 a代表a数组的首行首元素的地址。 |
3、题目标题
回文
题目描述
回文指的是一个字符串顺过来读和倒过来读是一样的,比如”civic”。写一个函数,判断某个字符串是不是回文,并在主函数中输入字符串,调用此函数进行判断。函数原型如下:int is_huiwen(char* s);
输入描述
一个字符串
输出描述
如果此字符串为回文,输出yes,否则输入no
样例输入
civic
bonjour
样例输出
yes
no
/*p11_3.c*/ #include<stdio.h> #include<string.h> int main() { int is_huiwen(char* s); int a[81],f=1; gets(a); f=is_huiwen(a); if(f==1) printf("yes\n"); else printf("no\n"); return 0; } int is_huiwen(char *s) { int i,j,f=1; i=0;j=strlen(s)-1; while(i<j) {
if(s[i]==s[j]) { i++;j--; } else { f=0; break; }
} return f; }
|
4、下面程序的功能是将字符串a分段传送到字符串b中。要求在每五个字符后插入一个逗号,以示分段。例如字符串a为"abcdefg12345",则字符串b为"abcde,fg123,45",请选择填空。
# include <stdio.h>
main()
{ int i,k=0;
char a[80],b[80],*p;
p=a;
gets(p);
while(*p)
{for(i=1;__①__;p++,k++,i++)
b[k]=*p;
if(__②__)
{ b[k]=',' ; k++;}
}
b[k]='\0';
puts(b);
}
① A、i<5 B、i<=5
C、i<5&&*p!='\0' D、i<=5&&*p!=’\0’
② A、i= =6 B、*P= ='\0'
C、!*p D、i!=6
/*p11_4.c*/ D A |
5、空格删除
题目描述
完成函数 int strdel (char *s)的定义,它实现将指针s指向的字符串中所有空格字符删除,并统计所删除的空格字符的个数返回给主函数。编写主程序,验证strdel ()的有效性。
输入描述
输入一个带空格字符的字符串。
输出描述
对于每个测试实例,输出分两行:
第一行输出删除所有空格之后的字符串;
第二行输出被删除空格的总数。
样例输入
ab c de
样例输出
abcde
4
/*p11_5.c*/ #include <stdio.h> #include <string.h> int main() { int strdel (char *s); char a[81],*q; int i,sum=0; gets(a); for(i=0;a[i]!='\0';i++) { if(a[i]==' ') sum++; } q=strdel(a); printf("%s\n",q); printf("%d\n",sum); } int strdel(char *s) { int i=0,j=0; for(;i<strlen(s);i++) {if(s[i]!=' ') { s[j++]=s[i]; } } s[j]='\0'; return s; } |
6、编写程序,对一组英文单词字符串进行按字典排序方式(从小到大)进行排序。请设计一个排序函数void sort(char *words [], int n),可以对words中的n个字符串进行排序。
主函数已经给出如下:
#include<stdio.h>
#include<string.h>
void sort(char *words[], int n);
void main()
{
char *wString[]={"implementation","language","design","fortran","computer "};
int i, n=5;
printf("The words are :\n");
for (i=0; i<n; i++)
printf ("\twString[%d]=%s\n",i, wString[i]);
printf("After sort,The wordsare:\n");
sort(wString,n); /* 调用函数,对指针数组wString中的n个字符串排序 */
for (i=0; i<n; i++)
printf ("\twString[%d]=%s\n",i, wString[i]);
}
void sort(char *words[], int n)
{
}
请完成void sort(char *words[], int n)函数的功能。
/*p11_6.c*/ void sort(char *words [], int n)
{ char *s; int i,j,t; for(i=0;i<4;i++) { t=1; for(j=i+1;j<5;j++) if(strcmp(words[t],words[j])>0) { t=j; } s=words[t]; words[t]=words[i]; words[i]=s; }
} |
总结(本次实验遇到的问题、解决方法,今后要注意的地方)
1 把=和==搞混了。
2 忘记;
3 把实参字符在函数定义中使用