🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

610閲覧

Aizu Oneline JudgeでRCからぬけだせない

Courange

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/10/26 12:44

発生している問題・エラーメッセージ

Aizu oneline judgeの問題Lesson - ITP1 ITP1_9_AでRCからぬけだせません

該当のソースコード

C

1#include <stdio.h> 2#include <string.h> 3int main (){ 4 char W[11],T[1001]; 5 int count = 0,i; 6 scanf("%s",W); 7 while(scanf("%s",T)&& strcmp (T,"END_OF_TEXT") != 0){ 8 for(i = 0;i < strlen(W);i++){ 9 if(W[i] >='A' && W[i] <= 'A'){ 10 W[i] += 32; 11 } 12 if(strcmp(W,T) == 0)count++; 13 } 14 printf("%d\n",count); 15 return 0; 16 } 17} 18

補足情報(FW/ツールのバージョンなど)

Windows10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

きっとここです

diff

1- if(W[i] >='A' && W[i] <= 'A'){ 2+ if(W[i] >='A' && W[i] <= 'Z'){

追記

やっぱりインデントはズレてますね。
元のコードのインデントは次のようになってるのが正しいです。

diff

1- if(strcmp(W,T) == 0)count++; 2+ if(strcmp(W,T) == 0)count++; 3 } 4- printf("%d\n",count); 5- return 0; 6+ printf("%d\n",count); 7+ return 0; 8 }

WAの原因なのですが、大文字判定のミスに加えて、

printf("%d\n",count); return 0;

この2文がwhileの中に入っちゃってるので、Tの取得を1回しか行ってないみたいです。

投稿2019/10/26 14:03

編集2019/10/26 14:35
set0gut1

総合スコア2413

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Courange

2019/10/26 14:25

今修正してみたのですがやっぱりWrong answerのままでした・・・。 現段階で分かった問題点は、 Sample Input をTに代入するときに改行があるところ(サイトにあるSample Input の二行目の終わりあたりにある改行のこと)でwhileのループが終了してしまうことです
set0gut1

2019/10/26 14:35

追記しました
Courange

2019/10/26 15:06

#include <stdio.h> #include <string.h> int main (){ char W[11],T[1001]; int count = 0,i; scanf("%s",W); while(scanf("%s",T)&& strcmp (T,"END_OF_TEXT") != 0){ for(i = 0;i < strlen(W);i++){ if(W[i] >='A' && W[i] <= 'Z'){ W[i] += 32; } } if(strcmp(W,T) == 0)count++; } printf("%d\n",count); return 0; } こんな感じに修正できました 今の状況としてはcountがうまく動作しない(正しい値にならない)ということになっていますが、W,Tそれぞれに代入することができるようになった感じです
set0gut1

2019/10/26 15:44

じっくり見てみると、あれですね。小文字のみに変換する必要があるのはTであって、実装だとWを変換してるところが間違ってるみたいです。
Courange

2019/10/26 17:04

うわぁ・・・恥ずかしいミスを・・・ 無事正解することができましたm(__)m
set0gut1

2019/10/26 17:07

おめでとうございます!ベストアンサーありがとうございました。
thkana

2019/10/26 22:55

例えば、 IS Is this a pen? END_OF_TEXT で1という結果を期待するならば、 TもWも小文字(または大文字)に揃えて変換すべきと思います。
set0gut1

2019/10/26 23:02

出題の constraints に "W consists of lower case letters" とあります。
thkana

2019/10/26 23:05

あと、Cの言語規格では'A'~'Z'の文字コードが連続していることを保証していません。連続していないシステムって激レアと言っていいとは思いますが。 厳密に考えるなら、文字コードを自分で判別するのではなく、isupper()関数を使う、あるいは変換までやってくれるtolower()関数を使う方がよいのでは。
thkana

2019/10/26 23:06

了解。見落としてました>lower case
set0gut1

2019/10/26 23:11

> あと、Cの言語規格では'A'~'Z'の文字コードが連続していることを保証していません。 これは、考えたこともなかったです…。勉強になります。
guest

0

RCってなに? 競技プログラミング用語は知ってて当然なのかな?

とりあえず、インデントをちゃんとするだけで何かが解決するような気がします。


以下追記。質問のプログラムのインデントをつけなおしました。

C

1#include <stdio.h> 2#include <string.h> 3int main() { 4 char W[11], T[1001]; 5 int count = 0, i; 6 scanf("%s", W); 7 while (scanf("%s", T) && strcmp(T, "END_OF_TEXT") != 0) { 8 for (i = 0; i < strlen(W); i++) { 9 if (W[i] >= 'A' && W[i] <= 'A') { 10 W[i] += 32; 11 } 12 if (strcmp(W, T) == 0) 13 count++; 14 } 15 printf("%d\n", count); 16 return 0; 17 } 18}

概ね、{ }の中身は一段回「深い」位置に書く、というのが原則です(一部、{ }によらないものもあります。そのへんは文法的な理由によります)。対応する{と}は、同じ桁になります。手でやってもいいですが、エディタに自動整形機能があればそれに任せれば概ねやってくれると思いますし、その方が確実。

インデントをちゃんとつけると、while,for,if、また今回はありませんがswitch文や構造体定義などの適用範囲がわかりやすくなります。また、場合によっては{や}の付け忘れ、付け過ぎに気がつくこともあるでしょう。これがインデントの効果です。 {を行末に付けるか、新しい行に持ってくるかというのはあなたの好きにすればいい(チームで作るプログラムならチームの方針に合わせる)ことです。

そうすると、
・一度だけ処理すればいいはずのWの小文字化のループがTの処理ループに含まれてしまって何度も行われている
・単語毎に処理すればいいはずの文字列比較がWの小文字化ループに含まれてしまって文字を調べる毎に行われている
・最終結果の表示と、プログラム全体を終わらせるreturnが単語毎の処理のループに含まれてしまっているので単語一つ調べるとプログラムが終わる
なんていう誤りが見つけやすくなるでしょう。

Wrong answerと勘違いしていました・・・

勘違いが主題じゃなくて、競技プログラミングの世界だけの略語をなんの注もなく書いていることを気にしています。WAと言ったらWrong Answerだ、というのがソフトウェアの世界一般に知られていて、お前が無知なだけだ、あるいは、競技プログラミングを知らないなら口を出すな、という意味であえて解説なしで書いているのならそれはそれですが。
それと、問題に入出力例が書いてあるのですから、提出する前にその入力を与えて同じ出力が出るかどうかぐらい自分の手元で確認するものじゃないのですか?

投稿2019/10/26 13:26

編集2019/10/26 22:56
thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2019/10/26 13:37

それで全部が解決するわけじゃないですけど。
Courange

2019/10/26 14:00

ごめんなさい。Wrong answerと勘違いしていました・・・
Courange

2019/10/26 14:02

あとインデントがおかしいというのは 例えば if() { 処理 } と if(){ } の違いでしょうか それともそれ以前の問題でしょうか
thkana

2019/10/26 22:54

それ以前の問題です。 コメント欄ではインデントの表現が難しいので回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問