实验内容: 1.运行程序 #include <stdio.h> void main() { int a=10,*p; p=&a; printf("%d",*p); scanf("%d",p); printf("%x",p); printf("%x",&p); *p=5; printf("%d",a); (*p)++; printf("%d",a); } 要求:
(2)输入并调试上述源程序。 |
(3)运行程序,将分析结果和实际结果对照比。若不同,找出原因。 (4)说明p和a的关系。 2.运行程序 程序的作用是将输入的两个整数按从大到小的顺序输出。 #include <stdio.h> void main() { int i1,i2,*p1,*p2,t; p1=&i1; p2=&i2; printf("Enter two numbers:\n"); scanf("%d%d",p1,p2); if(i1<i2) {t=*p1;*p1=*p2;*p2=t;} printf("i1=%d,i2=%d\n",i1,i2); } 要求: (1)写出并分析程序的运行结果。 (2)输入调试上述淅程序,并进行编译、连接、运行。 (3)若将变量定义改为: int i1,i2,*p1,*p2,*p; 交换i1、i2值的语句改为: if(i1<i2) {p=p1;p1=p2;p2=p;} 结果将会怎样?为什么? (4)若将第二条输出语句改为: printf("Max=%d,Min=%d\n",*p1,*p2); 结果将会怎样?为什么? 3. 程序改错 程序中的函数fun的功能是:先将在字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面。例如,当s上的字符串为ABCDE时,则t中的字符串应为ABCDEEDCBA。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 #include <stdio.h> #include <conio.h> #include <string.h> |
void main() { int i,s1; s1=strlen(s); for(i=0;i<=s1;i++) t[i]=s[i]; for(i=0;i<=s1;i++) t[s1+i]=s[s1-i-1]; t[s1]='\0'; } void main() { char s[100],t[100]; clrscr(); printf("\nPlease enter string s:"); scanf("%s",s); fun(s,t); printf("The result is :%s\n",t); } 要求: (1)分析改正源程序中的错误。 (2)对源程序进行编译、连接、运行。 (3)写出程序运行的正确结果。 4.程序填空 本程序从字符串str中截取从第m个字符开始的n个字符,然后输出。 #include <stdio.h> void main() { static char str[]="goodmorning"; char *p,*cut(char *s,int m,int n); p=cut(str,3,4); puts(p); } char *(char *s,int m,int n) |
{ int i; static char sub[10]; for(i=0;i<n;i++) sub[i]=1 *(s + m + i - 1); sub[i]=2 '\0'; return 3 sub; } 要求: (1)输入并完善源程序。 (2)对源程序进行编译、连接、运行。 (3)写出程序运行的结果。 5.利用指针编写程序 编写一个函数,求1~m之间(含m)能被7或11整除的所有整数并放在数组a中,在main函数中输出这些数和这些数的个数。 例如:若m的值为50,则程序输出: 7 11 14 21 22 28 33 35 42 44 49 总数:11 程序:#include <stdio.h> #define m 50//个数 bool hanser(int* p1) { bool f = false; if (*p1 % 7 == 0 || *p1 % 11 == 0) f = true; return f; } void main() { int a[m], i; bool f; int* p = a, t = 0;//t为总数 for (i = 0; i < m; i++) { *(p + i) = i + 1; printf("%5d", *(p + i)); if ((i + 1) % 5 == 0) printf("\n"); |
} printf("能被7或11整除的所有整数有: \n"); p = a; for (i = 0; i < m; i++) { f = hanser(p); if (f) { t++; printf("%5d", *p); } p++; } printf("\n"); printf("t=%d", t); } 6.利用指针编写程序 编写一个函数,将main函数输入的3×3矩阵转置,在main函数中输出转置的结果。 程序:void main() { int a[3][3], i, j, t; printf("输入矩阵\n"); for (i = 0; i < 3; i++) scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]); for (i = 0; i < 3; i++) for (j = i; j < 3; j++) { t = *(*(a + i) + j);//数组a[i][j]= a[j][i]; *(*(a + i) + j) = *(*(a + j) + i); *(*(a + j) + i) = t; } printf("转置后\n"); for (i = 0; i < 3; i++) printf("%d %d %d\n", a[i][0], a[i][1], a[i][2]); } 7.利用指针编写程序 有n个学生围成一圈,按顺序排号。从第1个人开始报数,凡报到3的人退出圈子,问最后留下的是原来第几号的学生。 |
要求及提示: (1)n的值输入,输出最后留下的学生的顺序号 (2)用数组来存储n个学生。 (3)解题思路提示 step1:先利用数组开辟足够大的一个存储空间,指针P指向数组; step2:输入n值,为这n个人编号; step3:定义3个循环时所需计数变量 每次循环时的计数变量i,目的是控制指针是否指向了最后一个人,如果指向了最后一个人,则要使指向重新指向第一个人; 控制报数的变量k,目的是:按1、2、3报数时的计数变量。k为3时,将此人的编号设置为0,k重新计数;标识退出人数的变量m.目的是:记录已退出多少人,为循环结束做准备。 step4:循环继续条件:n-m>1。 程序:int main() { system("color f3"); int i, k, m, n, num[50], * p; printf("input the number of n:"); scanf("%d", &n); p = num; for (i = 0; i < n; i++) *(p + i) = i + 1; i = 0; k = 0; m = 0; while (m < n - 1) { if (*(p + i) != 0) k++; if (k == 3) { *(p + i) = 0; k = 0; m++; } i++; if (i == n) i = 0; }
while (*p == 0) p++; |
printf("%d", *p); return 0; } 8.利用指针编写程序 编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。 要求: 在主函数中输入字符串及m的值,并输出复制结果。在被调用函数中完成复制。 程序:#include<stdio.h> int main() { void copy(int m, char* a, char* b); char a[] = "i am a studant", b[30]; int m; printf("输入m:"); scanf("%d", &m); printf("输入字符串:"); scanf("%s", b); copy(m, a, b); printf("%s", a); } void copy(int m, char* a, char* b) { int i, j; for (i = m - 1, j = 0; b[j] != 0; i++, j++) { a[i] = b[j]; } a[i] = 0; } 9.利用指针编写程序 设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按逆序重新排列并输出新的完整数列。 例如:原数列为2,4,6,8,10,12,14,16,18,20。若要求把从第4个数开始的5个数按 逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20 要求: 进行逆序处理时使用指针方法。 程序:#define N 10 void order(int* pa, int m1, int n1) |
{ int temp, * pm1, * pend, * pminddle; pm1 = pa + m1 - 1; pend = pa + m1 + n1 - 2; pminddle = pa + m1 - 1 + n1 / 2; for (; pm1 < pminddle; pm1++, pend--) { temp = *pm1; *pm1 = *pend; *pend = temp; } } int main() { int a[N]; int m, n, i; printf("输入一个已排好序的数:"); for (i = 0; i < N; i++) scanf("%3d", &a[i]); printf("输入指定位置m:"); scanf("%d", &m); printf("输入重新排的个数n:"); scanf("%d", &n); printf("输出原序的:"); for (i = 0; i < N; i++) printf("%4d", a[i]); printf("输出重排序的:"); order(a, m, n); for (i = 0; i < N; i++) printf("%4d", a[i]); return 0; } 10.利用指针编写程序 编写具有如下原型的函数: void chgStr(char *ip,char *op) 负责将ip所指向输入字符串中的各字符按照指定规则进行变换后,存放到由op指向的输出串中。即从头到尾逐字符地对ip所指向的字符串进行如下处理: (1)若ip所指当前字符为字母,则将其改变大小写后存放到结果字符串op中。 |
(2)若ip所指当前字符是一个数字字符,则将其变换为另一个数字字符后存放到结果字符串op中:字符0变换为字符9,字符1变换为字符8,字符2变换为字符7,依此类推,字符9变换为0。 (3)若ip所指当前字符为其它字符,则将该字符复制到结果字符串op中。 例如:若调用时通过ip带来的字符串为“Nankai 1918-2004,x+y-5*6/37=?OK!”,则结果字符串op应为“nANKAI8081-7995,X+Y-4*3/62=?ok!”。 最后编写主函数,对chgStr()进行调用,以验证其正确性。 程序:void chgStr(char* ip, char* op) { int i; for (i = 0; *(ip + i)!= '\0'; ++i) { if (*(ip + i) >= 65 && *(ip + i) < 65 + 26) { *(op + i) = *(ip + i) + 32; } else if (*(ip + i) >= 97 && *(ip + i) <= 97 + 26) { *(op + i) = *(ip + i) - 32; } else if (*(ip + i) >= 48 && *(ip + i) <= 57) { *(op + i) = 48 + 57 - *(ip + i); } else { *(op + i) = *(ip + i); } } op[i] = '\0'; } int main() { char ip[30], op[30]; scanf("%s", ip); chgStr(ip, op); printf("%S", op); } |
程序测试及运行结果: 1. 2. 3. |
4. 5. 6. 7. 8.
|
9. 10. |
结果分析与讨论:
1.怎样正确使用数组的指针和指向数组的指针变量。
答:通过指针引用数组元素的基本方法 (1)下标法:a [i]。 (2)指针法:* (a+i) 或 * (p+i),其中a是数组名,p是指向数组元素的指针变量,其初值p=a。因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
数组指针的类型和数组元素的类型有关,p 指向的数组元素是 int 类型,所以 p 的类型必须也是int *
2.怎样正确使用字符型指针处理字符串问题?
答:将字符串地址赋予指针,然后用指针进行地址的交换或内容的交换,在使用字符指针时,要特别注意,是否后续会更改该字符串的值,若需要更改,不要使用char buf=“abcd”;