首先一条比较简单的问题:
输入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移到数组的末端,算法结束。