合計 昨日 今日

c言語和暦から西暦

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: puma
[URL]
Date: 2017年1月12日(木) 02:48
No: 1
(OFFLINE)

 c言語和暦から西暦

c言語で次のような実行例になるプログラムを作っています。
実行例
./a.out
Input Wareki: H29
Year: 2017
% ./a.out
Input Wareki: S52
Year: 1977
% ./a.out
Input Wareki: M21
Year: 1888

文字列をintがたの整数にして返す関数はできているのですがint main()の途中から話kらなくなってしまったので、教えてくださいお願いします。
条件は次のようになってます。
標準入力から和暦で H29(平成29年の場合)などと入力すると、それが西暦何年かを計算して表示するプログラムを作成しなさい。 入力は1文字目がアルファベットで H, S, T, M がそれぞれ平成、昭和、大正、明治を表しており、数字との間にスペースなどの区切りは無いため、ひと続きの文字列として読み込む。 文字列から数値への変換には問題1で作成した関数 myatoi をそのままコピーして使用し、main関数のみを新たに作成すること。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
#include <stdio.h>
int myatoi(char *);
int main()
{
  int a,i;
  char w[50];
printf("Input Wareki: ");
scanf("%49s",w);
 a=myatoi(w);
 
 
 
return 0;
}
int myatoi(char *p)
{
  int sign = 1;
int ret = 0;
 
/* スペースを読み飛ばす */
while (*p == ' ') p++;
 
/* 「-」「+」の処理 */
if (*p == '-') {
sign = -1;
p++;
} else if (*p == '+') {
p++;
}
 
/* 数字の読み取り */
for (;*p != '\0';p++) {
if (*p>='0' && *p<='9') {
ret *= 10;
ret += *p - '0';
} else {
break;
}
}
 
return ret * sign;
}





 



 

Name: box
[URL]
ハッカー(263,492 ポイント)
Date: 2017年1月12日(木) 07:58
No: 2
(OFFLINE)

 Re: c言語和暦から西暦

puma さんが書きました:文字列をintがたの整数にして返す関数はできているのですが

元号をローマ字表記したときの先頭文字からその元号が始まったり(あるいは終わったり)する西暦の取得は?

puma さんが書きました:標準入力から和暦で H29(平成29年の場合)などと入力すると、それが西暦何年かを計算して表示するプログラムを作成しなさい。 入力は1文字目がアルファベットで H, S, T, M がそれぞれ平成、昭和、大正、明治を表しており、数字との間にスペースなどの区切りは無いため、ひと続きの文字列として読み込む。 文字列から数値への変換には問題1で作成した関数 myatoi をそのままコピーして使用し、main関数のみを新たに作成すること。

そのままコピーっていっても、さすがに、先頭文字がHならば平成(西暦1989~)、Sならば昭和(西暦1926~1989)、Tならば大正(西暦1912~1926)、Mならば明治(西暦1968~1912)という
判断をする処理は必要でしょう。そう思いませんか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Name: box
[URL]
ハッカー(263,492 ポイント)
Date: 2017年1月12日(木) 08:05
No: 3
(OFFLINE)

 Re: c言語和暦から西暦

あと、仕様上問題になりそうなのは、M46とかT16とかS65とか、実際にはなかった年を入力したときにエラーとするのか
便宜上出力するのか(M46ならば1913、T16ならば1927、S65ならば1990)といったところでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Name: みけCAT
[URL]
伝説なるハッカー(675,552 ポイント)
Date: 2017年1月12日(木) 22:38
No: 4
(OFFLINE)

 Re: c言語和暦から西暦

box さんが書きました:
puma さんが書きました:文字列をintがたの整数にして返す関数はできているのですが

元号をローマ字表記したときの先頭文字からその元号が始まったり(あるいは終わったり)する西暦の取得は?

「main関数のみを新たに作成すること」なので、独立した関数にすることはできなそうですね。

box さんが書きました:そのままコピーっていっても、さすがに、先頭文字がHならば平成(西暦1989~)、Sならば昭和(西暦1926~1989)、Tならば大正(西暦1912~1926)、Mならば明治(西暦1968~1912)という
判断をする処理は必要でしょう。そう思いませんか?

その判断をする処理はmain関数に書けばいいでしょう。
何も制約がなければ別の関数にするべきかもしれませんが、「main関数のみを新たに作成すること」という条件があるので。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: box
[URL]
ハッカー(263,492 ポイント)
Date: 2017年1月13日(金) 01:05
No: 5
(OFFLINE)

 Re: c言語和暦から西暦

こんな感じ?
元のコードのインデントがあまりにグッチャングッチャンだったので自分なりに直しておきました。なお、
box さんが書きました:あと、仕様上問題になりそうなのは、M46とかT16とかS65とか、実際にはなかった年を入力したときにエラーとするのか
便宜上出力するのか(M46ならば1913、T16ならば1927、S65ならば1990)といったところでしょうか。

ここは後者の策を採りました。

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
 
int myatoi(char *p);
 
int main(void)
{
    int y, n;
    char w[50];
 
    printf("Input Wareki: ");
    scanf("%49s", w);
    switch (w[0]) {
    case 'H': case 'h':
        y = 1988;
        break;
    case 'S': case 's':
        y = 1925;
        break;
    case 'T': case 't':
        y = 1911;
        break;
    case 'M': case 'm':
        y = 1867;
        break;
    default:
        fprintf(stderr, "Invalid Gengou\n");
        return 1;
    }
    if ((n = myatoi(&w[1])) <= 0) {
        fprintf(stderr, "Invalid Year\n");
        return 1;
    }
    printf("Year: %d\n", y + n);
    return 0;
}
 
int myatoi(char *p)
{
    int sign = 1;
    int ret = 0;
 
    /* スペースを読み飛ばす */
    while (*p == ' ') p++;
 
    /* 「-」「+」の処理 */
    if (*p == '-') {
        sign = -1;
        p++;
    } else if (*p == '+') {
        p++;
    }
 
    /* 数字の読み取り */
    for (; *p != '\0'; p++) {
        if (*p >= '0' && *p <= '9') {
            ret *= 10;
            ret += *p - '0';
        } else {
            break;
        }
    }
    return ret * sign;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[23人]