【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21745

エラーチェック(繰り返し)について
投稿者---ひかる(2005/07/01 12:36:41)


OS:XP
コンパイラ:C++

学生番号を入力するところで5桁の数字を入力すると、
もう一度入力してくださいと表示して、再入力したいのですが
どのようなプログラムを打てばよいか分かりません。
どなたか、教えてください。
※goto文はなしでお願いします。


#include <stdio.h>

typedef enum sei{MEN,WOMEN}sei;
typedef enum ti{A,B,O,AB}ti;

typedef struct Person{
    int mae;
    int usi;
    char na[30];
    char se[30];
    int tosi;

}Person;

void main(void)
{
    int i,n,m;
    sei s;
    ti t;
    Person data[5],*p;
    p=data;

    for(i=0;i<2;i++){
        printf("学生番号(前4桁)を入力してください\n");
        scanf("%d",&p->mae);
        if(p->mae>9999){
            printf("もう一度入力してください\n");
        }
        printf("学生番号(後4桁)を入力してください\n");
        scanf("%d",&p->usi);
        if(p->usi>9999){
            printf("もう一度入力してください\n");
        }
        printf("名を入力してください\n");
        scanf("%s",&data[i].na);
        printf("姓を入力してください\n");
        scanf("%s",&data[i].se);
        printf("性別を入力してください 0:男 1:女\n");
        scanf("%d",&s);
        printf("生年月日を入力してください\n");
        scanf("%d",&data[i].tosi);
        printf("血液型を入力してください 0:A 1:B 2:O 3:AB\n");
        scanf("%d",&t);
    }
    for(i=0;i<2;i++){
        printf("学生番号:%d%d\n",data[i].mae,data[i].usi);
        printf("名:%s\n",data[i].na);
        printf("姓:%s\n",data[i].se);
        switch(s){
            case 0: printf("男\n");break;
            case 1: printf("女\n");break;
        }
        printf("生年月日:%d\n",data[i].tosi);
        switch(t){
            case 0: printf("A\n");break;
            case 1: printf("B\n");break;
            case 2: printf("O\n");break;
            case 3: printf("AB\n");break;
        }
    }
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:エラーチェック(繰り返し)について 21748 まきじ 2005/07/01 12:51:33
<子記事> Re:エラーチェック(繰り返し)について 21749 Blue 2005/07/01 12:56:24
<子記事> Re:エラーチェック(繰り返し)について 21752 かずま 2005/07/02 14:10:28


No.21748

Re:エラーチェック(繰り返し)について
投稿者---まきじ(2005/07/01 12:51:33)


>学生番号を入力するところで5桁の数字を入力すると、
>もう一度入力してくださいと表示して、再入力したいのですが

do{・・・}while(no > 9999); でどうでしょうか?


この投稿にコメントする

削除パスワード

No.21749

Re:エラーチェック(繰り返し)について
投稿者---Blue(2005/07/01 12:56:24)


do〜whileやwhile文を使ってください。

# コンパイラは C++ とありますが、
# C++ は言語名なので コンパイラではありません。
# コンパイラは VC や bcc, gccなどのことを指します。



この投稿にコメントする

削除パスワード

No.21752

Re:エラーチェック(繰り返し)について
投稿者---かずま(2005/07/02 14:10:28)


    printf("学生番号(前4桁)を入力してください\n");
    for (;;) {
        char buf[256], c;
        if (!fgets(buf, sizeof buf, stdin)) exit(1);
        if (sscanf(buf, "%d %c", &p->mae, &c) == 1
            && p->mae >= 0 && p->mae <= 9999) break;
        printf("もう一度入力してください\n");
    }

12345
123-456
23.5
172cm
75kg
tanaka
これらを全部エラーにしますが、まだ何か足りないでしょうか?



この投稿にコメントする

削除パスワード

No.21753

Re:エラーチェック(繰り返し)について
投稿者---iijima(2005/07/02 16:43:47)


> これらを全部エラーにしますが、まだ何か足りないでしょうか?

01234
はどうなんでしょうね。

# 少々"茶々入れモード"で申し訳ありませんが、
# 仕様は厳密に示していただきたいです。>質問者様


この投稿にコメントする

削除パスワード

No.21760

Re:エラーチェック(繰り返し)について
投稿者---カンナ(2005/07/03 03:36:30)


>01234
>はどうなんでしょうね。

元ソースを見る限りではOKのように見えますね。
ただし自然に考えるならNGでしょう。

質問とは関係ないですが、
表示時には0埋め(%0d)しないと区別できない人が出てしまいますよ。
00010234と00120034とか。
その上で、入力と出力の対称性を保つためには(でないとユーザ視点で直感的でないので)、
4桁以外の入力(例:12など)は受理すべきではないと思います。
#まあ手習いのPGでそこまで考える必要はないかもしれませんが。


この投稿にコメントする

削除パスワード

No.21761

Re:エラーチェック(繰り返し)について
投稿者---ひかる(2005/07/03 18:23:00)


#include <stdio.h>

typedef enum sei{MEN,WOMEN}sei;
typedef enum ti{A,B,O,AB}ti;

typedef struct Person{
    int mae;
    int usi;
    char na[30];
    char se[30];
    int tosi;

}Person;

void main(void)
{
    int i;
    sei s;
    ti t;
    Person data[5],*p;
    p=data;

    for(i=0;i<2;i++){

        do{
             printf("学生番号(前4桁)を入力してください\n");
             scanf("%d",&p->mae);        
        }while(&p->mae > 10000);       

        do{
            printf("学生番号(後4桁)を入力してください\n");
            scanf("%d",&p->usi);        
        }while(&p->usi > 10000);

        printf("名を入力してください\n");
        scanf("%s",&data[i].na);
        printf("姓を入力してください\n");
        scanf("%s",&data[i].se);
        printf("性別を入力してください 0:男 1:女\n");
        scanf("%d",&s);
        printf("生年月日を入力してください\n");
        scanf("%d",&data[i].tosi);
        printf("血液型を入力してください 0:A 1:B 2:O 3:AB\n");
        scanf("%d",&t);
    }

    for(i=0;i<2;i++){
        printf("学生番号:%d",data[i].mae);
        printf("%d\n",data[i].usi);
        printf("名:%s\n",data[i].na);
        printf("姓:%s\n",data[i].se);
        switch(s){
            case 0: printf("男\n");break;
            case 1: printf("女\n");break;
        }
        printf("生年月日:%d\n",data[i].tosi);
        switch(t){
            case 0: printf("A\n");break;
            case 1: printf("B\n");break;
            case 2: printf("O\n");break;
            case 3: printf("AB\n");break;
        }
    }
}



みなさま質問にお答えいただき、有難うございました。
01234や0埋めに関してですが、そこまでしなくて良いと思います。
5桁以上の数字(10000以上の数字)を入力した時、再入力を求めたいプログラムですから。

また質問なのですが、
do-while文を入力したところ、9999以下、10000以上のどちらを入力しても学生番号(前4桁)を入力してくださいと表示されるのは何故でしょうか?

かずまさんのソースを入力したところ、0未満、10000以上を入力すると、ちゃんともう一度入力してくださいと表示されるのですが、0〜9999以内の数字を入力し、printfで学生番号が出力される時1回目の数字はちゃんと出力されるのですが、2回目の数字が-858993460-858993460と表示されるのですが、何故でしょうか?

エラーチェックではないのですが、性別、血液を入力すると1回目に入力したものが、2回目に入力した数字に上書きされるのですが、列挙型を配列やポインタに入力する方法がよく分かりません。
エラーチェックの質問ではないのですが、どなたかやり方を教えて下さい。




この投稿にコメントする

削除パスワード

No.21762

Re:エラーチェック(繰り返し)について
投稿者---まきじ(2005/07/03 19:06:28)


>do-while文を入力したところ、9999以下、10000以上のどちらを入力しても学生番号(前4桁)を入力してくださいと表示されるのは何故でしょうか?

p->mae と p->usi に & が付いているからだと思います。


この投稿にコメントする

削除パスワード

No.21770

Re:エラーチェック(繰り返し)について
投稿者---ひかる(2005/07/04 22:10:52)


&をはずすとちゃんとdo-while文が動きました。
まきじさん、有難うございました。

引き続き、残りの2つの質問の答えをどなたかお願いします。


この投稿にコメントする

削除パスワード

No.21771

Re:エラーチェック(繰り返し)について
投稿者---まきじ(2005/07/04 22:38:06)


>エラーチェックではないのですが、性別、血液を入力すると1回目に入力したものが、2回目に入力した数字に上書きされるのですが

>printf("性別を入力してください 0:男 1:女\n");
>scanf("%d",&s);
>printf("血液型を入力してください 0:A 1:B 2:O 3:AB\n");
>scanf("%d",&t);

同じ変数を使ってるからです。

s と t も Person に入れれば良いと思います。

あと、性別と血液型を列挙型にしてるのでいしたら、
switch 文で
case MEN:
case WOMEN:
な感じにしてはどうでしょうか?

生年月日は、int型で良いのですか?
変数が、tosi という事は、年齢?


この投稿にコメントする

削除パスワード

No.21772

Re:エラーチェック(繰り返し)について
投稿者---ぽへぇ(2005/07/04 23:52:54)


>printfで学生番号が出力される時1回目の数字はちゃんと
>出力されるのですが、2回目の数字が-858993460-858993460と
>表示されるのですが、何故でしょうか?

自分の書いたプログラムをよく読みましょう。
2回目の入力(学生番号)は何処に入っているのでしょうか。
p->mae
p->usi
は何処を指していますか?



この投稿にコメントする

削除パスワード

No.21773

Re:エラーチェック(繰り返し)について
投稿者---まきじ(2005/07/05 00:03:05)


>printf("名を入力してください\n");
>scanf("%s",&data[i].na);
>printf("姓を入力してください\n");
>scanf("%s",&data[i].se);

data[i].na と data[i].se は配列なので、& は要らないと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧