ここにあなたが何をする必要があるかの擬似コードだ:私は今、次のように
私のコードがある座標です見つける方法がわかりません。
for row in grid {
row_max = max_in_row(row)
grid_min = min(grid_min, row_max)
}
ステップ1は、リスト内でmaxとlocationを見つけるルーチンを作成することです。これを1つの大きな機能として実行できますが、断片的に理解してデバッグする方がはるかに簡単です。
また、見つかったインデックスも必要です。 Cは複数の値を返すことができないので、番号/インデックスのペアを格納する構造体が必要になります。構造体を作るたびに、それを作成して破壊するためのルーチンを作ります。これほど些細なことでは、あまりにも不愉快に思えるかもしれませんが、コードを理解してデバッグするのがはるかに簡単になります。
typedef struct {
int num;
size_t idx;
} Int_Location_t;
static Int_Location_t* Int_Location_new() {
return calloc(1, sizeof(Int_Location_t));
}
static void Int_Location_destroy(Int_Location_t* loc) {
free(loc);
}
ここで、行の最大数と位置を見つける小さな関数を作成できます。
static Int_Location_t* max_in_row(int *row, size_t num_rows) {
Int_Location_t *loc = Int_Location_new();
/* Start with the first element as the max */
loc->num = row[0];
loc->idx = 0;
/* Compare starting with the second element */
for(size_t i = 1; i < num_rows; i++) {
if(row[i] > loc->num) {
loc->num = row[i];
loc->idx = i;
}
}
return loc;
}
ではなく、いくつかの任意の最大または最小で始まる、私は最初の要素であることmaxに設定し、第1のチェックを開始別の技術を使用しました。
今、私は行の最大を見つけるための機能を持っていることを、私は今それ以上のループは、各列の最大値を取得し、テーブル全体の最小とそれを比較することができます。
int main() {
int grid[3][3] = {
{10, 12, 15},
{-50, -15, -10},
{1,2,3}
};
int min = INT_MAX;
size_t row = 0;
size_t col = 0;
for(size_t i = 0; i < 3; i++) {
Int_Location_t *max = max_in_row(grid[i], 3);
printf("max for row %zu is %d at %zu\n", i, max->num, max->idx);
if(max->num < min) {
min = max->num;
col = max->idx;
row = i;
}
Int_Location_destroy(max);
}
printf("min for the grid is %d at row %zu, col %zu\n", min, row, col);
}
最初の最大値を得るにはループ内のコードを繰り返す必要があるため、最小限の位置を初期化するために別の手法を使用しました。代わりに、可能な限り小さい整数INT_MAX
からlimits.hに、min
を設定します。これにより、任意の整数の範囲でコードを使用できますが、制限はありません。これは、最小/最大アルゴリズムで作業する場合の非常に一般的な手法です。
は関係ありませんが、ユーザが入力した「N」が[1,10]の範囲にあることを確認する必要があります。さもなければ、あなたは配列の境界から外れます( 'N == 0'でも問題ありませんが、何も起こりません)。 – yano