• 締切済み

ところどころ理屈の解らない記述

wormholeの回答

  • wormhole
  • ベストアンサー率28% (1621/5656)
回答No.1

典型的なバブルソートのプログラムです(バブルソートがわからないという質問ではないよね?)。

asura666
質問者

お礼

回答ありがとうございます。 バブルソートが解らないという質問ではないですが、 バブルソートも解りません。 初めて聞きました。

関連するQ&A

  • ややこしいコード

    #include<iostream> using namespace std; int main() { const int num = 5; int test[num]; cout << num << "人の点数を入力して下さい。\n"; for (int i = 0; i < num; i++) { cin >> test[i]; } for (int s= 0; s < num - 1; s++) { for (int t = s + 1; t < num; t++) { if (test[t] > test[s]) { int tmp = test[t]; test[t] = test[s]; test[s] = tmp; } } } for (int j = 0; j < num; j++) { cout << j + 1 << "番目の人の点数は" << test[j] << "です。\n"; } return 0; } 配列を並べ替える(ソート)する練習コードなんですが、 ちょっとややこしいので解りやすく教えて欲しいです。 因みに点数は、 22,80,57,60,50の順でお願いします。

  • 点数の大きい順に出力する

    #include <iostream> using namespace std; int main() { const int num = 5; int test[num]; cout << num << "人の点数を入力して下さい。\n"; for(int i=0; i<num; i++){ cin >> test[i]; } } } } for(int j=0; j<num; j++){ cout << j+1 << "番目の人の点数は" << test[j]<< "です。\n"; } return 0; } ---------- の for(int s=0; s<num-1; s++){ for(int t=s+1; t<num; t++){ if(test[t] > test[s]){ int tmp = test[t]; test[t] = test[s]; test[s] = tmp; の部分が理解できません。 s<num-1 は 0<4; ということでしょうか? 値が5つ入力されその値が if(test[t] > test[s]){ にどの様に挿入されるのかが 解りません。  

  • c++ で *の逆三角旗を作りたいです

    普通の三角旗はできましたが逆三角旗が分かりません 例えば3と入力したら * ** *** ** * こんな感じで出力させたいのですが考え方が分かりません 普通の方のコードはこんな感じです int i, j; cin>>num; for (i = 1;i <= num;++i) { for (j=1;j<=i;j++) { cout << "*"; } cout << endl; } for (i = 1;i <= num-1 ;i++) { for (j=1;j<=num-i;j++) { cout << "*"; } cout << endl; } cout << endl;

  • 点数の最高得点を知るプログラム

    #include<iostream> using namespace std;  int main() {  int i;  int box[5]; cout << "テストの点数を入力してください。\n"; for (int i = 0; i < 5; i++) { cin >> box[i]; } return 0; } for文で 点数を入力まで行ったのですが、 関数で配列を使って入力した最大値を調べるプログラムの練習問題なんですが、 何回もエラー出てしまいよく解っていません。 関数からポインタまで配列でどうつかうかがよく解ってないんだと思います。 良かったら教えてください、お願いします。

  • c++について

    入力した値が123または456で一致したら一致と表示したいのですがどうfor文を回すか分かりません。 ご助力願います_(._.)_ class N { bool hit(const char* a[],const char* b) {   for(int i=0;i<*a[i];i++) if(*a[i]!=b[i]) { return false; } return true ; } public: N() { const char* a[ ]={ "123","456"}; char b[4]; int num; cin>>num; sprintf_s(b, 4, "%03d", num); if(hit(a,b)) cout<<"一致"; else cout<<"不一致"; } };

  • 選択ソートについて

    ------------------------------------- #include<stdio.h> int main(void) { int min,s,t,i,j; int num[]={5,6,4,9,2}; for(i=0;i<4;i++){ min=num[i]; s=i;        ////◎1 for(j=i+1;j<5;j++){ if(num[j]<min){ min=num[j]; s=j; } } t=num[i]; num[i]=num[s]; num[s]=t; } for(i=0;i<5;i++){ printf("%d ",num[i]); } putchar('\n'); return 0; } -------------------------------------- 以上のプログラムで◎1の記述が無くても正常にソートしてくれたので疑問に思いました。 「s=i;」が無い場合、最初のループのif文で、 if(num[j]<min){ min=num[j]; s=j; } 「6<5」を比べる時、条件に見合わないので、sに何も代入されず、 t=num[i]; num[i]=num[s]; num[s]=t; 以上の記述で、sが初期化されてないので、その時点のエラーが出ると思ったんですが、出ないで正常に動きました。 何故なのか教えてもらえると嬉しいです。

  • このプログラムの問題点を教えてください。

    //数独 #include <iostream.h> const int num_Max = 100; //一辺のマス最高値 void input_data( int a, int [num_Max][num_Max] ); //入力関数 void yoko_data( int a, const int [100][100], int & ); //判定 void tate_data( int a, const int [100][100], int & ); void block_data( int a, int b, const int [100][100], int & ); main() { int num; //一辺のマスの数 int m; //一ブロックの一辺にあるマスの数 int okey; //numが正常か判別 int dx, dy, dz; int masu[num_Max][num_Max]; //全部のマス cout << "\n埋められた数独が正しいかどうか判断するプログラムです。\n"; while(1){ cout << "横何マスありますか? (4-100)>>" ; cin >> num ; if( num > num_Max || num < 4){ cout <<"範囲外です。再入力して下さい。" ; }else{ m = sqrt( num ); okey = num - m * m; if(okey != 0) cout << "その数字は数独として成り立ちません。再入力して下さい。"; } } //マスの入力 input_data( num, masu ); //横判定 yoko_data( num, masu, dx ); if(dx = 0){ //縦判定 tate_data( num, masu, dy ); if(dy = 0){ //マス判定 block_data( num, m, masu, dz ); } } if(dx == dy == dz == 0) cout <<"\n大正解♪ おめでっとー。\n"; return 0; } //入力 void input_data( int kazu, const int matrix[num_Max][num_Max]) { cout <<"\nマスの数字の入力を左上から順に、右へと行って下さい。"; for(int i = 0; i < kazu; i++){ for(int j = 0; j < kazu; j++){ cout << i+1 << "行目の" << j+1 << "列目 >>"; cin >> matrix[i][j] ; } } } //横列(行)を順に判定 void yoko_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vx = 0; //かぶっていたと判定されたかどうかを見る用 for(int i = 0; i < kazu; i++){ //横一列取り出しました。 for(int j = 0; j < kazu; j++){ for( int k = 1; j+k < kazu; k++){ kaburi = matrix[i][j] - matrix[i][j+k]; if(kaburi == 0){ //かぶってたらループから抜け出す vx++; break; } } } } if(vx > 0) cout << "\n横列(行)検索時に不適切な部分を発見しました。\n"; return vx; } //縦列(列)を順に判定 void tate_hantei( int kazu, int matrix[num_Max][num_Max]) { int kaburi; //かぶっているか判定する用 int vy = 0; //かぶっていたと判定されたかどうかを見る用 for(int j = 0; j < kazu; j++){ //縦一列取り出しました。 for(int i = 0; i < kazu; i++){ for( int k = 1; k < kazu-1; k++){ kaburi = matrix[i][j] - matrix[i+k][j]; if(kaburi == 0){ //かぶってたらループから抜け出す vy++; break; } } } } if(vy > 0) cout << "\n縦列(列)検索時に不適切な部分を発見しました。\n"; return vy; } //1ブロックごとに判定 void block_data( int kazu, int ruto, int matrix[num_Max][num_Max]) { int hantei[num_Max][num_Max] ; //判定する部分を切り出す用 int kaburi; int vz; //まずブロックごとに切り出してみる for(int i = 0; i < ruto-1; i++){ for(int j = 0; j < ruto-1; j++){ int h = 0; //何ブロック目か int g = 0; //そのブロックの何個目か (h-1)++; for(int l = 0; l < ruto-1; l++){ for(int k = 0; k < ruto-1; k++){ hantei[h][g++] = matrix[i * m + k][j * m + l]; } } } } //かぶっているか判定する for(int x = 0; x < kazu; x++){ for(int y = 0; y < kazu; y++){ for( int z = 1; z < kazu-1; z++){ kaburi = hantei[x][y] - matrix[x+z][y]; if(kaburi == 0){ //かぶってたらループから抜け出す vz++; break; } } } } return vz; } C++で作成したものです。 コンパイルエラーが出てしまうのですが、原因を教えていただけませんか?

  • java 配列のソートについて

    JAVAを現在独学で勉強中ですが、わからないコードがあります。 プログラミングの先輩方、暇なときにでも教えてください。 for(int i=0; i<test.length; i++){ String str =br.readLine(); test[i] =Integer.parseInt(str); } for(int s=0;s<test.length-1;s++){ for(int t=s+1; t<test.length;t++){ if(test[t]>test[s]){ int tmp =test[t]; test[t] =test[s]; test[s]=tmp } } } 2回目のtest.length-1の-1はどういった役割を果たしてるんでしょうか? またjavaの構文の中でも、配列のソートがどうしても苦手です。 何かソートを理解するのにコツみたいなものがあれば、ご教授ください。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 配列のサイズを動的に拡張

    お世話になっております。 配列のサイズを動的に拡張について悩んでおります。例えばint x[5]という配列があって、データが埋まったら動的にx[6]にする・・ っといったものです。自分で試行錯誤した結果、以下のようなプログラムを作成しました。 int *data,count=0,num=10;// グローバル変数 // 配列にデータを加える関数add void add(int t){  if(count+1>num){ // サイズを超えたら配列をサイズを+1    int i,*tmp_data;    tmp_data = new int [count];    for(i=0;i<num;i++) tmp_data[i] = data[i]; // 一時的に保存    delete[] data; // 古いのを消す    data = new int [num+1]; // 新しく作る    for(i=0;i<num;i++) data[i] = tmp_data[i]; // 新しいのにコピー    num+=1; // 最大値をプラス    data[count]=t;    delete[] tmp_data;  }  else data[count]=t;  count++; // 入力されたカウントをプラス } main関数内で、data = new int [10];と宣言し、add(3);のように使用しています。またnewのメモリ確保のエラー処理は省いております。 動くことは動くのですが・・ご覧の通り、グローバル変数が3つになり、データをコピーしたりと、複雑になってしまいました。 もっと簡単に出来るのでは・・っと思い質問させて頂きました。 こうすれば、もっと簡単になるよ!など。。ご回答頂ければ幸いです。

  • 4つの異なる二次配列を関数で表示

    二次配列と関数の問題です。 [日本語訳]displayArray7を呼ぶ関数を書きなさい。その関数は二次配列を一つの引数として受け取り、その内容を画面に表示すべきである。その関数は下のいずれの配列でも動作するようにしなさい。プログラムを書いてその関数を評価しなさい。 4つの配列とも一次の項(?)の数が違うじゃないですか。しかも関数を呼ぶときは配列[5][7]などはいらないですよね? (displayArray7(hours);だけ) だから、各配列の一次の項がどんな数字を持っているのかを関数displayArray7に送ることが出来ず、どのように表示してよいのか分かりません(今は一応最大値50で表示しています)。どのようにすればよいのでしょうか? 教えてください。お願いします。 #include <iostream> using namespace std; void initialize(int array[][7]); void displayArray7(int array[][7]); int main() { int hours[5][7]; int stamps[8][7]; int autos[12][7]; int cats[50][7]; initialize(hours); displayArray7(hours); initialize(stamps); displayArray7(stamps); initialize(autos); displayArray7(autos); initialize(cats); displayArray7(cats); return 0; } void initialize(int array[50][7]) { int i, j; for(i=0; i<50; i++) for(j=0; j<7; j++) array[i][j] = 0; } void displayArray7(int array[][7]) { int i, j; cout << "\t1\t2\t3\t4\t5\t6\t7" << endl << endl; for(i=0; i<50; i++){ cout << i+1 << ":"; for(j=0; j<7; j++){ cout << "\t" << array[i][j]; } cout << endl << endl; } }