我必須輸入整數,如果我輸入負數,程式必須停止。它必須總結我輸入的每個整數,其中包含“7”,但由于某種原因,它將“70”計為“7”。我對編程很陌生,我堅持這一點。
#include <stdio.h>
int main() {
int number = 1, temp_var = 0, sum = 0;
while (number >= 0) {
printf("Put in a number: ");
scanf_s("%d", &number);
while (number >= 1) {
temp_var = number % 10;
if (temp_var == 7)
{
sum = sum number;
break;
}
number = number / 10;
}
}
printf("%d", sum);
return 0;
}
uj5u.com熱心網友回復:
當最低有效位變為零時,您正在修改number然后添加修改后的值(因此 70 加 7,而例如 770 或 771 都加 77)。
您應該保留原始輸入值并添加它,同時修改原始的副本以檢測數字 7。
或者接受一個字串輸入,掃描它是否有“7”個字符,如果是,則轉換為整數并添加它。例如:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char buffer[16] = "" ;
int sum = 0;
do
{
char* input = fgets( buffer, sizeof(buffer), stdin ) ;
for( const char* scan = input;
input != NULL && *scan != 0 && isdigit(*scan);
scan )
{
if( *scan == '7' )
{
sum = atoi( input ) ;
break ;
}
}
}
while( isdigit(*input) ) ;
printf("Sum: %d", sum );
return 0;
}
如果輸入以任何非數字字符(包括換行符)開頭,則輸入回圈終止。尾隨的非數字字符被忽略。
uj5u.com熱心網友回復:
您的代碼不正確:您進行修改number是為了測驗它是否7在其基數 10 表示的數字中,因此如果測驗成功,則不要添加原始值。您應該使用單獨的變數來測驗數字值。
終止測驗 ifnumber是否有效,但對于普通讀者來說并不簡單。
這是修改后的版本:
#include <stdio.h>
int main() {
int number, temp_number, sum = 0;
for (;;) {
printf("Put in a number: ");
if (scanf("%d", &number) != 1 || number < 0)
break;
for (temp_number = number; temp_number; temp_number /= 10) {
if (temp_number % 10 == 7) {
sum = sum number;
break;
}
}
}
printf("%d\n", sum);
return 0;
}
uj5u.com熱心網友回復:
有一些問題:
- 你正在回圈
number,它最終變為零。 - 當您嘗試添加到 時
sum,您想要 的原始值,number但您使用的是部分修改的值。 - 您想保留原始值并在回圈中使用臨時副本。
while (number >= 0)如果執行了負數(即執行了額外的回圈迭代),in 外回圈不會立即停止。我們想if在scanf_s.- 因為
number被內部回圈破壞了,所以外部回圈只會執行一次。
這是重構的代碼。注釋如下:
#include <stdio.h>
int
main(void)
{
int number = 1,
temp_var = 0,
sum = 0;
// NOTE/BUG: this will loop once too often
#if 0
while (number >= 0) {
#else
while (1) {
#endif
printf("Put in a number: ");
scanf("%d", &number);
// NOTE/FIX: correct way to stop on negative number
#if 1
if (number < 0)
break;
#endif
// NOTE/FIX: to prevent "number" from being trashed, we should use a temp
// value in the loop
int temp_number = number;
while (temp_number >= 1) {
temp_var = temp_number % 10;
if (temp_var == 7) {
sum = sum number;
break;
}
temp_number = temp_number / 10;
}
}
printf("%d\n", sum);
return 0;
}
在上面的代碼中,我使用cpp條件來表示舊代碼和新代碼:
#if 0
// old code
#else
// new code
#endif
#if 1
// new code
#endif
這是一個稍微清理過的版本,它將數字匹配代碼放在一個函式中:
#include <stdio.h>
// hasdigit -- decide if a given number contains a given decimal digit
int
hasdigit(int number,int dig)
{
int temp_var;
int match = 0;
while (number != 0) {
temp_var = number % 10;
match = (temp_var == dig);
if (match)
break;
number = number / 10;
}
return match;
}
int
main(void)
{
int number;
int sum = 0;
while (1) {
printf("Put in a number: ");
scanf("%d", &number);
if (number < 0)
break;
if (hasdigit(number,7))
sum = number;
}
printf("%d\n", sum);
return 0;
}
uj5u.com熱心網友回復:
這是一個略有不同的看法。通常,對 7 的測驗將由單獨的函式完成。由于您似乎尚未在學習中涵蓋函式,因此所有代碼都包含在 main 函式中。
/* Question: input numbers; stop on a negative #; sum numbers with a "7" */
#include <stdio.h>
int main (void)
{
printf("\n");
printf("enter a number (negative number to exit): ");
int number;
scanf_s("%d", &number);
int sum = 0;
while (number >= 0) {
int power = 1; // mult of 10 matching left-most digit (also a loop counter)
while (number / power > 9) {
power *= 10;
}
int temp = number; // save current value of number
do {
// if find a 7 then add number to sum and exit this do loop
if (temp / power == 7) {
sum = number;
break;
}
temp %= power; // drop left-most digit
power /= 10; // adjust multiple of 10
} while (power > 0);
printf("enter a number (negative number to exit): ");
scanf_s("%d", &number);
}
printf("sum = %d\n", sum);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457192.html
標籤:C
上一篇:從結構創建BST節點時的編譯錯誤
下一篇:c語言記憶體泄漏的原因是什么?
