問題集について

このQ&Aのポイント
  • ある問題集でtargetとnumが合っているまで繰り返すプログラムについて
  • プログラムが永遠に終わらない原因について
  • 必要な補足がある場合の対処法について
回答を見る
  • ベストアンサー

問題集について

ある問題集で targetとnumが合っているまで繰り返すプログラム何ですけど、 voidGuessNumber() { char target[5]; char num[5]; int count =0; createRandNumber(target) do{ printf(%d回目各桁が異なる%dけたの数を入力してください:,++count,5) scanf("%4d",num); while(isValidNumber(num)==FALSE); { printf(入力が正しくありません、再度入力してください:); scanf("%4d",num); } }while(isMatch(target,num)==FALSE); } int isValidNumber(char num[]) 機能:文字列numの各文字がすべて異なる数字の時TRUE,それ以外のときFALSEを返す。 int isMatch(char target[],char num[]) 機能:targetとnumの文字数があっているときTRUEそれ以外FALSE 何ですけど、これだと永遠に終わらないような気がするのですが、これは間違いなのかなと思うんですけどどうでしょうか?なにか足りないところがあったら補足しますのでよろしくお願いします。

  • 79562
  • お礼率68% (164/239)

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.6

No.4 です。 >なにか勘違いしているのでしょうか?  はい。 >isValideNumberI(num)ですべて異なる数字のときTRUEなのでこれでは、繰り返されて、  isValideNumberI() 関数は、taeget が引数となっていないことから、taeget の内容は判りません(←★重要)。  判るのは、引数で渡された num の内容、"1234" の'1', '2', '3', '4' が「すべて異なる数字」ということだけです。 これは、 >int isValidNumber(char num[]) >機能:文字列numの各文字がすべて異なる数字の時TRUE,それ以外のときFALSEを返す。     ↑↑↑↑↑↑↑↑↑  と、ご自分で書いています。

79562
質問者

お礼

回答ありがとうございます。ということは、例えばnumが”1124”の場合はFALSEにるということでしょうか?確認よろしくお願いします。

その他の回答 (5)

  • chie65535
  • ベストアンサー率43% (8514/19356)
回答No.5

ループの内側に scanf("%4d",num); が入ってて、ループするたびにnumの中身が変わる。 ループするたびにnumの中身が変わるのなら、必ずいつかは「ループを脱出する条件に合うnum」になる筈。 >間違いなのかなと思うんですけどどうでしょうか? 一番の間違いは「numは不変」と思い込んでしまった事。 とはいえ「毎回、ループを脱出する条件に合わない数値を入力し続け、ループを脱出する条件に合う数値を絶対に入力しない」って事をすれば、質問者さんの言う通り「永久に終らない」だろうけど。

79562
質問者

お礼

回答ありがとうございます。例えば、taegetで”1234”ができて、入力で ”1234”と入力したとしてもisValideNumberI(num)ですべて異なる数字のときTRUEなのでこれでは繰り返されて、"4567" を入力して外にでてもisMatch(target,num)で文字列が合わないので繰り返されてしまうので終わらないと思うのですが・・・なにか勘違いしているのでしょうか?あとscanf("%4d",num);は間違いでscanf("%4s",num);の間違いです。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

>int isValidNumber(char num[]) >機能:文字列numの各文字がすべて異なる数字の時TRUE,それ以外のときFALSEを返す。 >int isMatch(char target[],char num[]) >機能:targetとnumの文字数があっているときTRUEそれ以外FALSE 例えば、createRandNumber() で target に、"1234" ができて、入力で、"4567" とすれば、 共に4桁で、「文字数があっている」ので isMatch() は TRUE を返し、do while は終了するのでは。 #3 補足 >int isValidNumber(char num[])で文字列numの各文字がすべて異なる数字のときTRUEになってそこから出るので >int isMatch(char target[],char num[])で一生文字列が合わないことになりTRUEになることはないからです。  「文字『列』が合わない」とは、機能の変更でしょうか。「文字『数』が合うか否か」ではなかったのでは?。  たとえ「文字列が合うか否か」機能の場合でも、入力で、"1234" とすれば、TRUE になるかと。  具体的に、文字列を使って「補足」をお願いします。

79562
質問者

お礼

回答ありがとうございます。「文字列が合わない」の間違いです。taegetで”1234”ができて、入力で”1234”と入力したとしてもisValideNumberI(num)ですべて異なる数字のときTRUEなのでこれでは、繰り返されて、"4567"を入力して外にでてもisMatch(target,num)で文字列が合わないので繰り返されてしまうので終わらないと思うのですが・・・なにか勘違いしているのでしょうか?

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

isMatch(target,num)がTRUEを返したら終わります。 どういう理由で終わらないと思われたのでしょうか。

79562
質問者

お礼

回答ありがとうございます。int isValidNumber(char num[])で文字列numの各文字がすべて異なる数字のときTRUEになってそこから出るのでint isMatch(char target[],char num[])で一生文字列が合わないことになりTRUEになることはないからです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「永遠に終わらない」ような気がしたのはなぜでしょうか? まあ, それ以前に scanf がおかしいのでなんともなりませんが.

79562
質問者

お礼

すみません。scanf("%4d",num);はscanf("%4s",num)の間違いでした。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

提示されたコード(の断片)で、 do と while の数が異なっています。 そのため、提示されたコードの真実性に疑問が生じています。 せっかくですから、当該のコード「全体」を提示なさってはいかがでしょうか。

79562
質問者

お礼

回答有難うございます。コードが間違っていました。 正しくは voidGuessNumber() { char target[5]; char num[5]; int count =0; createRandNumber(target) do{ printf(%d回目各桁が異なる%dけたの数を入力してください:,++count,5) scanf("%4d",num); while(isValidNumber(num)==FALSE) { printf(入力が正しくありません、再度入力してください:); scanf("%4d",num); } }while(isMatch(target,num)==FALSE); } です。

79562
質問者

補足

全部のコードがこれです。

関連するQ&A

  • 4桁の英字の3桁目を当てるプログラム

    乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを 組もうとしているのですが、コンパイラしてもいまいちうまくいきません。 特に下に書いたプログラムのこの部分が違っていると思い どのように修正したらよいのか指摘していただきたいです。 human=getchar(); if(comp[2]!=human) { ero=1; } よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return 0; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } int main(void) { int num,val,i,j; char comp[21]; char human; int ero=0; int try_count=0; int seikai=0; clock_t start,end; int num1; char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; srand(time(NULL)); puts("英字記憶トレーニング"); do{ printf("挑戦するレベル(3~20):"); scanf("%d",&num1); }while(num1<3 || num1>20); printf("%d個の英字を記録しましょう。\n",num1); start=clock(); do{ for(i=0;i<num1;i++) { comp[i]=eiji[rand()%strlen(eiji)]; } comp[num1]='\0'; printf("%s",comp); fflush(stdout); sleep(125*num1); printf("\r%*s\r3番目の英字を入力してください:",num1,""); human=getchar(); if(comp[2]!=human) { ero=1; } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); } try_count++; }while(try_count<2); end=clock(); printf("%d回中%d回成功しました。\n",try_count,seikai); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • C言語初心者です。次の問題で質問です。

    (問題) 二つの整数値を読み込んで、小さい方の数以上で大きい方の数以下の整数を全て加えた値表示するプログラムを作成せよ。 (自分の解答) #include <stdio.h> int main(void) { int num1,num2; int sum=0; do { printf("整数1>整数2となる整数をそれぞれ入力してください\n"); printf("整数1:"); scanf("%d",&num1); printf("整数2:"); scanf("%d",&num2); if (num1 < num2) printf("整数1>整数2としてください\n"); } while (num1 < num2); printf("%d以上%d以下の全整数の和は",num2,num1); for (num2;num2 <= num1;num2++) { sum=sum+num2; } printf("%dです。",sum); return 0; } これでも一応正しく実行されるのですが、ごちゃごちゃしてるので簡潔に書けないでしょうか? 回答お願いします。

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }

  • 文字列の入力

    文字列(名前)と誕生日を読み込み、表示するプログラムです。文字列を読み込むときに空行を入力すると、読み込みを終了して表示するようにしたのですが、うまくいきません。読み込む時に使う関数が違うのだと思います。scanfとgets、fgetsは試したのですが、だめでした。 教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define DATA 3 int main() { char *name[DATA]; char work[31]; int month[DATA]; int day[DATA]; int count1,count2; printf("Data #1\n"); printf("name ="); fgets(work,31,stdin); for(count1=0;(work[0]!='\n')&&(count1<DATA);count1++){ printf("month ="); scanf("%d",&month[count1]); printf("day ="); scanf("%d",&day[count1]); name[count1]=(char *)malloc((strlen(work)+1)*sizeof(char)); strcpy(*(name+count1),work); printf("\n"); if(count1<DATA-1){ printf("Data #%d\n",count1+2); printf("name ="); fgets(work,31,stdin); } } for(count2=0;(count2<DATA)&&(count2<count1);count2++){ printf("Data #%d\n",count2+1); printf(" name: %s\n",*(name+count2)); printf(" birthday: %2d %2d\n",month[count2],day[count2]); } }

  • while文の作成について

    キーボードに整数を打ち込み、0を打ち込むと終了し、その合計を出すプログラムを以下のように作りました。 #include<stadio.h> int main(void){ int num=0 int sum=0 printf("整数を入力"\n"); do{ scanf("%d",&num); sum +=num; }while(num); printf("合計は%dです。\n",sum); returen 0; } 次に負の値が入力されるまで整数を読み込み続け、その合計をを求めるプログラムを作りたいのですが、whileのところを }while(num>=0); としてみたのですが、うまくいきません。また分かり易くするため、入力した整数の個数も表示できるようにしたいです。どうすればよいでしょうか。詳しい方、教えてください。

  • 複数条件でのカウント

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 //ファイル検索 main () { FILE *fp; //ファイルポインタ char filename[256]; //ファイル名 char key[128]; //検索文字列 char c; int keylen; //検索文字列の長さ int i = 0; //検索文字列の位置 int search = FALSE; //検索中フラグ int count = 0; //検索文字列出現回数 //検索対象ファイル名と検索文字列を決定 printf("ファイル名を入力してください > "); scanf ("%s", filename); printf("検索文字列 > "); scanf("%s", key); keylen = strlen(key); //ファイルオープン if((fp = fopen(filename, "r")) == NULL) { printf("ファイルオープンエラー\n"); exit(1); } //ファイル読み込み while((c = fgetc(fp)) != EOF){ if(search) { //検索中 //検索文字列に一致しない文字が現れた if(c !=key[i]) { search = FALSE; i = 0; } else { i++; } }else { //検索中ではない if(c == key[i]) { search = TRUE; i++; } } //検索文字列と全て一致した場合 if(keylen == i) { count++; i = 0; search = FALSE; } } fclose(fp); printf("出現回数 %d\n", count); return 0; } というものを作りましたが、検索文字列を二つ指定したい場合はコンパイルの画面でどのように入力すればいいのでしょう

  • シーザー暗号(C言語)

    シーザー暗号というものを作ろうとしていますが、文字のずらし方がわからず詰まっています。 手順は一応考えてあります。 (1)入力された文字を配列input[301]に代入 (2)何文字ずらすかを指定してその数値を変数countに代入 (3)入力された文字の長さを変数lenに代入 (4)inputとcountとlenを、文字をずらしてそれをoutputに返す関数shiftに渡す (5)outputを表示する のような感じですが、肝心の文字のずらし方がわかりません。 JISコードを使ってやるといいと聞いたんですが、そのやり方がわかりません。 ソース↓ #include <stdio.h> #include <string.h> int shift_char(char x[], int y, int z) { int i; for(i = 0; i <= z; i++) { x[i] = x[i] + y; } return x; } int main(int argc, char* argv[]) { char input[301]; char output[301]; int count, len, i; printf("文字を入力してください: "); scanf("%s" ,input); printf("何文字ずらしますか: "); scanf("%d" ,count); len = strlen(input); output = shift_char(input, count, len); for(i = 0; i <= len; i++) { printf("%s" ,output[i]); } return 0; } よろしくお願いします。

  • ポインタ配列の問題で、、。

    ポインタ配列の問題ですが、このmain関数でどこかがおかしいのですが、どこをどう変更すれば正常に動作するのかわかりません。どなたかお願いします(注)string入力文字は9文字以下です。 #include <stdio.h> #define NUM 5 main(void) {     char *str[NUM];     int i;     for(i = 0; i < NUM; i++)     {      printf("string ->"); scanf("%s", str[i]);      }      for(i = 0; i < NUM; i++)      {        printf("str[%d] -> %s\n", i, str[i]);      } }

  • またまたテストの復習なんですが・・・

    処理内容 基数、および変換対象数値(10進数)を入力させ、それに応じた基数変換を行う。その結果を画面に出力する。 ソースプログラム #include<stdio.h> #define MAX_OUT (16) int InputNum(int, int); char ChangeNum(int); /* メイン処理 */ main(){ int i; /* カウンタ */ int num; /* 対象数値 */ int num_base /* 基数 */ int num_next, num_out; char str[MAX_OUT]; /* 変換後文字格納用 */ while (1){ printf("基数を入力してください(2~32)\n"); printf("(2~32以外の入力で終了)\n"); num_base=InputNum(2,32); if (-1==num_base) { break; } printf("対象の数値を入力してください(0~65535)\n"); printf("(0~65535以外の入力で終了)\n"); num=InputNum(0,65535); if (-1==num) { break; } /* 変換開始 */ ( 1 ) for (i=0; i<MAX_OUT; i++){ /* 変換終了か判定する */ if (num_base>num_next){ /* 変換後文字の格納 */ str[i++]=ChangeNum(num_next); break; } /* 数値文字を抽出 */ num_out=( 2 ) str[i]=ChangeNum(num_out); /* 次の行へ */ num_next=( 3 ) } /* 変換結果を出力 */ printf("対象数値%dの%d進数表現は\n",num, num_base); for (i -= 1; 0<=i; i--) { printf("%c", str[i]); } printf("\nです\n"); } printf("終了します\n"); } /* 数値入力処理 */ int InputNum(int min, int max){ int ret; scanf("%d", &ret); if ((min>ret) || (max<ret)){ ret=-1; } return ret; } /* 数値を文字に変換 */ char ChargeNum(int num){ char ret=0; if (10>num){ ret=num+'0'; } else{ ret=( 4 )+'A'; } return ret; } という問題なんですが、(1)~(4)の答えと説明をどなたかして頂けないでしょうか?どうぞよろしくお願いします!ちなみにwhile(1)は無限ループです。

専門家に質問してみよう