映画のエンドロール観る派?観ない派?

C言語です
複数ある質問が分岐するプログラムを作成して欲しいです

実行例
どこに行きますか?

東京なら1、大阪なら2、名古屋なら3
3
名古屋に到着しました
名古屋で降りる場合は4大阪に行くなら5
4
お疲れ様

A 回答 (3件)

//実行例をそのままソースにしてみました。


#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;
}
    • good
    • 0

#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;
}
「c言語です」の回答画像3
    • good
    • 0

> どこに行きますか?


>
> 東京なら1、大阪なら2、名古屋なら3
> 3
> 名古屋に到着しました
> 名古屋で降りる場合は4大阪に行くなら5
> 4
> お疲れ様

 例ではなく機能仕様をきちんと一般化して日本語でまとめましょう。
 そして、それを実現するための処理手順を日本語で箇条書きにしましょう。
 判断文のところは構造化(ネスト)させるとコーディングの際に分かりやすいでしょう。
 フローチャートなどをご存じの場合はそれで記述されてもよいです。
 それが出来ればあとはその日本語やチャート図をC言語に翻訳するだけです。

参考まで。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報