• ベストアンサー

5桁の数字…

初めての質問でここでいいのかわかりませんが、教えてください。 5桁の数字が2つあり、それぞれa[1]…a[5]、b[1]…b[5]に格納する。 対応する桁どうし(a[1]とb[1])を比較して一致する桁の個数を求めるプログラムを擬似コードで表したいのです。 { 2つの桁の数を配列a,bに読み込む; count=0; i=i+1; while(i<=5) { if(a[i]==b[i])(??); else 誤ったデータの処理; } countの値を出力する; } ??の部分には何をいれればよいでしょう? また他のところでも間違いがあればご指摘お願いいたします。

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

  • ベストアンサー
  • maile
  • ベストアンサー率61% (19/31)
回答No.2

count++ または count=count+1 かと…。 現ロジックだとcountの値を出力したときに「0」。 countが加算されていないので。 それと i=i+1がwhileの外にあるのでiがカウントされないまま無限ループになるのでは?

asanta
質問者

お礼

的確で早い回答をありがとうございます。 無限ループにしないにはi=i+1はi=1に直すのでよいのでしょうか?

その他の回答 (5)

  • maile
  • ベストアンサー率61% (19/31)
回答No.6

>無限ループにしないにはi=i+1はi=1に直すのでよいのでしょうか? 残念ながらちょっと違います。というか惜しい。 ってことで、ヒントを。(自力で導き出した方が記憶にも残るだろうから…) i=1 は「iに1を代入(セット)する」です。これはそれまでiに何の値が入っていようともiは1となります。 asantaさんのロジックで 2行目: i=i+1 「iに1加算する」です。現行のiが何であろうと1を加えることになります。 3行目: while(i<=5){...} 「iが5以下の間、{...}の処理を繰り返す」 それではasantaさんのロジックで、iはどのタイミングでwhile文の条件から外れる(ループを抜ける)のでしょうか。 {...}の中でiは変化していますか? 上記とNo.2で書いたこと(countの加算)を加えれば、asantaさんの望んだ結果が得られると思います。 それと余談ですが。 今回のプログラムロジック、「n回処理を繰り返す」場合はwhile文ではなくfor文を使用するのが慣例ではないかと。 for文は()内に変数(今の場合はi)の初期値、ループ条件、変数の増減を書きます。(No.1の方が書いてますよね) for文の中に増減まであるので繰り返す処理の中に変数の増減を書く必要はありません。(特殊な場合を除き) これに対し、while文は「()内の条件の間、処理を繰り返す」場合に使用します。 ()内は色んな条件が設定できます。今回のようにiのカウントアップのこともあれば、繰り返し処理の中である変数が変化したときなど。 ただfor文と違い、while文は{...}内で()の条件に使った変数が変化するロジックがないと無限にループしてしまいます。 仕様によりどちらを使うか…もありますし、これ以外も存在します。 for文とwhile文、どちらも意味的には同じなような気もしますが、for文なら{...}内で変数が変化しない限り、()内を見ればループ回数も判断できますよね。 もちろんwihle文を使うことが間違いってワケではないです。他にもいろんな方法もあるってことで。 プログラムロジックは正解は1つじゃないですから。 とんでもないことをしていない限り、結果オーライなところもあるし(笑)そういうルールも存在しているくらいで頭の片隅にでも。 ってことで参考まで。 このプログラムに少し手を加えると一致した位置やその文字も結果として表示することも可能ですよねー。(どうでもいいか^^;)

noname#79209
noname#79209
回答No.5

#4です。 ゴメンナサイ。iの初期化が抜けてましたね。 { count=0; i=1; while(i<=5) { count=count+(a[i]==b[i]); i=i+1; } countの値を出力する; }

noname#79209
noname#79209
回答No.4

文法的に許されるのであれば、 count=0; while(i<=5) { count=count+(a[i]==b[i]); i=i+1; } countの値を出力する; }

  • condo
  • ベストアンサー率37% (37/98)
回答No.3

以下の問題があると思います。 ・iの初期値が決定されていないこと ・iのインクリメント(+1)がwhileループの外にあるので、いつまでたってもループを抜け出す条件に到達しない(つまり無限ループになる)こと  だから、i の初期値を設定し、i=i+1 を whileループの中に入れました。 { 2つの桁の数を配列a,bに読み込む; count=0; i=1; while(i<=5) { if(a[i]==b[i])(count=count+1); else 誤ったデータの処理; i=i+1; } countの値を出力する; }  こんなんでいいのかなぁ・・・  なお、i=i+1 は、else (if ~ else)の処理には含めていないつもりです。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

{ 2つの桁の数を配列a,bに読み込む; count=0; for(i=0; i<5; i++){ if(a[i] == b[i])count++; } countの値を出力する; } 目的にあっているかな?

asanta
質問者

お礼

回答ありがとうございます。 こちらのやり方も参考にさせていただきます。

関連するQ&A

  • 逆向きの数字を比較するぷろぐらむの一部

    コンピュータが任意に乱数で4ケタの数字を入力し、それを配列に 格納する。 そして、人間がその数字を逆向きに4ケタ、数字を配列に格納する。 というプログラムの一部を記載しました。 ところが、逆向きに入力してみてもうまく全て「間違いです。」 と表示されてしまいます。どこがおかしいか指摘していただきたいです。 よろしくお願いいたします。 do{ val=rand()%10; comp[0]=val; }while(comp[0]==0); for(i=1;i<4;i++) { do{ val=rand()%10; for(j=0;j<i;j++) { if(comp[j]==val) { break; } } }while(j<i); comp[i]=val; } for(i=0;i<4;i++) { printf("%d",comp[i]); } fflush(stdout); sleep(500); printf("\r入力せよ:"); scanf("%s",human); for(i=0;i<4;i++) { if(human[i]!=comp[3-i]) { ero=1; break; } } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); }

  • N桁の数字を順に表示したい

    例えば (1~9)までの数字を4つの変数(配列の1要素ずつでもいい) に分けて格納して、各変数の数字がダブらないようした 4桁の数字を順に表示するときって if( $a!=$b and $a!=$c and $a!=$d and $b!=$c and $b!=$d and $c!=$d ){ echo $a.$b.$c.$d."<br>" } すればいいと思うのですけど 数が多くなるとものすごく大変なので もっといい方法があるのではないかと思うのですが? ありますでしょうか?

    • ベストアンサー
    • PHP
  • if文の判定条件('||'と'&&'の使い方)

    ○if文の判定条件への理解が弱いため、下記プログラムを作成し、 疑問があったため、質問をしたいと思っております。 #include<stdio.h> #include<string.h> int main() { char moji[]= "A"; /***********************************************************/ if( 0 != strcmp( moji , "A" ) || strcmp( moji , "B" ) ) ^^(1) /***********************************************************/ { printf( "文字不一致" ); } else { printf( "文字一致" ); } return (0); } ○質問 「/*/」で囲ったif文の判定箇所になりますが、 この判定条件は"配列mojiに格納されている値が"A",または"B"以外の" ときに、画面上に「文字不一致」を出力します。そうでなければ 「文字一致」を出力します。 今回、配列mojiには"A"が格納されており、「文字一致」が画面に 出力されるはずですが、「文字不一致」が出力されてしまいます。 判定条件が誤っていると思い、色々と試したところ、(1)の箇所を 「&&」にしたときに、「文字不一致」が出力されます。 「||」(論理和)と「&&」(論理積)が理解できていないと思われ、 この部分を交えて、何故「&&」にしないと「画面不一致」と出力 されないのかを、ご教授の程お願い致します。

  • ファイルからの読み込みについて

    スペースで区切られた数字列を3つずつ取り、3つ目の数字列の最後の数字が奇数ならば1を、偶数ならば2を配列に格納するプログラムを作っているのですが、 具体例 203 255 254 203 255 255 203 255 254 203 255 254 203 255 254 203 255 255 203 255 255 203 255 255 203 255 254 203 255 255 とあれば、2,1,2,2,2,1,1,1,2,1と順に格納する プログラムの実行がうまくいかず悩んでいます。 関係する部分を書き出すと b = 0; n = 0; m = 0; while(1){ data = fgetc(fi); if(data == EOF) break; a[n] = data; if(' ' == a[n]){ b++; } if(b == 3){ b = 0; t = a[n-1]; n = 0; if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[m] = 1; } else{ c[m] = 2; } m++; } else n++; } となっているのですが、上に書いた数字列をfiに読み込んで実行し、配列cを出力してみたところ 2122222222となっていました。 改行前は正確に出力されているので、改行する部分でなにか不都合が起こっているのかなと思い、いろいろ考えたのですが解決しません。 どなたかよろしくお願いします。

  • 数字を入力して配列に格納するプログラムを書きたいです。

    各行任意個の数字をスペースで区切って入力し、格納する数字は10個までとします。また、/の入力以降は数字を格納せず、プログラムを終了するようにしたいです。 PrintNumは配列に格納された数字を順番に印字する関数として、次のプログラムを書くと、数字を入力するとき、2行目を入力しようとするとエラーになってしまいます。 char line[50]; char *ptr; int count=0; int numbers[50]; while(*ptr!='/'){ fgets(line,50,stdin); ptr = strtok(line," "); if(ptr!=NULL && *ptr!='/') numbers[count++]=atoi(ptr); if(count>=10){ PrintNum(numbers,count); return 0; } while(ptr!=NULL && *ptr!='/'){ ptr=strtok(NULL," "); if(ptr!=NULL && *ptr!='/') numbers[count++]=atoi(ptr); if(count>=10){ PrintNum(numbers,count); return 0; } } } PrintNum(numbers,count); return 0; 最初のwhile文でたとえば while(1) とすると2行目以降も入力できることがわかったのですが、上のプログラムは何がまずいのかわかりません。教えていただけると幸いです。

  • 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; }

  • 添削おねがいします。数字のマッチング

    書いてみましたが、うまく表現できません。 添削してもらえませんでしょうか。 ◆理想とする動作 1~50の数字を表示させる。 そのさい$bの配列内の数字と一致した時は  数字xはAとBで一致しています と表示させ、それ以外は  数字xは不一致です とし数字が50になるまで、どちらかの表記ですべて表示させる。 $a=range(1,50); $b=array(1,4,8,10,14,20,21); if ($a[]==$b[]){ echo "数字xはAとBで一致しています<br>"; }else{ echo "数字xは不一致です<br>"; } 動作例; 数字1はAとBで一致しています 数字2は不一致です 数字3は不一致です 数字4はAとBで一致しています 添削いただけないでしょうか。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • 文字列の中から1~5桁の数字を抜き出したい

    ある命令プログラムを作っているのですが、文字列の中に命令語を書いてその後に続く数字を抜き出したいのですがうまくいきません ソースを見ていただきたいのですが @ke の命令語の後で1~5桁の数字を記載しているのですが 数字の部分を文字から数字に変えたいのです。 その後 @ke 数字 を正式な命令文として扱いたいのですがソースを見ていただけるとわかると思いますが問題があります。 ・文字をatoiで数字に変換できない(キャスト演算子を変えてもだめだった) ・ソースのプログラムの書き方ではやたらと長々しくなってしまう。 どのようにしたら問題が解決できますか? ----以下ソース---- #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int main(){ char kei[100]="abc@ke 4567def@ke 789"; int i=0; int g=NULL; while(i<15){ if(kei[i]=='@'){ i++; if(strnicmp(&kei[i],"ke ",3)==0){ i+=3; //後に続く数字を抜き出して処理したい if(isdigit(kei[i])){ if(isdigit(kei[i+1])){ if(isdigit(kei[i+2])){ //・・・・以下全部で5桁分の数字を判定していく けど正直こんなややこしい方法をとらなくてもスマートにできるはず } else{ g=(atoi(kei[i])) * 10 +atoi(kei[i]); //型名が違うからatoiに入らないといわれる } } else{ g=atoi(kei[i]); //型名が違うからatoiに入らないといわれる } } else{ printf("\n命令の仕方が間違っています\n"); } } } else{ printf("%c",kei[i]); i++; } } return 0; }

  • 単純挿入ソートについて

    単純挿入ソートの『選択』、『交換』、『挿入』の回数を出力せよ。という課題が出されたのですが意味がよくわかりません。ちなみに課題前に次のような説明をされました。 『選択』は交換と挿入を行うため、キー値等の比較を行う判定処理 『交換』は選択の結果、2つのキー値の並び替え処理 『挿入』は選択の結果、キー値を決められた並び順の位置に格納する処理 また、『選択』を『比較』、『交換』と『挿入』を合わせて『交換』と言う事もある。 作ったプログラムはこれです。かなり違う気がするので指摘よろしくお願いします。 void insertion(int a[], int n) /* a[]:ソート対象データが格納されている配列 n:データの個数 */ { int i,j; int tmp; int count[3]; /* 配列番号 選択:0 交換:1 挿入:2 */ for(i=1;i<n;i++) { tmp=a[i]; count[1]++; /* 交換カウント */ for(j=i;(j>0)&&(a[j-1]>tmp);j--,count[0]+=2) /* 選択カウント */ { a[j]=a[j-1]; count[1]++; /* 交換カウント */ } if(j > 0) /* 選択カウント */ count[0]+=2; else count[0]++; a[j]=tmp; count[2]++; /* 挿入カウント */ } printf("選択の回数 : %4d\n", count[0]); printf("交換の回数 : %4d\n", count[1]); printf("挿入の回数 : %4d\n\n", count[2]); } テストデータ 60 57 54 51 48 45 42 39 36 33 30 27 24 21 18 15 12 9 6 3 実行結果 選択の回数 : 399 交換の回数 : 209 挿入の回数 : 19

  • リストデータの検索でのエラー表示について教えてください。

    検索するチェックボックスの配列データに、全て一致するデータを、 データファイルから取り出すコードで以下のようなエラーメッセージが 出ました。 どこが悪いのかわかりません、教えてください。 コード: if (@setubi_o){ my $count=0; for($i=0;$i<$#setubi_o+1;$i++){ if($setubi=~ /$setubi_o[$i]/ ){$count++;}else{next;} } if($count==$#setubi+1){;}else{next;} } エラーメッセージ(KCatch.pm) [estate.cgi:445:die] /シャワー/: unmatched [] in regexp. > if($setubi=~ /$setubi_o[$i]/ ){$count++;}else{next;}

    • ベストアンサー
    • Perl

専門家に質問してみよう