我很难弄清楚这个代码。除了main()
外,我还需要四个函数:读取数组元素,打印数组元素,对数组进行排序以及交换数组的两个元素。
我不能使用任何结构化代码(例如,没有goto
,break
,continue
等语句。
我还需要能够通过输入比声明的数组大小(即10)更多的值来运行程序,显示错误消息,然后对输入的前10个值进行排序。我需要能够运行该程序并输入一个字符并显示错误消息,然后刷新坏数据并继续读取直到文件末尾或数组已满。
#include <stdio.h>
#define MAXSIZE 10 //max number of elements is 10
int main()
{
void print(const int arr[],int size);
void sort(int arr[],int size);
int getArray(int arr[],int max);
int arr[MAXSIZE]; //array
int size=getArray(arr,MAXSIZE); //size of array
printf("The array is:\n");
print(arr,size);
sort(arr,size);
printf("The sorted array is:\n");
print(arr,size);
}
void swap(int arr[],int i,int j) //swap function
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void print(const int arr[],int size) //print function
{
int i;
for (i = 0; i < size; i++)
printf ("%d ",arr[i]);
printf("\n");
}
void sort(int arr[],int size) //sort funtion
{
void swap(int arr[], int i, int j);
int min, min_index, i, j;
for( i = 0; i <= size - 2; i++)
{
min = arr[i];
min_index = i;
for(j = i + 1; j < size; j++)
{
if (arr[j] < min)
{
min = arr[j];
min_index = j;
}
}
swap(arr, i, min_index);
}
}
int getArray(int arr[],int max)
{
int temp = 0;
int count = 0;
char c;
printf ("Enter numbers with spaces between them\n");
scanf ("%i", &temp);
while ((c = scanf ("%i", &temp)) != EOF || count < max)
{
if(c == 0){
printf ("Invalid character. Please enter the numbers again.\n");
while (getchar() != '\n');
} else {
arr[count] = temp;
count++;
}
if (c == 1)
{
printf ("Too many values\n");
return count;
}
}
return count;
}
输出不是我想要的。这是我运行它时得到的。
Enter numbers with spaces between them
5 4 3 2 1
Too many values
The array is:
4
The sorted array is:
4
我需要程序正确地吸收所有元素,并且如果用户仅输入5个元素,则不会抛出“太多值”。
仅当数组超过10(MAXSIZE
)个元素时,才应打印“太多值”。截至目前,它仅采用数组的第一个或第二个元素。
答案 0 :(得分:0)
这听起来像是您想自己做的一项任务,但是您要问的问题是您的getArray()
函数。当它显示有关太多元素的错误消息时,它会检查错误的值,该值与读入的元素数量无关。您还告诉它继续尝试读取未遇到EOF
或的或者元素的最大数量,并且您应该查看scanf()
实际返回的内容;您可能打算检查feof(stdin)
。除其他错误外,该函数还通过覆盖它抛弃了它读取的第一个值。
您似乎想做的是:保留读取的元素数量的计数,在此元素小于最大值且剩余有效输入的情况下,读取元素。将输入存储在数组中;增加计数。您检查的输入是否过多应该是计数最大且feof(stdin)
为假,并且应该在while循环之后,而不是在体内。