C语言 排序数字从100到200并告诉我输入的唯一数字的数量的代码有问题

nxagd54h  于 2023-11-16  发布在  其他
关注(0)|答案(2)|浏览(144)

我正在做一个代码,它告诉用户输入一个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;
}

字符串
程序告诉我正确输入的唯一数字的数量,但无法排序。有人能告诉我我做错了什么吗?

hec6srdp

hec6srdp1#

OP代码中最重要的问题是printAsort是用count作为参数调用的,然后将其用作函数内部的数组大小。然而,count计数的是输入的数字数量,而不是numbers数组的大小。
numbers数组保存所有按数字顺序输入的唯一数字,因此无需排序,只需排除0条目(对应于范围内未输入的数字)。
最后,应该检查scanf()的返回代码,以验证实际上接收到了新的数字。
总而言之,代码可以调整如下:

#include <stdio.h>

void printA(int *numbers, int size) {
    for (int i = 0; i < size; i++) {
        if(numbers[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) {
        if(scanf("%d", &input) != 1)
        {
            printf("Invalid input\n");
            scanf("%*[^\n]%*c");  // Remove invalid input from buffer
            continue;
        }
        if (input < 100 || input > 200) {
            break;
        }
        if (numbers[input - 100] == 0) {
            count++;
            numbers[input - 100] = input;
        }
    }

    printf("\nTotal unique numbers entered: %d\n", count);

    printA(numbers, sizeof(numbers)/sizeof(numbers[0]));

    return 0;
}

字符串

3zwtqj6y

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()中的循环中添加了缓冲区溢出保护:

#include <stdio.h>

void sort(int *numbers, int count) 
{
int m, j;

   for (m = 0; m < count; m++) {
        for (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) 
{
    int i;
    for (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 from 100 to 200 inclusive (enter a number outside this range to finish):\n");

    while (count < 101) /* Updated -- protect from array over-run */ 
    {
        scanf("%d", &input);
        if (input < 100 || input > 200) {
            break;
        }
        /* Updated -- numbers are not pre-sorted during storage.
        * Now the sort function can reach all the data entries.*/
        numbers[count++] = input;
    }
    printf("\nTotal unique numbers entered: %d\n", count);

    sort(numbers, count);
    printA(numbers, count);

    return 0;
}

字符串

相关问题