• 締切済み

最大値を見つけるプログラム。

noname#140045の回答

noname#140045
noname#140045
回答No.6

#include <stdio.h> #include <string.h> #define ROW_NUM 6 /* 行数 */ #define COL_NUM 5 /* 桁数 */ #define MARK_C '@' int max_chk(int base[], int col_num); main() {   int tbl[ROW_NUM][COL_NUM] = { /* 元テーブル */     1,2,3,4,5,     5,4,3,2,1,     1,6,1,6,3,     1,1,1,1,4,     6,1,7,1,7,     2,2,2,2,3 };   int tbl2[ROW_NUM+2][COL_NUM+2]; // 拡張テーブル   char ans[ROW_NUM][COL_NUM]; // @ をセットするテーブル   int i,n;   // tbl==>tbl2 へセット   for(i=0; i < ROW_NUM; i++) {     memcpy(&tbl2[i+1][1], &tbl[i][0], COL_NUM*sizeof(int)); // 元をコピー     tbl2[i+1][0] = tbl[i][COL_NUM-1]; // 左端をセット     tbl2[i+1][COL_NUM+1] = tbl[i][0]; // 右端をセット   }   memcpy(&tbl2[0][1], &tbl[ROW_NUM-1][0], COL_NUM*sizeof(int)); // 上段をセット   memcpy(&tbl2[ROW_NUM+1][1], &tbl[0][0], COL_NUM*sizeof(int)); // 下段をセット   tbl2[0][0] = tbl[ROW_NUM-1][COL_NUM-1]; // 左上段をセット   tbl2[0][COL_NUM+1] = tbl[ROW_NUM-1][0]; // 右上段をセット   tbl2[ROW_NUM+1][0] = tbl[0][COL_NUM-1]; // 左下段をセット   tbl2[ROW_NUM+1][COL_NUM+1] = tbl[0][0]; // 右下段をセット   memset(ans, 0, sizeof(ans)); // 0クリア   // 1つずつ、最大値チェックをする   for(i=0; i < ROW_NUM; i++) {     for(n=0; n < COL_NUM; n++) {       if(max_chk(&tbl2[i+1][n+1], COL_NUM+2)) {         ans[i][n] = MARK_C; // 最大値だったので、@ をセット       }     }   } } // 8方向の最大値チェック int max_chk(int base[], int col_num) {   if(base[0] > base[-col_num-1] && /* 左上 */    base[0] > base[-col_num] && /* 上 */    base[0] > base[-col_num+1] && /* 右上 */    base[0] > base[-1] && /* 左 */    base[0] > base[+1] && /* 右 */    base[0] > base[col_num-1] && /* 左下 */    base[0] > base[col_num] && /* 下 */    base[0] > base[col_num+1]) { /* 右下 */     return 1; // 真   }   return 0; // 偽 }

関連するQ&A

  • 一つのテキストから独立にそれぞれの最大値を求めるプログラム

    こんにちわ。c言語の質問です。  f1 f2 f3 f4 10 2.434 4.234 3.242 4.566 20 2.767 4.756 3.666 4.867 30 2.534 4.555 3.777 4.555 40 2.777 5.355 4.244 5.424 とうtextfileがあり、10~40はステップ数、小数点の値はf1~f4の数値を表しています。このtextfileを読み込んでf1~f4の最大値をそれぞれ独立に求めるプログラムを作りたいのですが、1つのテキストから独立にもとめられるか、またステップ数の10~40を無視しれ最大値を求められるかがわからなくプログラムできません。よろしくお願いします。

  • 全組み合わせの出力プログラム

    $kana1[0][0] = "a"; $kana1[0][1] = "u"; $kana1[1][0] = "n"; $kana1[1][1] = "m"; という二次元配列があったときに an am un um と出力するようなプログラムのアルゴリズム(?)を教えてほしいです。 簡単なようでforループでやるとうまくいかずwhileを使ってフラグ変数とか作ってやってみましたがどうも駄目です。 ヒントでも何でもいいのでよろしくお願いします! むしろ二次元配列を使うのがダメなら言って下さるとありがたいです。 よろしくお願いします。 最終的には二次元配列の縦も横も任意の数のときにすべての組み合わせを出力できるようにならなければなりません。

    • ベストアンサー
    • Perl
  • エクセルの任意範囲の最大値最小値の取得について

    エクセルデーター任意範囲の最大値と最小値の取得方法について教えて下さい。 例は以下の形式です。 //////////////////////////////////////////////////////////////// A B C D E G H I O 1 0.51 1.32 0.32 0.34 2 0.59 1.43 0.33 0.35 3 0.62 1.59 0.30 0.36 4 0.60 1.57 0.31 0.30 5 0.59 1.62 0.34 0.39 ←"+1"          6 0.68 1.64 0.34 0.34 7 0.68 1.60 0.33 0.33 8 0.59 1.58 0.31 0.30 9 0.49 1.40 0.33 0.29 10 0.38 1.20 0.29 0.29 . . . . . 11 -1.2 -2.3 -1.3 -1.4 . . . . . E列:昇順に1からの値 G列,H列,I列,O列:完全な規則性はない正負小数点の値。大きく見ると値は増加や減少ではあるが、1行ずつ見ると常に増加や減少とはなっていない。 最終行も未確定で、10回または、5回の同じ様なデーターの繰り返しで、繰り返し点(最大・最小)の値も決まっていない。 10回または、5回の各繰り返し点(最大・最小)を抽出し、以下の値を追記したい。 I列の最初の最大値の同じ行(B列)に"+1"、最小値の同じ行(B列)に "-1"を追記したい。同様に、"+1"~"+10","-1"~"-10"または、 "+1"~"+5","-1"~"-5"を追記したい。 I列が同じ場合、O列→H列→G列の順に最大値と最小値を判断する。 説明不足であるかもしれませんが、エクセル関数の組み合わせや、マクロ、VBAいかなる方法でもかまわないので、早急に処理できる良い方法はないでしょうか? よろしくお願いします。

  • 隣接交換法のアルゴリズムについて

    隣接交換法(バブルソート)のアルゴリズムについて悩んでいます。 Q:配列「データ」には10個の要素があり、この配列「データ」を降順に並び替えるための隣接交換法アルゴリズムは? 一応、自分なりにアルゴリズムを考えたのですが、ループを抜けるチャンスが、【『要素』の数-1】回あるといわれ、それを考慮したアルゴリズムを考えよ、と言われました。 (そのチャンスというのが、どこにくるのかがわかりません。) http://oshiete1.goo.ne.jp/kotaeru.php3?q=290051も参照しましたが、よくわかりません。 すみませんが、教えていただけないでしょうか?よろしくお願いします。

  • VBAにて最大値と最大値までのデータの数を教えて

    はじめまして。VBA初心者です。 誰か教えてください。 下記のようにA列にデータが並んでおります。 A列はどこまでデータがあるかは、分かりません。 その中で、  何とか独自でC列の1行目に、A列の最大値を記入する事まではできました。 しかし、A列の最大値が数字が入力されているA列の1行目から何番目にその 最大値がくるのかの計算が分かりません。   E列の1行目にその何番目にくるかをしめしたいのですが、 C列の1行目で示すように最大値の値をA列で何番目になるのかの方法を教えてください。 Rangeを使用して、Range("A1:最大値")を選択して、countするとよいのではと思い、 挑戦していましたが、"最大値"の部分をどのように表記していいかわかりません。  どなかた分かる方がいらっしゃいましたらよろしくお願いします。       A列    B列    C列   D列   E列 1行    3    最大値   10   個数    4 2行    5 3行    7 4行   10 5行    9 6行    2 …     … …     …

  • エクセルで指定範囲の最大値・最小値を求めたい

    エクセルで、A列、B列、C列・・・にそれぞれ100個ずつ数値データがあります。 各列で1番上のデータからn番目のデータまでの範囲の最大値・最小値と、 n+1番目のデータから100番目のデータまでの範囲の最大値・最小値をそれぞれ求めたいのです。 nの値は列ごとに異なっており、例えばA列のn値は[A105]のセルに記入されています。 [A102]=40のとき、 =MAX(A2:A40) =MAX(A41:A101) などと個別に範囲指定をせずに、[A105]の値を引用して最大値・最小値を求めるにはどうすればいいでしょうか。

  • エクセル2013 マクロの最大値

    エクセル初心者です。セルをダブルクリックしたときに、最大値に+1の値をセルに自動入力したいのですが・・・。まず、シート1のC列とシート2のC列から最大値を探し、その値+1の数字を入力したいです。現在の時点で3、4、5の列にデータが入力されているのでC6をダブルクリックしたときに、マクロ実行されるようにしたいです。データは、増えていくのでC6は固定ではありません。C列の未入力のセルをダブルクリックしたときに、自動入力されるということです。 おわかりの方がいらしたら、ご教示お願いいたします。

  • 連続したデータの最大日数を知りたい

    Excel2000を使用しています。 連続したデータ(値)の最大日数を調べたいのです。 たとえば・・・ A列に日付、B列にデータが入っているとします。 B列に1,1,1,1,2,2,1,1,3,・・・となっていて 1が連続した最大日数を求めたいのです。 上記の場合は4日ですので、4を求めたいのです。 この場合どういった関数を使って 計算をすればいいのでしょうか? もうひとつ、その最大日数が何月何日~何月何日に 発生したというのも、分かりますか? 分かりづらい説明で申し訳ありませんが よろしくお願いします。

  • 2点間の距離のプログラムについて・・・

    皆さんに教えてもらいたいことがあります。 私は今エクセルのデータを利用してx、y座標データと隣接関係データから2点間の距離を計算するプログラムをC言語で作っています。 エクセルで保存しているデータの形は以下の通りです。 エクセル 座標データ no x y 1  2 3 2  4 5 ・  ・ ・ ・  ・ ・ 隣接関係データ no  隣接してる座標のno 1  2 3 6 2  5 6 3  4 5 ・  ・ ・  ・ ・  ・ というような形でエクセルに保存されています。 これらのデータを用いてC言語で隣接している点の距離をだしたいのですが・・・・私にはちょっと難しいです。。。 誰か優しい方いらっしゃったら教えてください。ホントにお願いします。

  • JAVAのプログラムについて・・・

    次のプログラムで分からないところがあります。 教えてください。 プログラムの説明 ・キーボードからの任意の個数の数値を入力し、入力した数値の個数と最大値を画面に表示する。 ・負の値を入力したらプログラムを終了する。いきなり負の値を入力することはないものとする。 入出力例 ()内の数値は、入力データである。この例の場合、入力は8個であるが、最後のデータは処理の終了を指示するものであるから、データの個数には含まない。 input1:(18) input2:(10) input3:(7) input4:(16) input5:(9) input6:(20) input7:(13) input8:-1 number=7 max=20 プログラムを一応考えてみました。 import java.io.*; class RepEx2{ public static void main(String[]args) throws IOException{ int in , n , max = 0; BufferedReader br = new BufferedReader(new InputsteeamReader(System.in)); //入力の準備       for(n = 1;true; n++){ //永久ループ          System.out.print("input"+n+":"); String s = br.readLine(); //キーボードからの文字列を入力          in =(1) (s); //文字列を数値に変換          if(in < 0) (2); //入力数値が負の時はルループ脱出          if((3)>(4))(5); //最大値の更新    } n--; (6)       System.out.printin("nember = " + n + " max = " + max); } } これでいいのでしょうか? (1)~5までは何を入れたらいいですか? また、(6)のn--;の命令はなぜ必要になるのでしょうか?