限制 C 中的循环

Limiting a loop in C

我已经为作业编写了一个程序。我遇到的问题是我不知道如何制作一个 for 循环来限制可以输入的数据量。例如,对于此作业,用户可以输入比方说 100 个等级。关于如何以及在何处添加 for 循环的任何建议?

#include <stdio.h>
#include <stdlib.h>

/* Kimberly Brand - IT2240  * 05/17/2022
*/

int main (void) {
    // defines a max  of 100
#define maxnum 100
    int i, grade[maxnum], maxentered;
    i = 0;
    printf ("Welcome! \n");
    printf ("Please enter your grades, enter -1 when finished \n\n");
    // while statemtn accepts numbers over 0
    while (i < 100) {
        printf ("please enter your grade ");
        scanf ("%i", & grade[i]);
        // ends program if - 1 is entered
        if (grade[i] == -1)  { //max entered only accepts 100
            maxentered = i;
            i = 100;
        } else
            i++;
    }
    printf ("Your grades are :\n");
    for (i = 0; i < maxentered; i++)  {
        // displays grade entered
        printf ("%i", grade[i]);
        printf ("\n");
    }
    printf ("Thank you!\n");
}

您可以使用 break 语句退出循环,而不是直接将 i 设置为 100

https://en.cppreference.com/w/cpp/language/break

// ...
    while (i < 100) {
        printf ("please enter your grade ");
        scanf ("%i", & grade[i]);
        // ends program if - 1 is entered
        if (grade[i] == -1)  { //max entered only accepts 100
            maxentered = i;
            break; // <<< NEW
        } else
            i++;
    }
// ...

您是说要更改 while 循环 用于 for 循环

您的 while 循环已经非常成功地限制了数据量。

while (i < 100) {
        printf ("please enter your grade ");
        scanf ("%i", & grade[i]);
        // ends program if - 1 is entered
        if (grade[i] == -1)  { //max entered only accepts 100
            maxentered = i;
            i = 100;
        } else
            i++;
    }

如果您将 (i < 100) 更改为 (i < 5),您的代码将限制条目的数量数组为 5,即使它可以存储 100 个条目。

但是在这种情况下,for-loop 可能比 while 循环更好。它看起来像这样:

for(i = 0; i < 100; i++){

//And then just add the code you want to execute inside
//I would recommend using a 'break;' statement instead of relying
//on 'i = 100' to break out of the loop.

} 

作为旁注,您从未给 maxentered 一个默认值,因此如果您从不键入 -1,您的程序将会崩溃但是而是输入循环允许的尽可能多的成绩。

while 一个循环结构,你已经限制了可以读取的数据量。

如果您将 maxentered 初始化为 maxnum(对于在用户输入 -1 之前达到限制的事件),并更改循环的边界(以避免 magic number 100 可能与数组的大小不同步),这个程序会工作得很好(假设 scanf 永远不会失败)。

#include <stdio.h>
#include <stdlib.h>

/* Kimberly Brand - IT2240  * 05/17/2022
*/

int main (void) {
    // defines a max  of 100
#define maxnum 100
    int i, grade[maxnum], maxentered = maxnum;
    i = 0;                                            
    printf ("Welcome! \n");                           
    printf ("Please enter your grades, enter -1 when finished \n\n");
    // while statemtn accepts numbers over 0          
    while (i < maxnum) {                              
        printf ("please enter your grade ");
        scanf ("%i", & grade[i]);
        // ends program if - 1 is entered
        if (grade[i] == -1)  { //max entered only accepts 100
            maxentered = i;   
            i = 100;
        } else
            i++;
    }
    printf ("Your grades are :\n");
    for (i = 0; i < maxentered; i++)  {
        // displays grade entered
        printf ("%i", grade[i]);
        printf ("\n");
    }
    printf ("Thank you!\n");
}

也就是说,它可以稍微清理一下。

始终检查 scanf 的 return 值是否为发生的 预期成功转换次数 。我们希望发生一次转换,因此我们希望 return 值为 1.

一旦循环完成,原始索引变量可以被认为是保存数组中有效条目的长度。这可以在访问数据时作为新绑定重用。

size_t 是索引内存和处理对象大小的合适类型。虽然对于较小的数据结构来说并不重要,但练习是一个好习惯。

#include <stdio.h>

#define MAX_ENTRIES 100

int main(void) {
    int grades[MAX_ENTRIES];
    size_t len = 0;

    printf("Welcome!\nPlease enter your grades, enter -1 when finished.\n\n");

    while (len < MAX_ENTRIES) {
        printf("Please enter your grade: ");

        if (1 != scanf("%d", &grades[len])) {
            fprintf(stderr, "Failed to read input.\n");
            return 1;
        }

        if (grades[len] == -1)
            break;

        len++;
    }

    printf("Your grades are:\n");

    for (size_t i = 0; i < len; i++)
        printf("[#%zu] %d\n", i + 1, grades[i]);

    printf("Thank you!\n");
}