ifおよび等価ステートメント
-
03-07-2019 - |
質問
問題を解決しようとしていますこちらしかし、なぜコードが機能しないのか分かりません。どんな助けも大歓迎です。編集:下記の修正を行うために編集されましたが、まだ余分な<!> quot; 15 <!> quot;があります。 (太字で)出力の2行目で、どこから来たのかわかりません。
私の出力は
18662658515 5552272 15
#include <stdlib.h>
#include <stdio.h>
int main(void){
int n;
int j;
scanf("%d\n", &n);
int i = 0;
char mystr[15];
for(;i<n;i++){
fgets(mystr,15,stdin);
for(j=0;j<15;j++){
if(isdigit(mystr[j])){
printf("%c", mystr[j]);
continue;
}
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
if ('D' <= mystr[j] && mystr[j] <= 'F')
printf("3");
if ('G' <= mystr[j] && mystr[j] <= 'I')
printf("4");
if ('J' <= mystr[j] && mystr[j] <= 'L')
printf("5");
if ('M' <= mystr[j] && mystr[j] <= 'O')
printf("6");
if ('P' <= mystr[j] && mystr[j] <= 'S')
printf("7");
if ('T' <= mystr[j] && mystr[j] <= 'V')
printf("8");
if ('W' <= mystr[j] && mystr[j] <= 'Z')
printf("9");
}
printf("\n");
}
}
解決
問題は、入力の長さに関係なく、入力文字列の15文字すべてを反復処理していることです。最初のテストケースには11文字ありますが、2番目のケースには8文字しかありません。2回目の反復では、最初の入力の最後の2文字(15
。
これを修正するには、NUL文字0を押したときに繰り返しを停止します。これにより、この行を変更して文字列が終了します
for(j=0;j<15;j++){
to
for(j=0; mystr[j] != 0; j++){
他のヒント
一つには、あなたの比較は後方にあると思います。たとえば、<!> quot; if( 'A' <!> lt; = mystr [j] <!> amp; <!> amp; mystr [j] <!> lt; = 'C' )<!> quot;。
おそらく、関数between()があると助かります(謝罪します;私のCはさびています):
bool between(char c, char before, char after) {
return before <= c && c <= after;
}
そう
if ('A' <= mystr[j] && mystr[j] <= 'C')
printf("2");
なる
if (between(mystr[j], 'A', 'C')
printf("2");
一般に、半開きの範囲を使用することをお勧めします。この場合、下限は包括的で、上限は排他的です。これにより、各テストの最後の要素が前のテストの最初の要素になり、特定の種類のバグをより簡単に検出できるようになります。
同じ順番で物事を比較したいと思うかもしれません。コードを書く前に、これを平易な英語で話してください。 myLetterCodeがA.codeよりも大きい場合<!> amp; <!> amp; myLetterCodeはC.Codeよりも小さい(Bでなければならない!)。
左側にあなたの手紙を、右側にあなたがそれを比較しているものを保管してください。そうしないと、非常に速く非常に混乱します。
ルックアップテーブルを使用すると、これは簡単になりませんか?
int numbers[] = { 2, 2, 2, 3, 3, 3,
4, 4, 4, 5, 5, 5, 6, 6, 6,
7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9};
... cut ...
if (isdigit (mystr[j]))
printf ("%c", mystr[j]);
else
printf ("%d", numbers[mystr[j] - 'A']);
... cut ...