实验十三 善于利用指针(1)
一、实验目的和要求:
- 掌握有关指针的概念,会定义和使用指针变量。
- 掌握指针和函数的关系:指针作为函数的参数、函数返回指针值、指向函数的指针。
- 掌握指针和数组的关系:通过指针引用数组元素、指针数组和带参main函数等。
- 掌握字符串的指针和指向字符串的指针变量。
二、实验内容:
- 用指针实现:输入三个整数,按有小到大的顺序输出。
- 用指针实现:输入10个整数,将其中最小者与第一个数对换,最大者与最后一个数对换。
- 用指针实现:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前m个数。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
- 有n个人围成一圈,顺序排号。从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位.
三、实验步骤与结果
1. 用指针实现:输入三个整数,按有小到大的顺序输出
(1)设计思路
(2)程序源码(加注释)
|
#include <stdio.h> // 输入3个正整数,按由大到小的顺序输出,要求使用指针实现。
int main() { int num1, num2, num3; printf("输入三个整数:\n"); scanf("%d%d%d", &num1, &num2, &num3); // printf("%d,%d,%d\n", num1, num2, num3); int *p1, *p2, *p3, temp; p1 = &num1; p2 = &num2; p3 = &num3; if (*p1 < *p2) { temp = *p1; *p1 = *p2; *p2 = temp; }
if (*p2 < *p3) { temp = *p2; *p2 = *p3; *p3 = temp; }
if (*p1 < *p2) { temp = *p1; *p1 = *p2; *p2 = temp; } printf("大到小:%d,%d,%d\n", num1, num2, num3); return 0; } |
(3)运行结果与分析
2. 用指针实现:输入10个整数,将其中最小者与第一个数对换,最大者与最后一个数对换
(1)设计思路
(2)程序源码(加注释)
|
#include <stdio.h> void input(int *s, int n); //定义输入函数 void sort(int *s, int n); //定义排序函数 void print(int *s, int n); //定义输出函数 int main() { int n[10], *p=n; input(p, 10); //调用输入函数 sort(p, 10); //调用排序函数 print(p, 10); //调用输出函数 return 0; } //输入函数 void input(int *s, int n) { int *m; for (m=s, printf("请输入十个数字: "); m<s+n; scanf("%d", m++)); } //排序函数 void sort(int *s, int n) { int *i, *j, *min, *max, t; for (i=s, min=i; i<s+n; i++) for (j=i+1; j<s+n; *min>*j ? min=j++ : j++); t=*min, *min=*s, *s=t; for (i=s+1, max=i; i<s+n; i++) for (j=i+1; j<s+n; *max<*j ? max=j++ : j++); t=*max, *max=*(s+n-1), *(s+n-1)=t; } //输出函数 void print(int *s, int n) { int *i; for (i=s, printf("排序后的数字为: "); i<s+n; printf("%d ", *i++)); printf("\n"); } |
(3)运行结果与分析
3. 用指针实现:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前m个数。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数
(1)设计思路
(2)程序源码(加注释)
|
#include <stdio.h> int main() { void move(int [20],int,int); int number[20],n,m,i; printf("输入几个数?"); scanf("%d",&n); printf("请输入 %d 个数字:\n",n); for(i=0;i<n;i++) scanf("%d",&number[i]); printf("你想要移动哪个位置的数字?"); scanf("%d",&m); move(number,n,m); printf("现在它们的顺序是:\n"); for(i=0;i<n;i++) printf("%d ",number[i]); printf("\n"); return 0; }
void move(int array[20],int n,int m) { int *p,array_end; array_end=*(array+n-1); for(p=array+n-1;p>array;p--) *p=*(p-1); *array=array_end; m--; if(m>0) move(array,n,m); } |
(3)运行结果与分析
4. 有n个人围成一圈,顺序排号。从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
(1)设计思路
(2)程序源码(加注释)
|
#include<stdio.h> void pick(int *p,int n) { int i,sum,cnt=0; for(i=0;i<n;i++) *(p+i)=1; i=0; sum=n; while(sum>1) { if(*(p+i)==1) { cnt++; if(cnt%3==0) { *(p+i)=0; cnt=0; sum--; } } i++; i=i%n;//转完一圈后重新开始 } for(i=0;i<n;i++) if(*(p+i)==1) printf("最后还有%d:",i+1); } int main() { int n,a[100]; int *p=a; printf("开始一共多少人:\n"); scanf("%d",&n); pick(p,n); return 0; } |
(3)运行结果与分析
四、实验总结与心得
总结:
前面的构建好思路,整个程序框架能更快解题;
学习的时候一定要自己理解,巧妙记忆;
不断利用基础的结构设计;
利用自己知道的题型逐步设计程序;
审题是关键,对题意理解了,借助自己所学的知识,进行合理设计,然后整理程序。
心得:
自己一定要记住一些模型,才能更快的编辑程序。