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

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

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

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

Q&A

2回答

920閲覧

テストケースの作り方についてご教示ください

omologic

総合スコア6

C

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

0グッド

0クリップ

投稿2020/04/20 15:59

編集2020/04/21 08:06

前提・実現したいこと

下記問題文の実装にあたり、
https://atcoder.jp/contests/abc045/tasks/abc045_b

本文下部に掲載のソースコードのとおりにプログラムを実装しましたが、
テストケースの一部が通らず不合格となってしまっております。

本問のテストケースは非公開の為、どこに問題があるのか見当がつかず、バグの修正が出来ない状況です。
問題となりうる箇所や本問のケースに必要と思われるテストケースや
テストケース作成の思考過程についてご教示いただければ大変ありがたいです。

ソースコード自体もこう変更したほうがよい、などのアドバイスがあればご教示いただけると大変幸いです。

仕様概要としてはA,B,Cの3プレイヤーのうち、だれが勝利するかを表示するか求める、というものです。

ルールとしては
・最初にAがカードを引く
・引いたカードに応じて次にカードを引くプレイヤーが決まる(aならばA,bならばB、cならばCが次にカードを引く)
・自分のターンで次に引くカードがなければ勝利

該当のソースコード

C

1#include <stdio.h> 2 3char Sa[101], Sb[101], Sc[101]; 4int ai=0,bi=0,ci=0; 5 6void turn(char s[], int *i){ 7 8 if(s[*i]=='a'){ 9 ai++; 10 turn(Sa, &ai); 11 }else if(s[*i]=='b'){ 12 bi++; 13 turn(Sb, &bi); 14 }else if(s[*i]=='c'){ 15 ci++; 16 turn(Sc, &ci); 17 }else if(s[*i]=='\0'){ 18 if(s==Sa) { 19 puts("A"); 20 } else if(s==Sb){ 21 puts("B"); 22 } else if(s==Sc){ 23 puts("C"); 24 } 25 } 26 27} 28 29int main(void){ 30 31 scanf("%s",Sa); 32 scanf("%s",Sb); 33 scanf("%s",Sc); 34 35 turn(Sa, &ai); 36 37 return 0; 38 39}

お知らせ

正解のソースコードなどもご教示いただきましたが、
結局、自分が作成した元のソースコードの何が拙いか自分の力では究明できなさそうなので、
しばらく間をおいてから再チャレンジしてみたいと思います。

ためしてみたこと

・printfを挟んで問題となりそうなところの切り分け
・ステップ確認は利用エディタ(VS code)のデバッグ機能の使い方がよくわからなかったため、こちらも暫定的に放棄しております・・・

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

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

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

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

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

Zuishin

2020/04/20 16:40

最初に A さんが出すカードが c だった場合、A さんがそのカードを捨てなければいけませんが、C さんが捨てていませんか?
jimbe

2020/04/20 19:58

ai++ 等の所は *i を増加ということですね.
Zuishin

2020/04/20 23:20 編集

そうなりますね。ai++ は A さんが捨てる、bi++ は B さんが捨てるという意味になると思います。 今回のような複雑な動きをする場合、テストケース作成は手間がかかり、いくつも作れません。せっかく作ったテストケースをたまたまパスするようでは本末転倒(適当なプログラムでも 1/3 という結構な高確率で正解になります)ですし、正しく動くプログラムがまだ存在しない以上、テストケースと期待する出力自体にバグが混入することも考えられます。 ステップ実行、または printf デバッグで、途中経過がどこまで正しいかをチェックする方が早いと思います。 ただし printf デバッグはソースをいじるので、それ自体がバグを発生させることもあります。ステップ実行がおすすめです。
guest

回答2

0

回答にはなるのかどうか, こんな感じ.

c

1#include <stdio.h> 2 3#define N 3 /*人数*/ 4#define M 100 /*最大枚数*/ 5#define C 'a' /*カード(オフセット)*/ 6#define P 'A' /*参加者(オフセット)*/ 7 8int main(int argc, char *argv[]) { 9 int i, top[N]={0}; 10 char card, S[N][M+1]; 11 12 for(i=0;i<N;i++) scanf("%s", S[i]); 13 14 card = C; 15 do { 16 i = card - C; 17 card = S[i][top[i]++]; 18 } while(card != '\0'); 19 printf("%c\n", i + P); 20}

do-while は for に纏めれば小さくなりますね.

c

1#include <stdio.h> 2 3#define N 3 /*人数*/ 4#define M 100 /*最大枚数*/ 5#define C 'a' /*カード(オフセット)*/ 6#define P 'A' /*参加者(オフセット)*/ 7 8int main(int argc, char *argv[]) { 9 int i, top[N]={0}; 10 char card, S[N][M+1]; 11 //入力 12 for(i=0;i<N;i++) scanf("%s", S[i]); 13 //勝負 14 for(card=C; card!='\0'; card=S[i][top[i]++]) i = card - C; 15 //出力 16 printf("%c\n", i + P); 17} 18

投稿2020/04/20 19:24

編集2020/04/21 12:30
jimbe

総合スコア13170

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

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

jimbe

2020/04/20 19:32

回答してからご質問のコードを見て, 再帰していてビックリです... カードa/b/c では扱い難いですので, 0/1/2と数値化して配列のインデックスにしますと, if 判断しなくて済みます.
omologic

2020/04/21 08:08

サンプルコードの作成ありがとうございます。 再帰はあまり好ましくないという情報を見たことがあるので、やはり控えた方がよろしいでしょうか? 逆に再帰以外の方法が思いつかず、コードを提示いただき助かりました。
jimbe

2020/04/21 08:27

一概に控えたほうがというのも違うとは思います. 要は適材適所ですし, 多少は作者の嗜好が入る余地もあるかもしれませんので... その意味で私は再帰よりはループを先ず考えますのでこのようなコードになりましたし, omologic さんはご質問のコードを作られたというだけで, ビックリと言うのは私が考えなかった方法だったという感想でした.
guest

0

テストケース作成の思考過程についてご教示いただければ大変ありがたいです。

ホワイトボックステストとブラックボックステストを考えます。

ホワイトボックステストは、全部の分岐が期待通りに通るかどうか確認できるテストですね。
ここでいうと
a
a
a
とか
b
b
b
みたいなパラメータの与え方です。

ブラックボックステストでは仕様として渡すパラメータの範囲や組み合わせを振って仕様通りか確認するテストです。
ここでいう仕様はリンク先の制約を満たしたり、与えられた入力で期待した出力が出るかどうかの確認ですね。
実際にテストを考える場合は同値分析や境界値分析などの考え方でテストパラメータを考えます。

どこに問題があるのか見当がつかず、バグの修正が出来ない状況です

if(s==Sa)
じゃなくて
if(s[*i] == Sa[*i])
だと思うのですが。

投稿2020/04/20 16:24

編集2020/04/20 16:26
TaroToyotomi

総合スコア1430

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問