
初心者のためコードや説明が拙いと思いますが、ご了承ください。
今この問題に取り組んでいます。
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
C言語 コマンドプロンプトについて。
C言語・C++・C#
-
C言語について。
C言語・C++・C#
-
visual studio 2019において、宣言していない変数があるのにエラーなくビルド出来ました
C言語・C++・C#
-
-
4
C言語初心者 ポインタについて、お助けください、、
C言語・C++・C#
-
5
C言語について。
C言語・C++・C#
-
6
C言語でif文が予想と違う動きをする件について7
C言語・C++・C#
-
7
C言語初心者です、、、お助けください
C言語・C++・C#
-
8
S-JIS → JIS コード変換するには
C言語・C++・C#
-
9
プログラミング アルゴリズム
C言語・C++・C#
-
10
悪い、ダメなプログラム
C言語・C++・C#
-
11
stdio.hのバッファについて。
C言語・C++・C#
-
12
C言語初心者 構造体 課題について
C言語・C++・C#
-
13
参考にいろいろとc言語、c++言語プログラミングでレジストリーを操作したいのですが、無料配布のc++
C言語・C++・C#
-
14
C言語です このプログラムに自分で定義した関数を入れたいです! アドバイスください!
C言語・C++・C#
-
15
C言語について
C言語・C++・C#
-
16
C言語について。
C言語・C++・C#
-
17
ファイルがあるのにエクスプローラでは存在しない
C言語・C++・C#
-
18
マクロ関数 #define の効果は何ですか? わかりやすく教えて下さい
C言語・C++・C#
-
19
C言語について。
C言語・C++・C#
-
20
C++言語の16進数の表現についておしえてください
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
C言語 数値の連続入力について
-
5
define で 配列
-
6
要素数・要素の値が未定の配列...
-
7
配列の要素数に変数を入れたい...
-
8
配列のアドレス部
-
9
C言語において、 配列要素をひ...
-
10
C言語 ファイルの指定された行...
-
11
2次元配列のマスを数える方法...
-
12
C言語でエラーの直し方が分かり...
-
13
callocで二次元配列を作成する...
-
14
C#でのフィボナッチ数列
-
15
C#で配列が空かを判定するには?
-
16
C言語 プログラミング
-
17
カードシャッフルのブログラム...
-
18
C言語から質問です。
-
19
C言語についてです 5人のテスト...
-
20
C言語 配列の長さの上限
おすすめ情報
公式facebook
公式twitter