質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

Q&A

解決済

2回答

1684閲覧

AIZU ONLINE JUDGE Lesson-ITP1 ITP1_6_Bの問題 構造体を用いて

kelt22

総合スコア46

C

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

0グッド

0クリップ

投稿2020/05/14 10:04

前提・実現したいこと

AIZU ONLINE JUDGE Lesson-ITP1 ITP1_6_Bの問題を構造体を用いたコードで解決したいです。
{太郎が花子と一緒にトランプ遊びをしようとしたところ、52枚あるはずのカードが n 枚のカードしか手元にありません。これらの n 枚のカードを入力として、足りないカードを出力するプログラムを作成して下さい。

太郎が最初に持っていたトランプはジョーカーを除く52枚のカードです。

52枚のカードは、スペード、ハート、クラブ、ダイヤの4つの絵柄に分かれており、各絵柄には13のランクがあります。}

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

エラーメッセージはないんですが

c

1scanf("%d",&n); 2 Card card[n]; 3 for(i=0;i<n;i++){ 4 scanf("%c %d",&card[i].name,&card[i].num); 5 } 6```の部分のコードがうまく機能しておらずn個のカード読み込むことができません。どこがおかしいか解説していただけると嬉しいです。 7### 該当のソースコード 8 9```c 10#include <stdio.h> 11 12typedef struct{ 13 char name; 14 int num; 15}Card; 16 17void cardcheck(Card *sample,Card *card,int n){ 18 int i,j; 19 int judge; 20 for(i=0;i<52;i++){ 21 judge=0; 22 for(j=0;j<n;j++){ 23 if((sample[i].name==card[j].name)&&(sample[i].num==card[j].num)){ 24 judge=1; 25 break; 26 } 27 } 28 if(judge==0){ 29 printf("%c %d\n",sample[i].name,sample[i].num); 30 } 31 } 32} 33int main(void){ 34 int n; 35 int i; 36 Card sample[52]={ 37 {'S',1}, 38 {'S',2}, 39 {'S',3}, 40 {'S',4}, 41 {'S',5}, 42 {'S',6}, 43 {'S',7}, 44 {'S',8}, 45 {'S',9}, 46 {'S',10}, 47 {'S',11}, 48 {'S',12}, 49 {'S',13}, 50 {'H',1}, 51 {'H',2}, 52 {'H',3}, 53 {'H',4}, 54 {'H',5}, 55 {'H',6}, 56 {'H',7}, 57 {'H',8}, 58 {'H',9}, 59 {'H',10}, 60 {'H',11}, 61 {'H',12}, 62 {'H',13}, 63 {'C',1}, 64 {'C',2}, 65 {'C',3}, 66 {'C',4}, 67 {'C',5}, 68 {'C',6}, 69 {'C',7}, 70 {'C',8}, 71 {'C',9}, 72 {'C',10}, 73 {'C',11}, 74 {'C',12}, 75 {'C',13}, 76 {'D',1}, 77 {'D',2}, 78 {'D',3}, 79 {'D',4}, 80 {'D',5}, 81 {'D',6}, 82 {'D',7}, 83 {'D',8}, 84 {'D',9}, 85 {'D',10}, 86 {'D',11}, 87 {'D',12}, 88 {'D',13}, 89 }; 90 scanf("%d",&n); 91 Card card[n]; 92 for(i=0;i<n;i++){ 93 scanf("%c %d",&card[i].name,&card[i].num); 94 } 95 cardcheck(sample,card,n); 96 return 0; 97}

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2020/05/14 10:11

> ~の部分のコードがうまく機能しておらずn個のカード読み込むことができません どのような入力でどのようになるはずが, どのように機能せず出来ないのでしょうか.
kelt22

2020/05/14 10:32

例えばn=30といれても30までいかずn=20で読み込みが終わって下の関数が実行してしまう感じです。
kelt22

2020/05/14 12:39

scanf("%*c%c")を使うことで一応解決することができました。ありがとうございます。
guest

回答2

0

ベストアンサー

構造体を使う必要は無いのでは.

c

1#include <stdio.h> 2#include <string.h> 3int main() { 4 int i,n,r; 5 char c,cards[52]={0}; 6 char *suits="SHCD",*p; 7 scanf("%d",&n); 8 for(i=0;i<n;i++){ 9 scanf(" %c %d",&c,&r); 10 p=strchr(suits,c); 11 if(p==NULL||r<1||r>13) return 1; //エラー 12 cards[(p-suits)*13+r-1]=1; 13 } 14 for(i=0;i<52;i++){ 15 if(cards[i]==0) printf("%c %d\n",suits[i/13],i%13+1); 16 } 17 return 0; 18}

投稿2020/05/14 11:31

jimbe

総合スコア13209

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

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

kelt22

2020/05/14 12:41

構造体を使わないやり方は思いつかなかったのでありがとうございます。
guest

0

scanf(" %c%d",&card[i].name,&card[i].num);
にすればいいのでは?

投稿2020/05/14 10:17

PingHermit

総合スコア478

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

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

PingHermit

2020/05/14 10:32

あ、解説がいるのか。 %c は、空白文字を含めて1文字読み込もうとします。 前に入力した数値の後の改行を読み込んでしまうと思うので、 空白文字を読み飛ばすように、%c の前に ' ' や、'\n'、'\t' など 空白文字を読み飛ばす文字を入れると、改行を読み飛ばしてくれます。 %d は数値以外は受け付けませんが、空白文字は勝手に読み飛ばしてくれる仕様なので、 %d の前に空白文字は必要ありません。 scanf の所しか見ていません。
PingHermit

2020/05/14 10:36

よく、改行を読み飛ばそうと、 "%d\n" とする人がいますが、 数値入力の後の空白文字を読み飛ばそうとします。 だから、空白文字以外の文字が来るか、eof になるまで、 scanf を抜け出せなくなります。 最後に付けるのだけはやめましょう。
kelt22

2020/05/14 12:35

すいません。やってみたのですが、前のコードと同じような感じで入力がうまくいきませんでした。
PingHermit

2020/05/14 13:10

じゃ、入力ミスしているかですかね。 scanf の返却値で、チェックしましょう。 当然、成功しているなら、2が返ってくるはずですから。 まあ、デバッグ時は、printf とかでどういう状態になっているかなど 出力してチェックしておかないと、 何で動作がおかしくなっているか、わからないでしょうから。 scanf の入力後に、回数:scanfの返却値、入力値を出力するくらいはしましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問