• ベストアンサー

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

ご質問させていただきます。 これは、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.20

こんにちは。itohhといいます。 >903C408360803C00という文字列 なんか凄いデジャビュを感じるので過去の回答を検索してみたら 同じことを聞かれたのを思い出しました。 これは、単なる偶然ですよね! 以下の質問でわたしが一度アドバイスしていますのでそちらを参考にしてください。 この方法では、ダメということなら、再度、補足してください。 ・質問:バイナリファイルの書き出し URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=175147

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=175147
kitapei
質問者

補足

なんか、驚きました!!MIDIデータいじくってる人って意外にいるもんですね。 ところで、あのプログラム鬼のようにむずかしいっす。 じっくり解読してみますが、もっと手軽にできる方法ってありません? あのプログラムとこのプログラムを合体させるだけでも難しそう・・。 ・・なんか凄いですね!!なかなか私にはかけたもんじゃないです・・(泣) わがままばっかりですみません・・・・。

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

こんにちは。itohhといいます。 すみません、言い忘れたことがあります。 malloc関数で動的に配列を獲得した場合は、使い終わったときに解放することを 忘れずにしてください。 >lpBuf = (char*)malloc( lLen+1 );   :   :   :   : >fwrite( lpBuf, sizeof( char ), lLen, fout2 ); // 関数で使い終わったときに解放する。 free( lpBuf );

kitapei
質問者

補足

ご丁寧な回答ありがとうございました!!!! 非常によく全体の、構造がわかりました!!!!! ・・・・・で、なんですが、ここで追加質問するのもどうかとおもったんですが、 今は、A,B,Cをテキストに出力してますよね? これを、バイナリに出力したいんです。 いままで、903C408360803C00という文字列をバイナリに出力するとき、 C[0]=0x90 C[1]=0x3C・・・・という風に配列を用意して fwrite(C,8,1,fout);という風にしてました。 これをlpBuf[a[i]-1]='A';のとこで 903C408360803C00を出力したいんです。そのままやってもだめなようなんで・・。 なにか、うまい方法ってありますか? 度々すみません。これで最後にしたいと思います。 また、疑問でてきたら新たに質問しなおしたいとおもいます。

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

こんにちは。itohhといいます。 ソースを見てみました。 >if(fin2!=NULL)                 <-----(0) >{ >int yabu=0;                   <----(1) >for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++) >{    :    : >yabu++;                     <----(2) >} >}    :    : >int yabu=0;                   <----(3) >long lLen=0; >char *lpBuf=NULL; >if( (fin = fopen( "sample.txt", "r" )) != NULL ) { //sample.txtはfinファイル名    :    : >for(i=0; i<yabu; i++ ) {            <----(4)    :    : > }   :   : yabu変数を考えてみてください。 最終的に、yabu変数の中に入っている値によってforループの回数が変わります。(4) yabu変数は、(2)でfin2ファイルを読み込むときにカウントアップされていますよね? 今度は宣言するところを見てみると、2カ所あります。(1)(3) (1)の宣言では、(0)のifブロック内にありますからこのブロックを抜け出たときに スコープがはずれそれ以降は使えなくなります。 しかし、(3)で再度宣言がされているため(4)で使用することが出来るのです。 ですが、一度、スコープがはずれているため、折角カウントした値はクリアされています。 (forループがゼロ回しか廻らないことになる) 使う直前に変数を宣言することを薦める人もいますが、まだなれていない人には間違いの 元ですから、関数内で使用する変数の宣言は全て先頭で行うことをお薦めします。 まとめますと。 (1)では宣言をやめる。 int aaaaaa()     <---------関数の先頭 {  int yabu=0;  long lLen=0;  char *lpBuf=NULL;  FILE *fin;  FILE *fin2;  int i=0;  (その他の宣言を行う)   :        if(fin2!=NULL)                 <-----(0)   :   : }

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

 ANo.#13の注意点にも書いたようにcc[]の宣言位置に注意 する必要があります。cc[]の宣言が現在localになっている と思いますが、local変数に対してはメモリーに制約がある ようで、大きなサイズは宣言できません。globalにして関数 の外で宣言すると100万や1000万位はOKだと思います。 マシンのメモリー要領による制約もありますので確認して ください。(この辺の詳しい事は私も余りよく知りません。)  実際に100万の文字を読み込むのなら、私の方法より itohhさんの方がよいのではないかと思います。  プログラムが質問で提示されたもので全て(つまり、質問 のために縮小されたものを作って提示したのではない)なら、 finのファイルから読み込まれる文字データは全く未使用で 文字データの個数のためのみにfinにアクセスしていることに なりますので、何らかの別の方法でこの文字数が分かれば そちらを参照するようにする事を検討された方がよいと思い ます。取りあえず現在の方法でやって行くことは可能は可能 です。

kitapei
質問者

お礼

どうもありがとうございました。大きさの問題ってむずかしいです・・・・。 とりあえず、このプログラムでやっていって、また別に勉強していきたいと思います!!どうも、ありがとうござました!!

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

失礼しました。 char cch[4]={"ABC"}; または char cch[]={"ABC"}; としてください。

kitapei
質問者

お礼

ご回答ありがとうございます。 素早いお返事本当に嬉しいです。 早速、やってみます。ポイントもうちょっと、待って下さい。

kitapei
質問者

補足

またしても、質問で申し訳ないですが、char cc[]の部分の配列の数についてなんですが、一般的にこれって限界の数ってあるんでしょうか? たとえば1000000ぐらいにするとまともに動かないんですが・・・。 ちなみに環境はVC++6.0です。

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

こんちには。itohhといいます。 すみません、(3)の処理でfinファイルの長さを越える処理が入っていませんでした。 for(i=0; i<yabu; i++ ) {   if( a[i] <= lLen ) {     lpBuf[a[i]-1] = 'A';   }   if( b[i] <= lLen ) {     lpBuf[b[i]-1] = 'B';   } }

kitapei
質問者

お礼

ご回答ありがとうございます。 返事がおそくなって申し訳ございませんでした。 で、早速やってみたんですが、下のtgbさんに対するレスでもかいたんですが、 初期化子の数が多すぎるといったエラーがとれないんですが、なにかが いけないんでしょうか?

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

こんにちは。itohhといいます。 先ほどは、時間がなかったのでサンプルを載せることが出来ませんでした。 改めて、じっくり解説します。 (1)fgetc(fin)したデータを使用していないので、まずは、finファイルのサイズを測ることにします。 (2)finファイルのサイズ分のエリアを確保して初期クリアします。    (この後は、ほぼtgbさんと同じ回答です。) (3)tgbさんが回答したように"A"、"B"を動的配列に設定していく。 (4)A,B,Cを設定した動的配列を出力する。 FILE *fin; long lLen=0; char *lpBuf=NULL; // (1)の処理 if( (fin = fopen( "fin.dat", "r" )) != NULL ) {   fseek( fin, 0, SEEK_END ); // ファイルの最後に移動する   lLen = ftell( fin ); // 現在のファイルポインタの位置を取得する(ファイルサイズ)   fclose( fin ); } // (2)の処理 lpBuf = (char*)malloc( lLen+1 ); // ファイルのサイズ+1分のエリアを確保。 memset( lpBuf, 0x00, lLen+1 ); memset( lpBuf, 'C', lLen ); // 'C'で初期クリア // (3)の処理 for(i=0; i<yabu; i++ ) { // 省略します。 } // (4)の処理 fwrite( lpBuf, sizeof( char ), lLen, fout2 ); こんな感じではどうでしょうか?

kitapei
質問者

補足

こんばんは。結局このプログラム考え抜いたんですが、どうしてもむずかしくておてあげです。以下のようにやるとCしか出力されません・・・・。 何度もお恥ずかしいんですが、なにか根本的に間違ってます?お時間あれば教えてください・・・。 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; long lLen=0; char *lpBuf=NULL; if( (fin = fopen( "sample.txt", "r" )) != NULL ) { //sample.txtはfinファイル名   fseek( fin, 0, SEEK_END );   lLen = ftell( fin );   fclose( fin ); } lpBuf = (char*)malloc( lLen+1 ); memset( lpBuf, 0x00, lLen+1 ); memset( lpBuf, 'C', lLen ); for(i=0; i<yabu; i++ ) {   if( a[i] <= lLen ) {     lpBuf[a[i]-1] = 'A';   }   if( b[i] <= lLen ) {     lpBuf[b[i]-1] = 'B';   } } fwrite( lpBuf, sizeof( char ), lLen, fout2 );

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

 ANo.#11の補足を読むとA(800)やB(850)をfinファイルの何番目文字 として出力するのか曖昧になってしまいます。 「a[],b[]にある数値に対応した位置にそれぞれA、Bを出力し、 それ以外ではCを出力する。その際、数値が必ずしも単調に 増加するとは限らない」 と言う条件では行けないのでしょうか?  上のような前提で処理例を示しますのでやってみていただけ ないでしょうか?  a[],b[]を読み込んだ後、以下のようにしてください。 int n=0; int i,k; char cch[3]={"ABC"}; char cc[1000]; while(fgetc(fin)!=EOF) {cc[n]=cch[2];n++;} for(i=0;i<yabu;i++){ k=a[i]-1;cc[k]=cch[0]; k=b[i]-1;cc[k]=cch[1]; } for(i=0:i<n;i++)fprintf(fout2,"%1c ", cc[i]); 注意点: ・cc[1000]のサイズ1000をfinファイルにある文字数より大きな  値に適当に修正してください。 ・a[]、b[]に同じ数値があるときは"B"が出力されます。 ・fin2を読み込むときに設定したyabuの値をそのまま使用します。 ・cc[]のサイズが大きいときは宣言の位置を適当に変えてください。

kitapei
質問者

お礼

お返事おそくなって申し訳ございません。パソコンがこわれちゃったんで・・・。 で、早速、やってみたんですが、 char cch[3]={"ABC"}; のところの、エラーで、「初期化子の数が多すぎます」というエラーが取れません。なにがいけないんでしょうか?

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

こんにちは。itohhといいます。 前から思っていたのですが、finファイルを実際に読む必要性がないのではないでしょうか? finファイル内のデータを使うのではなく、データの長さだけが必要なのですよね? finファイルとは、例えば"fin.dat"みたいにプログラムが動く前に実在するファイルなのですよね? finファイルの長さを測ってその長さ以内のa,bを順に出力するのではいけないのでしょうか?

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

こんにちは。itohhといいます。 >130..344 >500..600 >700..999 >800..850 この場合は、どのように出てほしいのでしょうか? A(130) B(344) A(500) B(600) A(700) A(800) たぶん、上記のようになって終わってしまうと言うことですよね? この後、 B(999) B(850) と出てほしいのでしょうか? それとも A(130) B(344) A(500) B(600) A(700) B(999)  <--追加 A(800) B(850)  <--追加 と出てほしいのでしょうか?

kitapei
質問者

補足

ご回答ありがとうございます。 この場合は A(130) B(344) A(500) B(600) A(700) B(999)  <--追加 A(800) B(850) というふうに出したい んです。つまり、fin2の ファイルには上から順に一行に二つ数字があるんですけど、それをaとbというふたつの配列に読み込んでますよね?それを一行分ずつ上から順に出力したいんです。つまり、配列に格納された数字の大きさを中心に考えるのではなくて、一行分ずつ出力していきたいんです。重ねがさね恐縮ですが、アドバイス頂けたら嬉しいです。

関連する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]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.