首先一条比较简单的问题:
输入10个整数,将其中最小的数字与第一个数字对换,把最大的数与最后一个数对换。
编写3个函数:(1)输入10个数字(2)进行处理(3)输出10个数字
思想如下图,使用一个长度为11的数组的第1~10位置存储这10个数,这样既符合人的思维又利用a[0]作为数据交换时候的临时存储空间,
代码如下,实现起来非常简单,主要是注意,C语言的指针是如何操作的,包括声明、处理等。
#include<stdio.h> void input(int a[]){ for(int i=1;i<11;i++){ printf("a[%d]=",i); scanf("%d",a+i);//因为&*(a+i),所以这里原本有的,求位置与地址的&,被求地址所值的内容*所抵消了 } } void process(int a[]){ int *p,*t;//用于实现交换操作的指针 //求出数组中的最大值、最小值 //这里绝不存在min=*a这样的表达 //因为数组的头指针是一个死指针,严禁对其进行任何操作 //但p=a+i是可以的,因为p只是一个指向该数组的指针 int max=a[1],min=a[1]; p=a+1; t=a+1;//p,t必须被初始化,否则如果最小的数在数组的开头,会出现空指针报错 for(int i=2;i<11;i++){ if(max<*(a+i)){ max=*(a+i); p=a+i;//直接把指针插在a的最大值处 } if(min>*(a+i)){ min=*(a+i); t=a+i; } } //交换1,利用a[0]用作处理空间。 a[0]=*p; *p=a[10]; a[10]=a[0]; //交换2 a[0]=*t; *t=a[1]; a[1]=a[0]; } void output(int a[]){ for(int i=1;i<11;i++){ printf("%d,",*(a+i)); } printf("\n"); } void main(){ int a[11]; printf("请输入一个数组:\n"); input(a); printf("数组为:\n"); output(a); process(a); printf("处理之后的数组为:\n"); output(a); }
之后是一条提高了难度的经典题目,但是也不是很难:
有n个整数,使其前面各数顺序向后移m个位置,即把最后m个数变成最前面m个数,如图所示:
代码实现如下:
#include<stdio.h> void input(int a[],int n){ for(int i=1;i<n+1;i++){ printf("a[%d]=",i); scanf("%d",a+i);//因为&*(a+i),所以这里原本有的,求位置与地址的&,被求地址所值的内容*所抵消了 } } void process(int a[],int n,int m){ int *p=a+1; for(int i=1;i<n+1-m;i++){ p++;//将指针移到需要操作的位置 } for(int i=1;p<a+n+1;i++,p++){ a[0]=*p; *p=*(a+i); *(a+i)=a[0]; } } void output(int a[],int n){ for(int i=1;i<n+1;i++){ printf("%d,",*(a+i)); } printf("\n"); } void main(){ int a[255]; int n,m; printf("你想输入的数字的数量n="); scanf("%d",&n); printf("请输入一个数组:\n"); input(a,n); printf("数组为:\n"); output(a,n); printf("要把最后的几个数移到最前?m="); scanf("%d",&m); process(a,n,m); printf("处理之后的数组为:\n"); output(a,n); }
在输入、输出部分与上面的题目,完全相同,都是数组的简单处理。
在处理部分也不难,把指针p移到要操作的位置,
再也把迭代的i移回数组头,接下去i与指针p同步移动,每一次移动,把数组交换一次,直到p移到数组的末端,算法结束。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/yongh701/article/details/47322251