问题一:输入十个数,将其中最小的数与第一个数对换,把最大的一个数与最后一个对换。写三个函数
1>输入十个数;2>进行处理;3>输出十个数。所有函数均用指针;
代码如下:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void input(int a[]);
void process(int a[]);
void output(int a[]);
int main(int argc, char *argv[]) {
/*问题:输入十个数,将其中最小的数与第一个数对换,把最大的一个数与最后一个对换。写三个函数
1>输入十个数;2>进行处理;3>输出十个数。所有函数均用指针; */
int a[10];
input(a);
process(a);
output(a);
return 0;
}
void input(int a[]){ //输入函数
printf("请输入十个数:");
int *p;
int i;
p=a;
for(i=0;i<10;i++){
scanf("%d",&(*(p+i)));
}
}
//处理函数有一点问题:实现了第一个数是最小,最后一个数是最大,但是其余的数列顺序发生了改变,所以该函数不够严谨;
//void process(int a[]){ //处理函数
// int *p,*q;
// int n,m;
// p=a;
// q=a;
// int i,j;
// for(i=1;i<10;i++){
// if(*(p+i)<a[0]){
// m=a[0];
// a[0]=*(p+i);
// *(p+i)=m;
// }
// }
//
// for(j=0;j<9;j++){
// if(*(q+j)>a[9]){
// n=a[9];
// a[9]=*(q+j);
// *(q+j)=n;
// }
// }
//}
//必须先寻找出最大数,然后寻找出最小数,然后进行交换,不能频繁交换数据;
void process(int a[]){ //处理函数
int *p,*q;
int n,m;
p=a;
q=a;
int i;
int v,w;
v=0;
w=0;
int sum,sam;
sum=a[0];
sam=a[0];
for(i=0;i<10;i++){ //寻找出最大值
if(a[i]<sum){
sum=a[i];
}else if(a[i]>sam){
sam=a[i];
}
}
while(*p!=sum){
p++;
v++;
}
m=a[0];
a[0]=a[v];
a[v]=m;
while(*q!=sam){
q++;
w++;
}
n=a[9];
a[9]=a[w];
a[w]=n;
printf("输出最大值:%d\n",sam);
printf("输出最小值:%d\n",sum);
}
void output(int a[]){ //输出函数
printf("输出处理后的函数:");
int *p;
int i;
p=a;
for(i=0;i<10;i++){
printf("%d ",*(p+i));
}
}
问题二:
三个整数及整数指针,仅用指针的方法实现由小到大的顺序输出;
拓展:输入n个数,用指针和数组的方法分别实现排序;
实验代码:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void swap(int *,int *);
void putout(int a[], int n);
int main(int argc, char *argv[]) {
//定义三个整数及整数指针,仅用指针的方法实现由小到大的顺序输出;
//拓展:输入n个数,用指针和数组的方法分别实现排序;
int n;
printf("请输入整数的个数:");
scanf("%d",&n);
int a[n];
int i;
printf("依次输入整数:");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
//方法一:数组方法
// int j=0,k;
// for(;j<n-1;j++){
// for(k=j+1;k<n;k++){
// if(a[j]>a[k]){
// int s;
// s=a[j];
// a[j]=a[k];
// a[k]=s;
// }
// }
// }
//方法二:指针方法;
int *p,*q,*s,*k;
s=&a[n-1];
k=a;
int j;
for(j=0;j<n-1;j++){
p=&a[j];
q=&a[j];
while(q!=s){
if(*p>*q){
swap(p,q);
}
q++;
}
}
for(j=0;j<n;j++){
if(*(k+j)>*s){
swap((k+j),s);
}
}
putout(a,n);
return 0;
}
void swap(int *p,int *q){ //交换数据函数;
int m;
m=*p;
*p=*q;
*q=m;
}
void putout(int a[],int n){ //输出函数;
int i;
printf("输出排序后的数组:");
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
}
运行结果:
问题三:写一个求字符串的函数(参数用指针),在主函数中输入字符串,并输出其长度;
实验代码:
#include <stdio.h>
#include <stdlib.h>
#define max 1000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void length(char*p,char a[]);
int main(int argc, char *argv[]) {
//编写一个求字符串的函数(参数用指针),在主函数中输入字符串,并输出其长度;
char a[max];
printf("输入字符串:");
scanf("%s",a);
char *p;
p=a;
length(p,a);
return 0;
}
void length(char*p,char a[]){
int m=0;
p=a;
while(a[m]!='\0'){
m++;
}
printf("输出字符串的长度:%d",m);
}
运行结果:
问题四:利用指向行的指针变量求5*3数组各行元素之和;
由题可知为二维数组;行指针为一位数组名;
运行代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
/*利用指向行的指针变量求5*3数组各行元素之和;
由题可知为二维数组;行指针为一位数组名;
*/
int a[5][3];
int i;
int *q;
q=&a[0][0];
printf("任意为数组填充15个元素:");
printf("\n");
for(i=0;i<15;i++){
scanf("%d",&*(q+i));
}
int sum[5]={0,0,0,0,0};
int j,k;
for(j=0;j<5;j++){
for(k=0;k<3;k++){
sum[j]+=*(a[j]+k);
}
}
int m;
for(m=0;m<5;m++){
printf("第%d行元素的和:%d\n",m+1,sum[m]);
}
return 0;
}
运行结果: