我正在做一个代码,它告诉用户输入一个100到200之间的不确定数量的数字。程序告诉我唯一数字的数量,然后命令输入的数字。这是我的代码:
#include <stdio.h>
void sort(int *numbers, int count) {
for (int m = 0; m < count; m++) {
for (int j = 0; j < count - m - 1; j++) {
if (numbers[j] > numbers[j + 1]) {
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
}
void printA(int *numbers, int count) {
for (int i = 0; i < count; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
}
int main() {
int numbers[101] = {0}; // using an array to keep track of numbers between 100 and 200
int input, count = 0;
printf("Enter numbers between 100 and 200 (enter a number outside this range to finish):\n");
while (1) {
scanf("%d", &input);
if (input < 100 || input > 200) {
break;
}
if (numbers[input - 100] == 0) {
count++;
numbers[input - 100] = input;
}
}
printf("\nTotal unique numbers entered: %d\n", count);
sort(numbers, count);
printA(numbers, count);
return 0;
}
字符串
程序告诉我正确输入的唯一数字的数量,但无法排序。有人能告诉我我做错了什么吗?
2条答案
按热度按时间hec6srdp1#
OP代码中最重要的问题是
printA
和sort
是用count
作为参数调用的,然后将其用作函数内部的数组大小。然而,count
计数的是输入的数字数量,而不是numbers
数组的大小。numbers
数组保存所有按数字顺序输入的唯一数字,因此无需排序,只需排除0条目(对应于范围内未输入的数字)。最后,应该检查
scanf()
的返回代码,以验证实际上接收到了新的数字。总而言之,代码可以调整如下:
字符串
3zwtqj6y2#
为了很好地说明原始代码的难点,我创建了代码的修改版本:
请注意,this code是您的代码。它只在几个小方面进行了轻微修改:1.)
SIZE_ARRAY
定义为100; 2.)我们通过将SIZE_ARRAY
发送到打印例程来打印整个数组。这将显示所有空(零)数组插槽。3.)GetRandom(100, 200)
用于模拟用户输入--一个非常方便的测试惯例。请注意before和after打印输出。数组中到处都是零:数组数据是不连续的。此外,因为
count
(20)被发送到sort()
,所以只有前20个数组索引可以排序。如果你在链接处运行代码,你会看到一些索引被排序,但只有前20个。现在,请看this code--它是相同的代码,只有一个小的变化:
SIZE_ARRAY
被赋予sort()
,所以sort()
现在可以对整个数组进行排序。以下只是众多可能解决方案中的一个。它调整了数字的存储方式:它们现在是连续存储的(没有间隙),并且
sort()
-当给定变量count
时-将能够对 * 所有 * 数据进行排序。通过变量count
,还在main()
中的循环中添加了缓冲区溢出保护:字符串