• 締切済み

数値が登録済みの場合エラーで再入力させる

はじめまして。どうしても課題のプログラムができません。教えてください。 個人番号、名前で構成される構造体を作成。7人分データを入力し、出力するプログラムです。サブ関数を使って一件分のデータを入力、メイン関数で人数分のカウンタ、データの出力。 個人番号は、1-100までの数値で、同じ番号は登録できません。なので、範囲外の時、登録済みの番号がある時はそれぞれエラーメッセージを表示させます。 範囲外の数値の場合のエラーはできるのですが、同じ番号の場合のエラーメッセージが出せません。 #include<stdio.h> typedef struct person { int no; char name[20]; }Member; void input_data(Member *,int); /*入力用の関数*/ int main(void) { int cnt; Member member[7]; /*構造体の配列*/ for(cnt-0;cnt<7;cnt++)/*件数分カウンタをまわす*/ {input_data(&member[cnt],cnt);} ~データを表示させる~ return 0;} void int_data(Member *imem,i_cnt) { while(1){ printf("学籍番号入力: "); scanf("%d",&imem->no); if(imem->no >=1&&imem->no <=100); {break;} printf("1~100の番号を入れてください"); } while(1) ~名前の入力~ return;} 考え方としては数字が適切な範囲内の時、登録済み番号でないか調べる。imemからforでマイナスしていって、登録済みか調べる。という制御文にしなくてはなりません。教えてください。

noname#20936
noname#20936

みんなの回答

noname#71195
noname#71195
回答No.3

削除対象な気がしますが、とりあえず回答だけ書いておきます。できるだけもとの形を残した上で要望に添うようにしました。 int i; while(1){ printf("学籍番号入力: "); scanf(" %d",&imem->no); if(imem->no >=1&&imem->no <=100){ for(i=-1;i>=-cnt;i--)if(imem[i].no == imem->no)break; if(i == -cnt-1)break; printf("番号が重複しています"); } else printf("1~100の番号を入れてください"); }

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

参考URLのサイトは丸投げOKです。 そちらに投稿されてみてはいかがでしょうか。

参考URL:
http://l.huu.cc/
  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.1

一応読んでみましたが、 >void input_data(Member *,int); /*入力用の関数*/ >void int_data(Member *imem,i_cnt) ここは関数名から違うし、 >imemからforでマイナスしていって、登録済みか調べる。という制御文にしなくてはなりません。 って書いて有るなら、その通りサブルーチン(input_data?int_data?)の中のfor()文コーディングしてください。 課題の回答そのまま求めてるんだったら、作成依頼目的の禁止事項ですよ。

関連するQ&A

  • アスタリスクで正方形

    アスタリスク(*)で正方形を作るプログラムをC言語で書いているのですが関数で描画部分を作ることが出来ません。動かす方法を教えて頂けないでしょうか #include <stdio.h> void seihoukei(void); int no,i,j,cnt; int main(void) { int cnt,i,j; do{ printf("数字(2-9)を入力して下さい:"); scanf("%d",&cnt); if(cnt<2||cnt>9){ printf("入力エラーです。もう一度入力して下さい"); } }while(cnt<2||cnt>9); for(i=1;i<cnt;i++){ for(j=1;j<=cnt;j++){ seihoukei(); } } return 0; } void seihoukei(void) { j = 1; while(j <= j){ putchar('*'); j=j+1; } putchar('\n'); }

  • fatal error LNK1120: 外部参照 1 が未解決です

    またわからないことが・・・ 教えて下さい。 以下をVC++2005でコンパイルすると、 MSVCRTD.lib(crtexew.obj) : error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。 C:\Documents and Settings\tomato\My Documents\Visual Studio 2005\Projects\a\Debug\a.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と警告がでて通りません。 何のことでしょうか。 #include<stdio.h> #include<process.h> struct meibo{   char name[20];   char tel[20];   char address[20]; }; void message( void ); void input( FILE *fp, int cnt , struct meibo *a, int *end ); void main( void ) {   struct meibo a[20];   FILE *fp;   int cnt, end;   if( (fp=fopen( "meibo.dat", "w" ) ) == NULL ){     printf( "Can not open the meibo.dat.\n" );     exit( 1 );   }   message();   fprintf( fp, "番号, 名前, TEL, 住所\n" );   fflush( fp );   cnt = 0;   end = 0;   while( end == 0 ){     input( fp, cnt, &a[cnt], &end );     cnt++;     fflush( fp );     if( cnt == 20 ){       printf( "人数が一杯です.終了します.\n" );       end = 1;     }   }   fclose( fp ); } void message( void ) {   printf( "名前, TEL, 住所, endを入力してください.\n" );   printf( "継続の時はend=0," );   printf( "中止の時は,end=1と入力してください.\n" ); } void input( FILE *fp, int cnt, struct meibo *a, int *end ) {   printf( "名前-->" );   scanf( "%s", a->name );   printf( "TEL -->" );   scanf( "%s", a->tel );   printf( "住所-->" );   scanf( "%s", a->address );   printf( "Exit? Continue:0 Exit:1 -->" );   scanf( "%d", end );   printf( "\n" );   fprintf( fp, "%2d, %s, %s, %s\n",     cnt+1, a->name, a->tel, a->address ); }

  • 文字の数値化 関数化

    文字を入力されたとき、数値入力を促す関数を作りたいのですが、 最初の文字が文字ならエラーメッセージがちゃんと出るのですが、 最初の文字が数字ならエラーメッセージが出てくれません。 アドバイスお願いいたします。 tew2 ← エラー出る 2test ← エラー出ない #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> float ss_input(void); int main(){ int i; int pop; printf("何人の入力しますか(3人以内)->"); do{ pop=ss_input(); if(pop >3) printf("3人以内でお願いします\n"); }while(pop<1 || pop>3); return 0; } float ss_input(void){ char p[100]; float st; int i=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("数値を入力してください->"); scanf("%s",p); continue; } else{ break; } } st=atof(p); return st; }

  • C言語のプログラム組んだのですが完成させてください

    C言語のプログラムを断片的に作成したのでつなげて完成させて頂けないでしょうか? このサイトでコンパイルなど出来ます http://ideone.com/ 以下の問題を解きました また問題文の指示には必ずしたがってください。また、この文章の条件でなく、人数が4人とかそれ以外の時でも出来るようなプログラムでお願いします。 http://i.imgur.com/nuzJv2v.png http://i.imgur.com/c7f3Vh2.png http://i.imgur.com/5aCqDO0.png http://i.imgur.com/9u8hHIM.png 問題は画像になっています #include<stdio.h> #include<string.h> /*構造体型struct Dataの宣言*/ struct Data{ char name[20]; int height; double weight; } data[100]; int cnt; int main(void) { int a; do { printf("**************身長・体重の表示***************\n\n"); printf(" データファイルの読み込み・・・・・(1)\n"); printf(" 全てのデータを表示・・・・・・・・(2)\n"); printf(" 特定のデータを表示・・・・・・・・(3)\n"); printf(" 終わり・・・・・・・・・・・・・・(4)\n\n"); printf("処理番号を入力してください\n"); scanf("%d",&a); } while(a<1 || a>4); return a; } /*read_file関数の宣言*/ int read_file(void) { FILE *fp; char filename[20]; cnt=0; printf("読み込むファイルの名前を入力してください。\n"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } while(fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight)!=EOF){ cnt++; fclose(fp); printf("ファイルを読み込みました。\n"); } return 0; } /*p_all関数の宣言*/ int p_all(void) { int i; printf("名前 身長(cm) 体重(kg)\n"); for(i=0;i<cnt;i++) { printf("%-2s %5d %.2f\n",data[i].name,data[i].height,data[i].weight); } } 最初の処理番号を入力した所で終わってしまいます、何とか改変してくださいお願いします 補足

  • 数値の連続入力終了条件について

    C言語初心者です。よろしくお願いします。 早速質問なのですが、while文を使ったscanf()関数による数値連続入力で、 ◎1---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;      while(scanf("%lf",&dt) !=EOF){   sum=sum+dt; }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎1のようにすれば、Ctrl+ZでEOFが返されたら終了とわかるのですが、今度は「0」が入力されたら処理を終了するというプログラムで、 ◎2---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;      while(scanf("%lf",&dt) !=0.0){   sum=sum+dt; }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎2のようにすると「0」が入力されても、終了せず、以下に示す◎3のように、しないと終了出来ません。 ◎3---------------------------------------------- #include<stdio.h> int main(void) {      double dt,sum=0.0;          scanf("%lf",&dt);      while(dt!=0.0){   sum=sum+dt; scanf("%lf",&dt); }   printf("合計=%f\n",sum); return 0; } ---------------------------------------------- ◎2で何故、◎1のように出来ず、◎3のようなscanf()を1回目、2回目と判定を入れなければならないか教えて下さい。

  • C言語のユーザ関数の問題の質問です。

    以下のような実行結果が得られるプログラムを作りたいのですが・・・。 数値入力==>3 数値入力==>5 数値入力==>1 数値入力==>2 数値入力==>4 数値入力==>-1 合計:15 ←メイン関数で表示。 int dat[10]; ←main関数で定義。 実際に作ってみました。 #include <stdio.h> int MyArraySum(int cnt,int *pt); void main(void) { int dat[10],gokei,indat; int i; printf("数値入力==>"); scanf("%d",&indat); gokei=0; while(indat!=-1 && indat<11) { printf("数値入力==>"); scanf("%d",&indat); } MyArraySum(indat,dat); printf("合計:%d\n",gokei); return; } int MyArraySum(int cnt,int *pt) { int gokei; gokei=cnt+*pt; return gokei; } どうやっても、合計が0になってしまいます。 ご教授お願いいたします。 ちなみにアドレス渡しでやることが条件なので*使ってます。

  • 自己参照型構造体2

    いつも世話になります。 以前、自己参照型構造体について質問しました。 そのときは、Free関数についてでしたが、 今度は、関数についてです。 プログラム自体は、単純なのですが、 1)メイン関数内に、while(1){switch(){case...}} 2)[case 1]入力[case 2]表示[case 3]ファイル保存[case 4]ファイル読込[case 5]終了 関数化せずに、メイン関数内に記述をしましたら、 動作に問題はなかったです。 これを、関数化するとエラー(異常な動作)になります。 void inputdata(data *dat,int *cnt); void outputdata(data *start,int cnt); のようにしていますが、うまく関数化できる方法はありますでしょうか? よろしくお願いします。

  • Cのプログラムを修正、追加してくれませんか?

    C言語のプログラムを修正、追加してください このサイトでコンパイルなど出来ます http://ideone.com/ 以下の問題を解きました また問題文の指示には必ずしたがってください。また、この文章の条件でなく、人数が4人とかそれ以外の時でも出来るようなプログラムでお願いします。 http://i.imgur.com/nuzJv2v.png http://i.imgur.com/c7f3Vh2.png http://i.imgur.com/5aCqDO0.png http://i.imgur.com/9u8hHIM.png 問題は画像になっています #include<stdio.h> #include<string.h> /*構造体型struct Dataの宣言*/ struct Data{ char name[20]; int height; double weight; } data[100]; int cnt; int main(void) { int a; do { printf("**************身長・体重の表示***************\n\n"); printf(" データファイルの読み込み・・・・・(1)\n"); printf(" 全てのデータを表示・・・・・・・・(2)\n"); printf(" 特定のデータを表示・・・・・・・・(3)\n"); printf(" 終わり・・・・・・・・・・・・・・(4)\n\n"); printf("処理番号を入力してください\n"); scanf("%d",&a); } while(a<1 || a>4); return a; } /*read_file関数の宣言*/ int read_file(void) { FILE *fp; char filename[20]; cnt=0; printf("読み込むファイルの名前を入力してください。\n"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } while(fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight)!=EOF){ cnt++; fclose(fp); printf("ファイルを読み込みました。\n"); } return 0; } /*p_all関数の宣言*/ int p_all(void) { int i; printf("名前 身長(cm) 体重(kg)\n"); for(i=0;i<cnt;i++) { printf("%-2s %5d %.2f\n",data[i].name,data[i].height,data[i].weight); } } このプログラムを while(;;); //1,2,3の場合を場合分け if ( a == 4){ return 0; //終わり } } こうすれば終わりません。 ファイルの読み込みread_all関数はa == 1の場合、 全件読み込みp_all関数ははa==2の場合に実行すればいいのではないでしょうか。 3名前を指定して実行は、p_allを拡張して、ループの中に名前を調べる判定文を追加し、 一致した名前のデータを出力する。 この文章に当てはまるように修正していただき、正しく動作するようにして頂けないでしょうか、よろしくお願いします

  • C++ なのですがエラーが消えません

    課題のC++プログラムのエラーが消えません,教えてください. 10個の数値を入力し並び替えるプログラムなのですが並び替え部分以外は先生作成のプログラムです. どうかお願いいたします. #include <stdio.h> #define MAX 10 #define OK 0 void inputnum(int num[]); void sortnum(int num[]); void outputnum(int num[]); main(){ int num[MAX]; printf("番号 氏名\n"); inputnum(num); sortnum(num); outputnum(num); return(OK); } void inputnum(int num[]){ int i; for(i=0;i<MAX;i++,num[i]){ printf("数値%d = ", i+1); scanf("%d",&num[i]); } printf("数値入力完了\n"); } void sortnum(int num[]){ int tmp,p,q; for(p = 0; p < 9; p++){ for(q = p + 1; q < 10; q++){ if(num[p] > num[q]){ tmp = num[p]; num[p] = num[q]; num[q] = tmp; } } } printf("並び替え完了\n"); void outputnum(int num[]){ int i; for(i=0;i<MAX;i++){ printf("数値%d = %d\n",i+1,num[i]); } printf("数値出力完了\n"); }; [エラー  Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 1142122.c: エラー E2140 1142122.c 46: ここでは宣言はできない(関数 sortnum ) エラー E2141 1142122.c 46: 宣言の構文エラー(関数 sortnum ) エラー E2134 1142122.c 54: 複合文に } がない(関数 sortnum ) *** 3 errors in Compile ***]

  • reallocでうまくメモリを拡張出来ていない?気がしますが・・・

    OS:WindowsXP SP3 コンパイラ:Visual C++ 2008Express Edition with Service Pack 1 質問なんですが、 ttp://homepage3.nifty.com/mmgames/c_guide/ ↑こちらの練習問題19の3-1なんですが、4人以上のデータを入力して showdata関数で表示させると4人目からのデータが入力したデータと 違います。 (reallocのところが間違っているような気がするのですが?です) どなたかアドバイスお願いします。 他の問題点も良ければアドバイス頂けると幸いです。 *******************以下自分で書いたソース******************** #include <stdio.h> #include <stdlib.h> //構造体 typedef struct { char name[64]; int age; int sex; } stat; //プロトタイプ宣言 int status(stat * ,int *); void showdata(stat *, int); int main() { int cnt, max = 3; //構造体ポインタの宣言 stat *data; //動的配列の宣言 data = (stat *)malloc(sizeof(stat) * max); if ( data == NULL ) { exit(0); } //入力用関数の呼び出し cnt = status(data, &max); //出力用関数の呼び出し showdata(data, cnt); //メモリの開放 free(data); return 0; } int status(stat *data, int *max) { int i = 0; //年齢に-1が入力されるまでループ do { if ( (i + 1) > (*max) ) { *max += 10; data = (stat *)realloc(data, sizeof(stat) * (*max) ); if ( data == NULL ) { exit(0); } } printf("名前入力:"); scanf("%63s", data[i].name); getchar(); fflush(stdin); printf("年齢入力(-1入力で入力終了):"); scanf("%d", &data[i].age); getchar(); //1か2でない場合再入力 do { printf("性別を入力(1.男性 2.女性) <1 or 2>:"); scanf("%d", &data[i].sex); getchar(); if ( (data[i].sex < 1) || (data[i].sex > 2) ) { data[i].sex = 3; printf("1か2で入力してください\n"); } } while ( (data[i].sex) == 3 ); i++; } while ( (data[i-1].age) != -1 ); return i - 1; } void showdata(stat *data, int cnt) { int i; for ( i = 0; i < cnt; i++ ) { printf("\n%d人目のデータ\n", i + 1); printf("名前:%s\n", data[i].name); printf("年齢:%d\n", data[i].age); if ( data[i].sex == 1 ) { printf("性別:男性\n"); } else { printf("性別:女性\n"); } } return; }