C语言:输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个对换,要求用三个函数来写
我写的代码哪错了,一运行无响应
# include <stdio.h>
int main ()
{
void input (int * p);
void paixu (int * p);
void print (int * p);
int a[10];
input (a);
paixu (a);
print (a);
return 0;
}
void input (int * p)
{
while (p < p + 10)
{
scanf("%d",*p++);
}
}
void paixu (int * p)
{
int * i = p;
int max = *p,min = *p,q = 0;
for (;p < p + 10;p++)
{
if (*i > *p)
max = *i;
else
{
max = *p;
q = 1;
}
if (q == 1)
min = *i;
else
min = *p;
}
*p = min;
* (p + 9) = max;
}
void print (int * p)
{
while (p < p + 10)
{
printf("%d",*p++);
}
} 展开
#include<iostream>
using namespace std;
void enter(int*m)
{
for(int i=0;i<10;i++)
cin>>m<i>;
}
void key(int*m)
{
int max=m[0],min=m[0],n=0,k=0,z;
for(int i=1;i<10;i++)
{
if(max<m<i>)
{
max=m<i>;
n=i;
}
}
for(int i=1;i<10;i++)
{
if(min>m<i>)
{
min=m<i>;
k=i;
}
}
if(n==0&&k==9)
{
z=m[0];m[0]=m[9];m[9]=z;
}
else if(n==0&&k!=9)
{
z=m[9];m[9]=m[n];m[n]=z;
z=m[0];m[0]=m[k];m[k]=z;
}
else
{
z=m[0];m[0]=m[k];m[k]=z;
z=m[9];m[9]=m[n];m[n]=z;
}
}
void print(int*m)
{
for(int i=0;i<10;i++)
cout<<m<i><<'';
}
int main()
{
int ans[10];
enter(ans);
key(ans);
print(ans);
return 0;
}
扩展资料:
include用法:
#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。
插入头文件的内容
#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:
1、#include<文件名>
2、#include"文件名"
#include <stdio.h>
//-------------------------------------
int * max_proc(int *p)
{
int i;
int *m;
m = p;
for (i = 1; i < 10; i++)
if (*m < *(p + i)) m = (p + i);
return m;
}
//-------------------------------------
int * min_proc(int *p)
{
int i;
int *m;
m = p;
for (i = 1; i < 10; i++)
if (*m > *(p + i)) m = (p + i);
return m;
}
//-------------------------------------
void change(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
}
//-------------------------------------
int main()
{
int aa[10] = {0};
int i;
int *max, *min;
for (i = 0; i < 10; i++) scanf("%d", &aa[i]);
printf("\n");
printf("befor:\n");
for (i = 0; i < 10; i++) printf("%d ", aa[i]);
printf("\n");
max = max_proc(aa);
min = min_proc(aa);
change(max, min);
printf("after:\n");
for (i = 0; i < 10; i++) printf("%d ", aa[i]);
printf("\n");
// printf("max = %d, min = %d\n", *max, *min);
return 0;
}
//-------------------------------------
以上是把最大、最小,两个数,掉换位置。
----------------------
下面的,符合题目要求:
//输入10个整数,将其中最小的数与第一个数对换,
//把最大的数与最后一个对换,要求用三个函数来写
#include <stdio.h>
//-------------------------------------
int max_proc(int *p)
{
int i;
int m, n;
m = *p;
n = 0;
for (i = 1; i < 10; i++)
if (m < *(p + i)) {m = *(p + i); n = i;}
return n;
}
//-------------------------------------
int min_proc(int *p)
{
int i;
int m, n;
m = *p;
n = 0;
for (i = 1; i < 10; i++)
if (m > *(p + i)) {m = *(p + i); n = i;}
return n;
}
//-------------------------------------
void change(int p, int q, int *x)
{
int temp;
temp = *(x + 0); *(x + 0) = *(x + q); *(x + q) = temp;
temp = *(x + 9); *(x + 9) = *(x + p); *(x + p) = temp;
}
//-------------------------------------
int main()
{
int aa[10] = {0};
int i;
int max, min;
for (i = 0; i < 10; i++) scanf("%d", &aa[i]);
printf("\n");
printf("befor:\n");
for (i = 0; i < 10; i++) printf("%d ", aa[i]);
printf("\n");
max = max_proc(aa);
min = min_proc(aa);
change(max, min, aa);
printf("after:\n");
for (i = 0; i < 10; i++) printf("%d ", aa[i]);
printf("\n");
// printf("max = %d, min = %d\n", *max, *min);
return 0;
}
//-------------------------------------
2015-07-24
# include <stdio.h>
void input (int * p);
void paixu (int * p);
void print (int * p);
int main ()
{
int a[10];
input (a);
paixu (a);
print (a);
return 0;
}
void input (int * p)
{
int *q = p;
while (p < q + 10)
{
scanf("%d",p++);
}
}
void paixu (int * p)
{
int *q = p;
int *max = p,*min = p,tmp;
for (;p < q + 10;p++)
{
if (*max < *p)
max = p;
if (*min > *p)
min = p;
}
tmp = *q;
*q = *min;
*min = tmp;
if(max == q)//如果max的位置正好是第一个元素的地址,这是已经被改变了,所以要改成新地址。
{
max = min;
}
q+=9;
tmp = *q;
*q = *max;
*max = tmp;
}
void print (int * p)
{
int *q = p;
while (p < q + 10)
{
printf("%d ",*p++);
}
}
关于你那死循环的问题,你可以这样理解,p <p+10;首先你得承认你的p一直在做自增操作是吧,那么p+10也一定在不断变化,而中间的差值正好是10,所以是死循环。
我们暂且看出常量来做,a<a+10 ,a初值为1,你本来的意思是想a<11(a=1)来结束,但是你a在自增,所那个判断条件会变成a<12(a=2),a<13(a=3)等等。
下面是按照你题目意思来做的。三个函数分别是输入,最小与第一个交换,最大与最后一个交换。
#include <stdio.h>
void input (int * p);
void swapmin (int * p);
void swapmax (int * p);
int main ()
{
int i;
int a[10] ;
input (a);
swapmin(a);
swapmax (a);
for(i = 0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
void input (int * p)
{
int i;
printf("请输入十个数\n");
for(i=0;i<10;i++)
{
printf("%d:",i);
scanf("%d",p++);
}
}
void swapmin(int * p)
{
int *q = p;
int *min = p,tmp;
for (;q < p + 10;q++)
{
if (*min > *q)
min = q;
}
tmp = *p;
*p = *min;
*min = tmp;
}
void swapmax (int * p)
{
int *q = p;
int *max = p,tmp;
for (;q < p + 10;q++)
{
if (*max < *q)
max = q;
}
q = p+9;
tmp = *q;
*q = *max;
*max = tmp;
}
while (p < q + 10)
{
scanf("%d",p++);
不应该是scanf("%d",*p++);吗
p是首地址 p+10是首地址后的第10个整形位置 这个关系是永远不会变的所以循环不会结束
看了你全部的代码感觉你对指针的理解还很不够, 如果想完成功能建议你把参数换为数组
完成以后再慢慢研究指针。
还有我感觉,只是个人感觉你对题的理解有误。
题所说用三个函数应该是 让你编写 取最小值 ,最大值, 交换位置的三个函数 。(这里只是我个人的理解)
while (p < p + 10)
{
scanf("%d",*p++);
}
不是p++了吗?为什么不会结束,
*p++就是先取出指针p指向的地址单元的数据,之后再将该值加1。
由于运算符 * 的优先级高于运算符 ++,所以是先取指针p指向的地址单元的数据。
若果是*(p++),那么就是先将地址加1,之后取出新地址中的数据
就算如你所说p++了 那p+10中的p难道就没变吗?
举个例子吧 不说指针 换成变量a
a < a+10; a++ ;之后呢 a+10还是要比a大10对吗?
5
4
3
2
1
0
9
8
7
6
0
4
3
2
1
5
6
8
7
9
press
any
key
to
continue
#include"stdio.h"
void
input(int
number[10]);
//此函数向首地址为number的数组输入10个元素
void
max_min_value(int
array[10]);
//此函数交换array数组的对应元素
void
output(int
array[10]);
//此函数输出array数组的10个元素
void
input(int
number[10])
{
int
i;
printf("请输入十个元素:\n");
for
(i=0;i<10;i++)
{
scanf("%d",&number[i]);
}
}
void
max_min_value(int
array[10])
{
int
i,imin,imax,tmp,bg,sm;
imin
=
imax
=
array[0];
for
(i=0;i<10;i++)
{
if
(imax
array[i])
{
imin
=
array[i];
sm
=
i;
}
}
//最小换第一个
tmp=array[0];
array[0]=array[sm];
array[sm]=tmp;
//最大换第十个
tmp=array[9];
array[9]=array[bg];
array[bg]=tmp;
}
void
output(int
array[10])
{
int
i;
for
(i=0;i<10;i++)
{
printf("%d
",array[i]);
}
printf("\n");
}
main()
{
int
number[10];
input(number);
max_min_value(number);
output(number);
return
0;
}