• ベストアンサー

配列の比較について・・・困ってます・・。

ご質問させていただきます。 これは、fin2というファイルから数値を抜き出し配列に格納して、finの文字列と比較し、その文字列のある場所で配列の数値と比較し、合致したら、ある出力をするというものなんですが、 配列に格納した数値が、 a[1]=[123] b=[234] a[1]=[345] b=[400] というふうに増えていくときは問題ないですが、途中でたとえば a[n]=100 b[n]=400 a[n+1]=300 b[n+1]=358 という風にn+1番目のaより、n番目のbが大きいときに、止まってしまうんです、これをうまく処理して最後まで比較させたいんですが、どうしてもうまくいきません。どなたかたすけてください。やはり、 n==b[yabu]の処理の後になんか書けばいいんでしょうか?長々と申し訳ございませんでした。 if(fin2!=NULL) { int yabu=0; for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++) { sscanf(c,"%d%*c%*c%d",&a[yabu],&b[yabu]); fprintf(fout2,"%d::::::::::::::%d:%d\n",yabu,a[yabu],b[yabu]); yabu++; } } int yabu=0; n=0; while(fgetc(fin)!=EOF) { n++; if(n==a[yabu]) { fprintf(fout2,"A "); } else if(n==b[yabu]) { fprintf(fout2,"B "); yabu++;} else {fprintf(fout2,"C "); } } printf("%d\n",yabu);

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

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.21

こんにちは。itohhといいます。 もし、固定で良いのでしたら、補足で書かれているように配列に持っておくほうが楽ですね。 char strData1[]={(char)0x90,           (char)0x3C,           (char)0x40,           (char)0x83,           (char)0x60,           (char)0x80,           (char)0x3C,           (char)0x00};    :    :    : fwrite( strData1, sizeof( char ), sizeof(strData1), fout2 ); strlen(strData1)では、最後の0x00を数えてくれません、ですからsizeof(strData1)ですね。 strData1を必要な分だけ用意しておくと良いのではないでしょうか。 strData2,strData3などなど。 こんなとこでしょうか?

kitapei
質問者

お礼

どうもありがとうございました。長期間にわたり回答寄せてくださってありがとうございました!!! おかげさまで、いろいろ勉強することができました!!また、わかんないことがでてきたらここで質問してべんきょうしていきたいと思います。 本当にありがとうございました!!

その他の回答 (20)

  • itohh
  • ベストアンサー率45% (210/459)
回答No.10

こんにちは。itohhといいます。 >一部データ中には途中で減少する箇所があるんです finファイルも全て読み込んでしまうことはできないのですか? 全て読み込んだ後ならば、簡単に出来ると思いますよ。 やっぱり、減少するところも含めて順番に出力したいのですよね? もし、順番は気にしないのでしたらば、fin2ファイルの配列をソート(並べ替え) した後にfinファイルと比較するという手もあります。 どちらもだめでしょうか?

kitapei
質問者

補足

御回答ありがとうございます。 全部読み込んでいくことはできるんですが、たとえば 130..344 500..600 700..999 800..850 みたいな感じで並んでるところがあったら、それ以降すべての出力がAのみに なっちゃうんです。  ifの処理をwhile()からはずして書くということなんでしょうか?

  • tgb
  • ベストアンサー率78% (32/41)
回答No.9

 うまく行ってよかったですね。  単調増加でない場合は一度”C”を出力してしまっている所に ”A”、”B”を出力することになるので、そう言うことを想定 しないと言うことです。  一度書き出した箇所に重ねて出力することも可能ですが、書き 出す前に全て見て調べておいて小さい順に並べた後出力すると言う ことも考えられます。処理は多少煩雑になると思います。

kitapei
質問者

お礼

御回答ありがとうございました。おかげさまでたすかりました!! あと、もう一歩です。 減少の時の謎さえとければ・・・・・。 がんばってみたいとおもいます。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.8

こんにちは。itohhといいます。 >fin2の配列の中の数字と比較したいのはfinの中の文字そのものというよりもその >finの中の文字が何番目かということを比較したいんです。 これは、finファイルの中から配列(fin2ファイル)の数値の位置のバイトを 抜き出したいのでしょうか? tgbさんの回答とだぶってしまうんですけど、else if文を使うことによって フラグ(k)を使わなくて良いですよ。 int n=0; yabuA=0; yabuB=0; data = fgetc(fin); for(n=0; feof(fin) == 0; n++ ) {  if( n == a[yabuA] )  {   fprintf(fout2,"A [%c]", data);   yabuA++;  }  else if( n == b[yabuB] )  {   fprintf(fout2,"B [%c]", data);   yabuB++;  }  else  {   fprintf(fout2,"C ");  }  data = fgetc(fin); }

kitapei
質問者

お礼

度々、お返事ありがとうございます。 フラグを使わない方法もやってみました!!なんか、使い慣れてないんで こっちの方がピンと来ます。両方わかればいいんですが・・・。 ところで、各々の配列が単調増加ならば問題ないんですが、一部データ中には途中で減少する箇所があるんです・・・・・。 その時って、if文の中にさらにif文を書いて・・・・みたいにやってみたんですが、エラーの嵐になってうまくいかないんです・・・。 こういう場合って非常に難しくなるんでしょうか?

  • tgb
  • ベストアンサー率78% (32/41)
回答No.7

itohhさんの指摘は私も疑問に思いました。 finからのデータについては 出力する文字A、B、Cの合計数をいくつにするかには寄与しますが finの文字データは全く使っていませんので、質問文の内容とは食い違います。 しかし、ANo.#4の補足から質問の内容が違っていたと理解されます。 行いたい処理をまとめますと fin2から読み込んだ数値データを 左側数値nl...その場所(nl文字目)にAを出力 右側数値nr...〃   (nr文字目)にBを出力 上の数値以外.............. Cを出力 となるのでしょうか。そうなら以下のように出来ると思いますが。 ただし、   a,bともそれぞれに単調に大きくなること、   a,bに共通する数値が入らないこと を前提します。 (今回問題になったaとbとの大小関係はクリアされる筈です) int yabuA=0,yabuB=0; int n=0; int k; while(fgetc(fin)!=EOF) { n++; k=1; if(n==a[yabuA]) { fprintf(fout2,"A "); yabuA++; k=0; } if(n==b[yabuB]) { fprintf(fout2,"B "); yabuB++; k=0; } if(k) fprintf(fout2,"C"); } 大変そうですが頑張ってください。

kitapei
質問者

お礼

御回答ありがとうございます。 これで、やってみたらうまくいきました。 フラグっていうのは使ったことないんでしたが、これを機にもっと 勉強してみようと思います!! ところで、これは各々が単調増加する場合でしたが、途中で aもしくはbが減少した場合は、だめですよね? 減少するという場合も考えられるんですが、その時は、 if(n==b[yabuB]) { } の中にさらに if文とかで、条件を分けて、b[yabuB-1]<b[yabuB]の時・・・ みたいにする事って可能なんでしょうか? かいてはみたもののエラーだらけになっちゃいます。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.6

こんにちは。itohhといいます。 >一文字ずつ読んでいくということはfin内のデータを使ってる >事となんらないんでしょうか? 以下のソースを見ると、fgetcで読み込んだ1バイトの値はどこに格納されるのでしょうか? if文で比較している値は、nとa[yabu]ですよね? nは単純に0から1づつ増えていくカウンタですよね? >while(fgetc(fin)!=EOF) >{ >n++; >if(n==a[yabu]) >{ >fprintf(fout2,"A "); >} もし、finファイルを読み込んで比較したいのなら char data; int yabu=0; int i=0; long a[100]. b[100];  for(i=0,yabu=0; fgets(c,CHARMAX,fin2)!=NULL;i++)  {   sscanf(c,"%d%*c%*c%d",&a[yabu],&b[yabu]);   fprintf(fout2,"%d::::::::::::::%d:%d\n",yabu,a[yabu],b[yabu]);   yabu++;  }  data = fgetc(fin);  while(feof(fin) == 0 ) {   // a,b配列と比較する   for(i=0; i<yabu; i++ ) {    if( data == a[i] )    {     fprintf(fout2,"A ");     break;    }    if( data == b[i] )    {     fprintf(fout2,"B ");     break;    }   }   // a,bにヒットしなかった場合   if( i == yabu )   {    fprintf(fout2,"C ");   }   data = fgetc(fin);  } こういうことが、やりたいことなのではないでしょうか? インデントするために全角スペースを行の先頭に入れています。

kitapei
質問者

補足

お返事ありがとうございます。 早速やってみました。これだとfinのデータそのものと比較することになりますよね? fin2の配列の中の数字と比較したいのはfinの中の文字そのものというよりもそのfinの中 の文字が何番目かということを比較したいんです。その場合もこういう風にするんでしょ うか?なんか実行結果がうまくいかないんで混乱してしまいました。何度も恐縮ですが教 えて頂けたら嬉しいです。

  • tgb
  • ベストアンサー率78% (32/41)
回答No.5

ANo.#3のtgbです。 申し訳ありません。余計なことなのですが、念のため補足 させていただきます。 a[]とb[]のそれぞれの比較を行うとき、if文で elseを使わないでください。つなぐと独立な処理に ならなくなります。(私の示した例ではelseは入れて いません)

kitapei
質問者

お礼

ありがとうございます。 if-elseは使わないんですね!? ありがとうございました!!!!!!!!!!!1

  • itohh
  • ベストアンサー率45% (210/459)
回答No.4

こんにちは。itohhといいます。 >そして、こんどはfinファイルを読みます。このfinは半角英字のみが延々と >かかれているファイルで、これを頭から一文字ずつ読んでいって、 >a[0]に格納された数値と一致したなら、 cout<<"A"の処理をし ここの処理がちょっと判らないのですが。 「finの1文字(半角英字)とa[0]に格納された数値を比較する」 と言うことは 「半角英字のasciiコードとa[0]に格納された数値を比較する」 という意味でしょうか? ソースを見る限り >if(n==a[yabu]) >{ >fprintf(fout2,"A "); >} a[yabu]に123が入っているとしたらn(カウンタ)が123までループしたらfprintf文 が実行されるとなっています。 もし、このままでいいのでしたらfinファイルを読み込む意味がないのではないでしょうか? finファイル内のデータをぜんぜん使っていませんよ。

kitapei
質問者

補足

御回答ありがとうございます。 基本的にはそういう処理をしていくんですが、そのfinに入っている、データ(半角英数字)は、4種類あるんですが、それぞれによって、出力を変えたいんです。 でも、一度に考えるとこんがらがるのでとりあえず、今のような書き方にしてるんです。 >finファイル内のデータをぜんぜん使っていませんよ。 一文字ずつ読んでいくということはfin内のデータを使ってる事となんらないんでしょうか?やっぱり、finファイルの存在自体は必要ですよね?

  • tgb
  • ベストアンサー率78% (32/41)
回答No.3

処理内容がよく分かっていないので的確な指摘かどうか分かりませんが、 a、bの参照用の変数yabuを独立にしてみたらいかがでしょうか? int yabuA=0,yabuB=0; int n=0; while(fgetc(fin)!=EOF) { n++; if(n==a[yabuA]) { fprintf(fout2,"A "); yabuA++; } if(n==b[yabuB]) { fprintf(fout2,"B "); yabuB++;} .......

kitapei
質問者

補足

御回答ありがとうございます。変数をわけてみればいいんですか・・・・。 早速、やってみたいと思います。 ありがとうございました!!!

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 すみません、一部ソースを読み違えました。 >まず、このソースはコンパイルエラーになりませんか? >>for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++) >fgetsの文法が間違っています。 わたしの勘違いでした、ごめんなさい。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.1

こんにちは。itohhといいます。 処理の内容がいまいち判らないのですが。 1.2つのファイルを読み込む。 2.1行の内容はa,bの2つの値が格納され複数行入っているので配列に格納する(fin2ファイル) 3.チェックしたい値が1行に1個入っている(finファイル) 4.3.の値を1つずつ2.の配列のaなのかbなのかをチェックしたい。 これでよいのでしょうか? まず、このソースはコンパイルエラーになりませんか? >for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++) fgetsの文法が間違っています。 >sscanf(c,"%d%*c%*c%d",&a[yabu],&b[yabu]); "%d%*c%*c%d"と&a[yabu],&b[yabu]の数があっていません。 fin2ファイルの中のフォーマットはどのようになっているのでしょうか? >while(fgetc(fin)!=EOF) fgetsの文法が間違っています。(読み込んだデータはどこに格納するのでしょうか?) 2つ目のループはfinファイルがEOFまでループしますが、 比較しているのはカウンタ(n)ですよね?これで良いのですか? finファイルのデータは関係ないのでしょうか?

kitapei
質問者

補足

御回答ありがとうございます。コンパイルエラーになりませんよね? びっくりしちゃいました(笑) 処理としては、 fin2ファイルは、 123..234 [英数字の羅列・・](改行) 300..434 [英数字](改行) 523..674 [英数字](改行) 800..934 [英数字](改行)・・・・・ みたいになってて、そこから数字だけをぬきだして、左の数字をa[yabu]に 右の数字をb[yabu]に格納します。 そして、こんどはfinファイルを読みます。このfinは半角英字のみが延々と かかれているファイルで、これを頭から一文字ずつ読んでいって、a[0]に格納された数値と一致したなら、 cout<<"A"の処理をして、・・・というふうにやっています。・・・・とこのままだとfin2の数値が、単純に増加していけば問題ないのですが、途中でb[n]の数字の方がつぎのa[n+1]よりも大きくなってしまった場合そこで止まっちゃうんです。 123..234 [英数字の羅列・・](改行) 300..434 [英数字](改行) 523..1002 [英数字](改行) 800..934 [英数字](改行)・・・・・ とかいうばあい、3行目で止まっちゃうんです。 いろいろ考えたんですが、なんとかここまではこぎつけたものの、こっから 先がわかんないんです・・・・・。 itohさんのお力をかしてください!!よろしくお願いいたします。

関連するQ&A

  • ファイルの入出力を行って文字を変換する

    入力するファイルにa~zを記入しておき、 出力するファイルにaなら1、bなら2、zなら26に変換させたいのですがどうしたらよいでしょうか? #include <stdio.h> #include <string.h> #define DELIMITER "/ ," /* 区切り文字 */ int main(void) { FILE *fin,*fout; int count=0; int i; char s[256], s2[256]; char alpha[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int kazu[]={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}; char *taken; char *strch[50]; if( (fin=fopen("file1.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s,256,fin)!=NULL) { while (token != NULL) { strch[count]=token; token = strtok(NULL, DELIMITER); count++; } memset(s2, NULL, sizeof(s2)); fprintf(fout,"%d\n",s2); } fclose(fin); fclose(fout); return 0; }

  • 配列

    適当な記述ですが、次を見てください。 void roll(int *c) { int n, b2[8]; if(t<3) { for(n=0; n<8; n++) b2[n]=c[n]; for(n=0; n<8; n++) c[b2[n]]=7-n; for(n=0; n<8; n++) printf("%d",c[n]); printf("\n"); t++; roll(c); } else t=0; } int main() { int b[]={3,6,4,0,7,2,5,1}; roll(b); for(n=0; n<8; n++) printf("%d",b[n]); //36407251が表示されるようにしたい。 return(0); } rollが何の関数かは省略しますが、rollにmainのb(ポインタ?)を渡し、ある処理をして,それでmainに戻ってきた時にb[]を表示すると、36407251が表示されません。 ポインタを引数にするってことはポインタでさしてるとこをrollで操作してるわけですよね? そうすれば変わって当然だとはおもいます。 でも関数1で関数2に配列1を渡し、その関数2の中でで配列1の値が変化しても、元の関数1にもどれば配列1のまま変化していないようにするにはどうすればいいですか? やはり もう1つ配列を用意しなきゃだめなのでしょうか。

  • 多次元配列の処理について

    多次元配列を扱った処理を行ないたいのですが、一部でnullを受け取ってしまい、処理を行うことができません。 引数の配列には次のようなテキストが入っています。 --配列の内容-- 0,名詞-一般,1,5, 0,名詞-数,2,6, 0,名詞-接尾-助数詞,3,7, -------------- この配列をコマンドラインに書き出すと正確に表示されます。 しかし、配列の内容を参照して処理を行なうと2列目の処理のときにnullを参照してしまいます。 プログラムは以下のとおりです。 ---プログラム--- public class Dist {   public static int zairyo(String[][] date) {    int a = 0;    int b = 0;    int c = 0;    int d = 0;    int e = 0;    if(date != null) {     int f = 0;     System.out.println("//Dist//");     for(int m = 0; m < date.length; m++) {      for(int n = 0; n < date[0].length; n++) {       if(date[m][n] != null) {        System.out.print(date[m][n] + "\t");        f++;        if(f == date[0].length) {         System.out.println("");         f = 0;        }       }      }     }     for(int i = 0; i < date.length; i++) {      if(date[i][1] != null) {       if(date[i][1] == "名詞-一般")        a++;       if(date[i][1] == "名詞-数")        b++;       if(date[i][1] == "名詞-接尾-助数詞")        c++;      }else System.out.println("2列目null");     }     int j = date.length - 1;     d = Integer.parseInt(date[j][2]);     e = Integer.parseInt(date[j][3]);    }else System.out.println("Dist:null");    if(a > 0 && b > 0 && c > 0 && d <= 10 && e <= 15) {     return 1;    }else return 0;   } } ------------------------ 原因は何なのでしょうか? ご教授お願いします。

  • ファイル中のデータの読むとき・・・・

    こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば 大まかな構造として、 int fncCheck(char*pch,char item) { int count=0; int i=0; for(i=0;i<strlen(pch);i++) {if(pch[i]==item) { count++; } } return count; } int main() { FILE *fin,*fout;  //ここでいろいろ宣言 if((fin=fopen("Thermoplasmaacidophilum ","r"))==NULL) { cout<<"No files exist in current directory!\n"; exit(-1); } if((fout=fopen("Thermoplasmaacidophilum _out","wb"))==NULL) { cout<<"Output file can't open!\n"; exit(-1); } if((fin=fopen("Thermoplasmaacidophilum ","r"))!=NULL) { fwrite(SMF_header,14,1,fout); fwrite(SMF_firsttrack,36,1,fout); fwrite(SMF_track,13,1,fout); do {    //ここにdoに関する処理 } while(numread==100); while(c=fscanf(fin,"%c",c)!=EOF) {   //ここに処理をずらずら } printf("There are %d bases!!\n",n); fclose(fin); fclose(fout); } return 0; } ・・・のように書くと、一つ目のdo-while文は実行されるんですが、二つ目のwhile文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

  • カラー画像からグレースケール画像フォーマットの変換

    カラー画像からグレースケール画像フォーマットの変換するプログラムなんですが、いまいち理解できていません。 プログラムはRGB構造体を使ってのものなんですが添削お願いいたします。 #include<stdio.h> #include<stdlib.h> typedef struct _RGB { unsigned char r; unsigned char g; unsigned char b; } RGB; int main(int argc, char *argv[]) { int x, y; unsigned char *in, *out; int i, j, Magic, level; unsigned char tmp[255]; RGB **pixels; int width = 255; int height = 255; int size = width * height; FILE *fin, *fout; if(argc != 3){ printf("Usage : %s input outpu \n", argv[0]); exit(1); } fin = fopen(argv[1], "rb"); fgets(tmp, 255, fin); if(tmp[0] != 'P'){ return 0; } sscanf(tmp, "P%d", &Magic); if(Magic < 1 || Magic > 6){ return 0; } do{ fgets(tmp, 255, fin); } while(tmp[0] == '#'); sscanf(tmp, "%d %d", &x, &y); if(x < 1 || y < 1){ return 0; } fgets(tmp, 255, fin); sscanf(tmp, "%d", &level); printf("P%d\n", &Magic); printf("%d %d\n", x, y); printf("%d\n", level); in = (unsigned char *)malloc(sizeof(unsigned char) *x*y); fread(in, sizeof(unsigned char), x*y, fin); pixels = (RGB**)malloc(width*sizeof(RGB*)); pixels[0] = (RGB* )malloc(size * sizeof(RGB)); for(i = 1; i < width; i++){ pixels[i] = pixels[i - 1] + height; } free(pixels[0]); for(i = 1; i < width * height * 3; i++){ out[i] = pixels[i][0].r * 0.299 + pixels[i][1].g * 0.587 + pixels[i][2].b * 0.114; } fout = fopen(argv[2], "wb"); fprintf(fout,"P%d\n",Magic); fprintf(fout,"# My new PGM\n"); fprintf(fout,"%d %d\n",x, y); fprintf(fout,"%d\n",level); fwrite(out, sizeof(unsigned char),x*y, fout); free(pixels); free(in); free(out); free(fin); free(fout); }

  • 昇順ソート

    sort.txtから読み込んだ値を 昇順でソートして出力するにはどうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <search.h> /* 比較関数 */ int strcmp_asc(const void *, const void *); int main(void) { FILE *fin, *fout; int i; int length; char s[256], s2[256]; if( (fin=fopen("sort.txt","r"))==NULL) { printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen("file2.txt","w"))==NULL) { printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s, 256, fin) != NULL) { /* 要素数を求める */ length = sizeof(s) / 256; /* 昇順でソート */ qsort(s, length, 256, strcmp_asc); /* memset(s2, NULL, sizeof(s2)); for (i = 0; i < length; i++) { } */ fprintf(fout,"%s\n",s2); } fclose(fin); fclose(fout); return 0; } int strcmp_asc(const void *sa, const void *sb) { return strcmp((char *)sa, (char *)sb); } sort.txt 50 45 35 25 15 10 5 1 32 46 8 7 9 19 18 14 16 13 12 17 11 20 40 30 31 3 2 37 38 36 33 39 34 49 47 48 4 6 44 42 43 41 21 22 26 24 28 29 27 23

  • 配列の使い方がわかりません

    n=1~20 s=n(n+1)(2n+1)(3n^2+3n-1)/30 のsの結果を数表にする問題で、 n  s    n   s   1  _   11 _ 2  _  12 _ ・      ・ ・      ・ ・      ・ 10 _  20  _ というような表示をしたくて、配列を用いてしてるんですが、うまくいきません。どなたか、教えてください。 public class suuhyou{ public static void main(String[] args){ int a=0,b=0,c=0,d=0,s=0; int[] x = new int[50]; for(int n=1;n<=50;n++){ a = n; b = n + 1; c = 2 * n + 1; d = 3 * n * n + 3 * n - 1; s = a * b * c * d / 30; int x[n] = s; } for(int k=1;k<=10;k++){ System.out.print ( k + ":" + x[k] +","); System.out.print ((k+10) + ":" + x[k+10]+","); System.out.print ((k+20) + ":" + x[k+20]+","); System.out.print ((k+30) + ":" + x[k+30]+","); System.out.println((k+40) + ":" + x[k+40]); } } } 自分でやっていたら、最後はこんな風にだんだんめちゃくちゃになってしまいました。このときはnが50まででやってます。お願いします。

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 引数に二重配列のある関数について

    void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.

専門家に質問してみよう