我想编写一个程序,从用户读取10个int
值并交换第一个和第二个值上的最大和最小数字,然后其余数字应该在顺序中。
请检查代码并帮我解决问题所在。
例如:
1
9
4
5
6
7
8
2
4
5
新订单应为9 1 4 5 6 7 8 2 4 5
#include <stdio.h>
int main() {
int a[10],i,min,max=0,pos=0;
printf("Please enter 10 int values :\n");
do{
scanf("%d", &a[pos++]);
} while (pos<10);
for (i=0; i<10;i++) {
printf("%i\n",a[i]);
if (max<a[i])
{
max=a[i];
}
if (min>a[i])
{
min=a[i];
}
for (i=0;i<10;i++) {
if (a[i]==max)
a[i]=max;
if (a[i] == min) a[i] = min;
}
printf("The new order is : %d %d %d ", max, min, ...);
return 0;
}
修改
It is the new form
#include <stdio.h>
int main() {
int a[10],i,pos,temp,min = 0,max = 0;
printf("Please enter 10 int values :\n");
do {
scanf("%d", &a[pos++]);
} while (pos < 10);
for ( =1; i<10;i++) {
if (a[i]>a[max])
{
max=i;
}
if (a[i]<a[min])
{
min=i;
}
}
temp=a[max];
a[max]=a[min];
a[min]=temp;
printf("%d %d",a[max],a[min]);
for (i=0;i<10;i++){
if ((i != min) && (i != max)) {
printf("%d ", a[i]);
}
}
printf("\n");
return 0;
}
答案 0 :(得分:1)
正如其他人所说,您的代码无法正确识别数组中的最大值和最小值,因为您正在将min
和max
写回数组而不是相反。
由于您要交换这些值,您实际需要的是数组的最小值和最大值的 indices ,并交换它们。
最好将此代码分解为函数,而不是将所有内容都包含在main中。这是一个可以满足您需求的解决方案:
#include <stdio.h>
int indexofmax(int *data, int len)
{
int max = 0;
int i;
for(i = 0; i < len; i++)
{
if(data[i]>data[max]) max = i;
}
return max;
}
int indexofmin(int *data, int len)
{
int min = 0;
int i;
for(i = 0; i < len; i++)
{
if(data[i]<data[min]) min = i;
}
return min;
}
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
// user enters in 10 ints...
int max = indexofmax(a, 10);
int min = indexofmin(a, 10);
int i;
swap(&a[min], &a[max]);
for(i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
答案 1 :(得分:0)
你实际上并没有改变阵列。
在第二个循环中,您说“如果当前元素是最大值,则将其设置为最大值”。换句话说,将其设置为当前值。同样适用于最小。
你想要的是交换那些作业。
if(a[i]==max) a[i]=min;
if(a[i]==min) a[i]=max;
此外,min
和max
的初始值并不好。 min
是单元化的,因此其初始值未定义。您应该将min
初始化为一个非常大的值,同样max
应该初始化为一个非常小的(即大的负数)值。
更好的方法是跟踪最大值和最小值的索引。这些您可以初始化为0.然后,您可以检查a[i] > a[max]
和a[i] < a[min]
。然后在索引min
和max
打印值,然后遍历列表并打印其他值。
int i, temp, min=0, max=0;
for (i=1; i<10; i++) {
if (a[i] > a[max]) max = i;
if (a[i] < a[min]) min = i;
}
printf("%d %d ", a[max], a[min]);
for (i=0; i<10; i++) {
if ((i != min) && (i != max)) {
printf("%d ", a[i]);
}
}
printf("\n");
答案 2 :(得分:0)
此初始化min=0,max=0
不正确。
取而代之的是min = INT_MAX
和max = INT_MIN
。
通过设置min=0
,如果数组大于0,则永远不会得到数组中的最小数字。
同样通过设置max=0
,如果数组低于0,则永远不会得到数组中的最大数字。
您正在通过此代码获得 nothing :
for(i=0;i<10;i++)
{ if(a[i]==max) a[i]=max;
if(a[i]==min) a[i]=min; }
答案 3 :(得分:0)
很明显,这个循环
for(i=0;i<10;i++)
{ if(a[i]==max) a[i]=max;
if(a[i]==min) a[i]=min; }
没有意义。
此外,变量min
未初始化,而变量max
未正确初始化。
int a[10],i,min,max=0,pos=0;
例如,数组可以包含所有负面元素。在这种情况下,您将得到不正确的最大值等于0。
我没有看到元素向右移动的位置,将最大值和最小值放在数组的前两个位置。
如果我理解正确,那么您需要的是以下内容。要移动元素,您可以使用标题memmove
中声明的标准函数<string.h>
。然而,似乎你正在学习循环。
#include <stdio.h>
#define N 10
int main( void )
{
int a[N] = { 4, 5, 9, 6, 7, 1, 8, 2, 4, 5 };
for (size_t i = 0; i < N; i++) printf("%d ", a[i]);
printf("\n");
size_t min = 0;
size_t max = 0;
for (size_t i = 1; i < N; i++)
{
if (a[max] < a[i])
{
max = i;
}
else if (a[i] < a[min])
{
min = i;
}
}
if (max != min)
{
int min_value = a[min];
int max_value = a[max];
size_t j = N;
for (size_t i = N; i != 0; --i)
{
if (i - 1 != min && i - 1 != max)
{
if (i != j)
{
a[j - 1] = a[i - 1];
}
--j;
}
}
a[--j] = min_value;
a[--j] = max_value;
}
for (size_t i = 0; i < N; i++) printf("%d ", a[i]);
printf("\n");
}
程序输出
4 5 9 6 7 1 8 2 4 5
9 1 4 5 6 7 8 2 4 5
答案 4 :(得分:0)
保持简洁,就像这样:
#include <stdio.h>
#include <stdlib.h>
#define MAXNUM 10
int find_biggest(int A[], size_t n);
int find_smallest(int A[], size_t n);
void print_array(int A[], size_t n);
void int_swap(int *a, int *b);
int
main(void) {
int array[MAXNUM], i, smallest, biggest;
printf("Please enter 10 int values:\n");
for (i = 0; i < MAXNUM; i++) {
if (scanf("%d", &array[i]) != 1) {
printf("invalid input\n");
exit(EXIT_FAILURE);
}
}
printf("Before: ");
print_array(array, MAXNUM);
smallest = find_smallest(array, MAXNUM);
biggest = find_biggest(array, MAXNUM);
int_swap(&array[smallest], &array[biggest]);
printf("After: ");
print_array(array, MAXNUM);
return 0;
}
int
find_biggest(int A[], size_t n) {
int biggest, i, idx_loc;
biggest = A[0];
idx_loc = 0;
for (i = 1; i < n; i++) {
if (A[i] > biggest) {
biggest = A[i];
idx_loc = i;
}
}
return idx_loc;
}
int
find_smallest(int A[], size_t n) {
int smallest, i, idx_loc;
smallest = A[0];
idx_loc = 0;
for (i = 1; i < n; i++) {
if (A[i] < smallest) {
smallest = A[i];
idx_loc = i;
}
}
return idx_loc;
}
void
print_array(int A[], size_t n) {
int i;
for (i = 0; i < n; i++) {
printf("%d ", A[i]);
}
printf("\n");
}
void
int_swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}