
初心者のためコードや説明が拙いと思いますが、ご了承ください。
今この問題に取り組んでいます。
https://onlinejudge.u-aizu.ac.jp/problems/ITP1_6_B
私はC言語で以下のようにコードを書きましたが、コンパイルは通ったものの実行すると上手くいきません。修正すべきところを教えて下さい。
うまくいっていないと思う箇所
・カードの枚数nを入力してもその枚数分読み込めない。
・最後に入力したカードが読み込まれない。
自分が書いたコード;
#include <stdio.h>
#include <string.h>
struct playingcard {
int number;
char suit;
};
int main(void) {
int n;
struct playingcard card[52];
int s[13], h[13], d[13], c[13];
int sn=1, hn=1, dn=1, cn=1;
int count = 0;
scanf("%d", &n);
for (int i = 0; i < (n+1); i++) {
scanf("%c %d", &card[i].suit, &card[i].number);
}
for (int j = 0; j < n; j++) {
if (card[j].suit == 'S') {
s[sn] = card[j].number;
sn++;
}
else if (card[j].suit == 'H') {
h[hn] = card[j].number;
hn++;
}
else if (card[j].suit == 'C') {
c[cn] = card[j].number;
cn++;
}
else if (card[j].suit == 'D') {
d[dn] = card[j].number;
dn++;
}
}
for (int x = 1; x < 14; x++) {
for (int a = 1; a < (sn + 1); a++) {
if (x == s[a]) {
count++;
}
}
if (count == 0) {
printf("S %d\n", x);
}
count = 0;
}
for (int x = 1; x < 14; x++) {
for (int a = 1; a < (hn + 1); a++) {
if (x == h[a]) {
count++;
}
}
if (count == 0) {
printf("H %d\n", x);
}
count = 0;
}
for (int x = 1; x < 14; x++) {
for (int a = 1; a < (cn + 1); a++) {
if (x == c[a]) {
count++;
}
}
if (count == 0) {
printf("C %d\n", x);
}
count = 0;
}
for (int x = 1; x < 14; x++) {
for (int a = 1; a < (dn + 1); a++) {
if (x == d[a]) {
count++;
}
}
if (count == 0) {
printf("D %d\n", x);
}
count = 0;
}
}
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
何が上手くいっていないのかを人に聞くというのも一つの手ではありますが、何が上手くいっていないのかを自分で探る方法を身につけましょう。
そうしないと、上手くいかないことがあったら人に教えてもらう、ということを一生続けなくてはなりません。たとえば、1行目を読んだ後にその行数分だけscanf()を使ってplayingcard構造体に値を入れていると思いますが、これがどのように格納されているかを確認する、といったことを繰り返しながら進めた方がいいです。
たとえば、こんな感じ。forループの中のscanf()の下にprintf()を入れているだけですが、1行画面から入力するごとにその入力した内容を(意図する動きであれば)オウム返ししているだけです。他に出力したい内容があれば、printf()で出力したい内容を書けばいいです。
for (i = 0; i < (n+1); i++) {
scanf("%c %d", &card[i].suit, &card[i].number);
printf("XXXX %c : %d\n", card[i].suit, card[i].number);
}
ここの処理が上手くいっていることを確認したら次の処理の確認へ進む、といったやり方をすると、少なくともどこが悪いかを自分で知ることができます。
また、こういったことを試すのにいちいちキーボードから入力するのも大変だと思いますので、入力はファイルに書いておいて、これを標準入力に食わせるといった方法を取ると時短ができるかもしれません。
$ ./my-command < cards.txt
No.2
- 回答日時:
配列の添え字は気を付けましょう。
C 言語の系統では添え字は 0 から始まるので、
n個の要素を持つ配列を順に処理するなら大抵はこう書きます。
for (i=0; i<n; i++) 処理(配列[i]);
参考)
https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%AA …
scanf の %c は少々特殊なので、空白に対する配慮が必要です。
誤: scanf("%c %d", ...
正: scanf(" %c %d", ...
参考)
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/ …
変換指定の %c の説明にて以下の記述有り
> 通常行われる先頭のホワイトスペースの読み飛ばしは行われない。
> 先頭のホワイトスペースを読み飛ばすためには、
> フォーマット文の中で明示的にスペースを使用すれば良い。
フォーマット文の ホワイトスペース の説明にて以下の記述有り
> 入力中の任意の個数のホワイトスペースに一致する。
> 「何もなし」にも一致する
余談ではありますが
配列 s, h, d, c は不要かと思います。
この程度のデータ量なら配列 card を直接見ても問題ないでしょう。
例)
for (char* suit = "SHCD"; *suit; suit++) {
for (int num = 1; num <= 13; num++) {
if (card[i].suit == *suit && card[i].number == num) {
...
No.1
- 回答日時:
「カードの枚数nを入力してもその枚数分読み込めない。
」とか「最後に入力したカードが読み込まれない。」とか書いてあるけど, 「読み込めない」「読み込まれない」がどのような状況を指しているのかがわからない.・どのような入力をして
・どのような結果になることを期待したところ
・実際にはどのような結果であったのか
を「具体的に」書いてほしい.
あと, 配列の宣言と添え字の範囲の関係は大丈夫? 例えば
int a[10];
と配列を宣言した場合, 実際に値を格納できるのは
a[0]~a[9] の 10ヶ所
ってことは理解してる?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
int16_t の _t は何?
-
windows-findstrの正規表現を使...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
【C++】関数ポインタの使い方
-
acceptをalarmでタイムアウトさ...
-
実数の整数部,小数部の取得
-
PowerShellがうまくいかない
-
int型の変数値をバイト列として...
-
read関数をノンブロッキングで...
-
クイックソートプログラムでセ...
-
C++プログラミングコードにポリ...
-
エラー 添字が付けられた値が、...
-
#define _CRT_SECURE_NO_WARNIN...
-
配列変数のポインターが勝手に...
-
ビットフィールドをクリアした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
最早開始時間と最遅完了時刻を...
-
【C++】関数ポインタの使い方
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
実数の整数部,小数部の取得
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
ColorをRGBで指定する方法
-
acceptをalarmでタイムアウトさ...
-
systemの戻り値を取得する方法
-
足して100になるような乱数のア...
-
PowerShellがうまくいかない
-
std::set<int> で、ある値が何...
-
C言語の配列をC++のvectorに高...
-
構造体の勉強中です 合計点の高...
おすすめ情報