![](/img/trans.png)
[英]Input n (a positive integer) numbers and work out their sum, average and sum of the squares of the numbers
[英]Sum and average for n numbers with -1 as exit integer
您好,我的代碼有一個小問題,我想了解一下。 我的任務是編寫一個程序,用 while 循環或嵌套的 while 循環,用 if 條件對 n 個數字求和和求平均值,當你想退出代碼時,你應該輸入 -1。 代碼在下面。 我遇到的問題是我無法從計算中排除 -1 。 我究竟做錯了什么。 它假設是一個簡單的代碼。
int main(void) {
int count;
float sum, average, number;
sum = 0;
count = 0;
printf("Calculate sum and average (-1 to quit)\n");
while (number!=-1) {
scanf("%f", &number);
sum = sum + number;
count = count + 1;
}
average = sum / count;
printf("Sum=%f", sum);
printf(" Average=%f", average);
}
在 while 塊中,您讀取數字,然后將其添加到您的平均計算中,只有在重復迭代之后,您才檢查它是否不同於 -1 以停止迭代:
顯然有不同的解決方法:
一種方法是使用 while(true) 並在讀取數字后的 while 塊中添加一個 if 語句以將其與 -1 進行比較並跳出循環
while (true) {
scanf("%f", &number);
if (number == -1) break;
sum = sum + number;
count = count + 1;
}
重新排序不同的步驟可以解決這個問題:
int main(void) {
int count;
float sum, average, number=0.0f;
sum = 0;
count = -1;
printf("Calculate sum and average (-1 to quit)\n");
while (number!=-1) {
sum = sum + number; // first time no effect with 0
count = count + 1; // first time "no effect" counting to 0
scanf("%f", &number); // will not be counted or summed if -1
}
average = sum / count;
printf("Sum=%f", sum);
printf(" Average=%f", average);
}
立即輸入 -1 仔細考慮:
用一個數字來想一想:
順便說一下,比較浮動的身份是有風險的。 如果你可以更“慷慨地”比較,你會更安全,例如while (number>-0.5)
。
我認為你應該在循環的最后一個輸入,因為它會在下一次迭代中得到檢查。 當 -1 出現時,它不會被添加。
#include <stdio.h>
int main(){
int count=0;
float sum=0, average=0, number=0;
printf("Calculate sum and average (-1 to quit)\n");
while(number!=-1){
sum = sum + number;
count = count + 1;
scanf("%f", &number);
}
average = sum / count;
printf("Sum=%f", sum);
printf(" Average=%f", average);
}
代碼需要將number
測試為 -1,然后才能將其包含在總和中。 OP 的代碼測試幾乎可以做到這一點。 甚至在分配number
之前 OP 的代碼測試-1
會導致未定義的行為(UB)。
float number;
while (number!=-1) { // UB!
測試scanf()
的返回碼是否成功也很好。
while (scanf("%f", &number) == 1 && number != -1) {
sum = sum + number;
count = count + 1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.