No.2ベストアンサー
- 回答日時:
//実行例をそのままソースにしてみました。
#include <stdio.h>
int main(void)
{
int city=0;
printf(" どこに行きますか?\n");
printf(" 東京なら1、大阪なら2、名古屋なら3\n");
scanf("%d",&city);
switch(city)
{
case 1:printf("東京に到着しました\n");break;
case 2:printf("大阪に到着しました\n");break;
case 3:printf("名古屋に到着しました\n");break;
default:printf("指定外の数値です。\n");break;
}
printf(" 名古屋で降りる場合は4大阪に行くなら5\n");
scanf("%d",&city);
switch(city)
{
case 4:printf("お疲れ様でした\n");break;
case 5:printf("大阪に到着しました\n");break;
default:printf("指定外の数値です。\n");break;
}
return 0;
}
No.3
- 回答日時:
#1氏の言う通り、ですね。
基本的にプログラマってのは「キチンと仕様が確定しないと」書きたがらないんです。あるいは、書いたままその通りに実装しちゃう。
最近の質問だとこんなのありましたね。
7と入力したら画像のような図形が出力されるプログラムをループで組みたいです。 :
https://oshiete.goo.ne.jp/qa/9332485.html
これは恐らく、質問した人はこういうプログラムは欲しく無かったんじゃないでしょうか。
しかし、別にプログラマの人たちが意地悪してるわけじゃなくって、「書いたまま」、つまり仕様(と思わしきモノ)を見て実装するとこうならざるを得ないんです(実はコード見て爆笑してたんですが・笑)。
この問題の場合も、
・経路が分からない。
・東京、あるいは大阪にいる場合、どういう質問が出てくるか分からない。
等、不明な点が多いんですよね。
間違っちゃいけないんですが、「例を挙げる事」自体は良い事なんです。絶対動作例は挙げた方が良い。
かと言って、動作例「だけ」でもどーしよーも無いモノなんですね。
キチンと要求仕様を明確にしましょう。
明確じゃない仕様でプログラマにプログラミングさせようとすると、最近のみずほ銀行のニュースみたいな事になってしまいます。
【悲報】みずほ銀行の次期システム、デスマプロジェクトが破綻か。完成のメドなく4000億円がパー:
http://blog.livedoor.jp/itsoku/archives/49014907 …
みずほ銀行みたいにならないようにしましょう。
取り敢えず考えられる限りの条件付加で、やっつけでプログラミングしてみました。
・経路は東京->名古屋->大阪とする(逆はない)。
・東京、名古屋に於いては「次の駅に行くか」訊く。
・従って、必然的に大阪が終着駅となる。
/// ここから
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#define BUF_SIZE 128
#define LEAVE 4
#define GO 5
typedef struct station_tag {
char* name;
char* next;
} station;
int read(size_t n);
char* eval(int arg, int* f, station s[], size_t m, char** msg, size_t n);
int main(void) {
station stations[] = { { "東京", "名古屋"},
{ "大阪", "None" },
{ "名古屋", "大阪" } };
char* messages[] = { "どこに行きますか?\n",
"%sなら%d",
"%sに到着しました\n",
"%sで降りる場合は%d%sに行くなら%d",
"お疲れ様" };
int i = 0;
int flag = 1;
puts(messages[0]);
while (flag) {
printf(messages[1], stations[i].name, i+1);
if (i == sizeof(stations)/sizeof(stations[0]) - 1) {
printf("\n");
break;
}
printf("、");
i++;
}
while (flag)
puts(eval(read(sizeof(stations)/sizeof(stations[0])), &flag, stations, sizeof(stations)/sizeof(stations[0]), messages, sizeof(messages)/sizeof(messages[0])));
return 0;
}
int read(size_t n) {
static int mode;
int i;
static char buffer[BUF_SIZE];
fgets(buffer, BUF_SIZE, stdin);
i = atoi(buffer);
switch (mode) {
case 0:
if (i > 0 && i <= n) {
mode++;
return i;
} else
break;
case 1:
if (i == LEAVE || i == GO)
return i;
else
break;
}
return read(n);
}
char* eval(int arg, int* f, station s[], size_t m, char** msg, size_t n) {
static char str[BUF_SIZE] = {'\0'};
char str0[BUF_SIZE], str1[BUF_SIZE];
static int mode;
static char* next_station;
int i, k;
switch (mode) {
case 0:
mode++;
next_station = s[arg-1].next;
sprintf(str0, msg[2], s[arg-1].name);
if (strcmp(next_station, "None") == 0) {
*f = 0;
sprintf(str, "%s%s", str0, msg[n-1]);
break;
}
sprintf(str1, msg[3], s[arg-1].name, LEAVE, next_station, GO);
sprintf(str, "%s%s", str0, str1);
break;
case 1:
for (i = 0; i < m; i++) {
if (strcmp(next_station, s[i].name) == 0) {
next_station = s[i].next;
k = i;
}
}
sprintf(str0, msg[2], s[k].name);
if (arg == LEAVE) {
*f = 0;
sprintf(str, "%s", msg[n-1]);
} else if (strcmp(next_station, "None") == 0) {
*f = 0;
sprintf(str, "%s%s", str0, msg[n-1]);
break;
} else {
sprintf(str1, msg[3], s[k].name, LEAVE, next_station, GO);
sprintf(str, "%s%s", str0, str1);
break;
}
}
return str;
}
No.1
- 回答日時:
> どこに行きますか?
>
> 東京なら1、大阪なら2、名古屋なら3
> 3
> 名古屋に到着しました
> 名古屋で降りる場合は4大阪に行くなら5
> 4
> お疲れ様
例ではなく機能仕様をきちんと一般化して日本語でまとめましょう。
そして、それを実現するための処理手順を日本語で箇条書きにしましょう。
判断文のところは構造化(ネスト)させるとコーディングの際に分かりやすいでしょう。
フローチャートなどをご存じの場合はそれで記述されてもよいです。
それが出来ればあとはその日本語やチャート図をC言語に翻訳するだけです。
参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の入力した文字を反転させ...
-
バイナリファイルをコピーする...
-
型変換
-
CStringをwchar_tに変換したい
-
【C言語】文字型と整数型の違い
-
Linuxでフォルダ内全ファイル名...
-
charからLPTSTRへの変換方法
-
テキストデータをそのままバイ...
-
C言語 バイナリファイルをfloa...
-
charでの計算?
-
分割した単語の頻出頻度を表示...
-
fgetsなどのときのstdinのバッ...
-
英単語をアルファベット順に
-
ネットワークにつながっている...
-
atoi( ) の反対をやりたい
-
TCHAR文字列?の特定部分の数字...
-
enumの記述について。
-
プログラムを作成(c言語)
-
sprintfに同じ変数は使えるか
-
日付表示の方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
半角カナ→16進
-
double型の値をchar配列に変換...
-
sprintfに同じ変数は使えるか
-
ファイル名である文字列からbas...
-
ネットワークにつながっている...
-
ftoa の作り方
-
間接操作のレベルとは
-
型変換
-
C言語です
-
C言語のfor文です。 繰り返しの...
-
Win32APIでのエディットボック...
-
【C言語】文字型と整数型の違い
おすすめ情報