Как найти минимальный элемент в четных строках

Бедел

233 / 29 / 11

Регистрация: 04.06.2010

Сообщений: 293

1

Найдите наименьший элемент среди четных строк матрицы

04.04.2013, 03:11. Показов 1984. Ответов 2

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Помогите найти ошибку в коде.
Дана целочисленная прямоугольная матрица (задать самостоятельно).
1. Найдите наименьший элемент среди четных строк этой матрицы.
2. Переставьте местами строки матрицы в порядке убывания модулей первых элементов строк.

Не могу сделать второе условие, немного некорректно выполняется.

Добавлено через 1 минуту

C++
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <iomanip.>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    const int a = 3, b = 3;
    int m[a][b], i, j;
    cout << "Ввод массива: " << endl;
    for (i=0; i<a; i++)
        for (j=0; j<b; j++)
            cin >> m[i][j];
    for (i=0; i<a; i++)
    {
     for (j=0; j<b; j++)
        cout << setw(2) << m[i][j] << " ";
     cout << endl;
    }
    int mini=m[0][0];
    for (i=1; i<a; i+=2)
    {
      for (j=0; j<b; j++)
      {
        if (mini>=m[i][j+i]) mini=m[i][j+1];
      }
    }
        cout << "Минимальный элемент четных строк= " << mini << endl;
    int x,k;
    for (j=0; j<b; j++)
    {
        for (i=j+1; i<a; i++)
        {
          if (abs(m[i][0])> abs(m[j][0]))
            {
                for (k=0; k<a; k++)
                {
                    x=m[i][k];
                    m[j][k]=m[i][k];
                    m[i][k]=x;
                }
            }
        }
    }
    for (j=0; j<b; j++)
    {
        for (i=0; i<a; i++)
            cout << m[j][i] << " ";
        cout << endl;
    }
    return 0;
}

Найдите наименьший элемент среди четных строк матрицы

Я так понимаю, он затирает строкой с наибольшим первым элементом все остальные.Может переменная для временного хранения строки работает не совсем верно. В общем, жду помощи. Всем заранее спасибо)



0



SDev

44 / 42 / 31

Регистрация: 15.03.2013

Сообщений: 91

04.04.2013, 06:00

2

поставь этот кусок пузырьковой сортировки

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
for (j=0; j<b-1; j++)
    {
        for (i=0; i<a-j; i++)
        {
          if (abs(m[i][0])> abs(m[i+1][0]))
            {
                for (k=0; k<a; k++)
                {
                    x=m[i][k];
                    m[i][k]=m[i+1][k];
                    m[i+1][k]=x;
                }
            }
        }
    }



1



Бедел

233 / 29 / 11

Регистрация: 04.06.2010

Сообщений: 293

06.04.2013, 00:24

 [ТС]

3

SDev, спасибо вам большое, проблема решена !)
Только в вашем коде надо изменить два знака.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (j=0; j<b-1; j++)
    {
        for (i=0; i<=a-j; i++)  //В этой строчке поставить меньше, либо равно
        {
          if (abs(m[i][0]) < abs(m[i+1][0])) // В этой строчке изменить знак больше на меньше
            {
                for (k=0; k<a; k++)
                {
                    x=m[i][k];
                    m[i][k]=m[i+1][k];
                    m[i+1][k]=x;
                }
            }
        }
    }

Вот как будет выглядеть полный код программы:

C++
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <iomanip.>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    const int a = 3, b = 3;
    int m[a][b], i, j;
    cout << "Ввод массива: " << endl;
    for (i=0; i<a; i++)
        for (j=0; j<b; j++)
            cin >> m[i][j];
    for (i=0; i<a; i++)
    {
     for (j=0; j<b; j++)
        cout << setw(2) << m[i][j] << " ";
     cout << endl;
    }
    int mini=m[0][0];
    for (i=1; i<a; i+=2)
    {
      for (j=0; j<b; j++)
      {
        if (mini>=m[i][j+i]) mini=m[i][j+1];
      }
    }
        cout << "Минимальный элемент четных строк= " << mini << endl;
    int x,k;
    for (j=0; j<b-1; j++)
    {
        for (i=0; i<=a-j; i++)
        {
          if (abs(m[i][0])< abs(m[i+1][0]))
            {
                for (k=0; k<a; k++)
                {
                    x=m[i][k];
                    m[i][k]=m[i+1][k];
                    m[i+1][k]=x;
                }
            }
        }
    }
    for (j=0; j<b; j++)
    {
        for (i=0; i<a; i++)
            cout << m[j][i] << " ";
        cout << endl;
    }
    return 0;
}



0





Ученик

(186),
закрыт



8 лет назад

Дополнен 8 лет назад

нужен код проги

Дополнен 8 лет назад

в с ++



Высший разум

(1263710)


8 лет назад

Pascal/Delphi:
program q171811223;
var
 i, j, n, min: integer;
 a: array [1..100, 1..100] of integer;
begin
 Write(‘N = ‘);
 ReadLn(n);
 for i := 1 to n do
  for j := 1 to n do
  begin
   Write(‘a[‘, i, ‘, ‘, j, ‘] = ‘);
   ReadLn(a[i, j]);
  end;
 for i := 1 to n do
  if i mod 2 = 0 then
  begin
   min := a[i, 1];
   for j := 1 to n do
    if a[i, j] < min then
     min := a[i, j];
   WriteLn(‘Row = ‘, i, ‘Min = ‘, min);
  end;
 ReadLn;
end.
Если C++, то пиши на мыло.

Узнай цену своей работы

Формулировка задачи:

2)Задан одномерный массив A[1..20]. Найти минимальный элемент среди элементов, стоящих на четных позициях и его номер.

Код к задаче: «Найти минимальный элемент среди элементов, стоящих на четных позициях и его номер»

textual

Листинг программы

var a:array[1..20] of integer;
i,j,min:integer;
begin
for i:=1 to 20 do read(a[i]);
min:=a[2];
for i:=1 to 20 do 
  if (i mod 2)=0 then
     if a[i]<min then
      begin 
      min:=a[i];
      j:=i;
      end;
writeln('Номер элемента ',j, 'сам элемент ',min);
end.

 В этой статье рассмотрены два способа нахождения минимального (максимального) элемента массива, а также задачи с применением этих способов.

1 способ

Задача 1: Дан одномерный массив, состоящий из n целых чисел. Найти минимальный элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводятся сами числа, заданные случайным образом. В третьей строке выводится результат: минимальный элемент массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  6  -1

-4

10
0  4  5  2  77  62  4  8  0  45

0

Считаем, что первый элемент массива – минимальный.  Затем, сравниваем, начиная со второго до последнего все элементы массива с минимальным. Используем для этого цикл. Если очередной элемент на каком-то шаге цикла оказывается меньше минимального, то значение минимального изменяем, присвоив ему значение этого очередного элемента. По окончании цикла выводим результат: минимальный элемент.

program min1;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then min:=a[i];
//вывод результата
writeln;
write(min);
end.

Заметим, что для нахождения максимального элемента массива достаточно заменить имя переменной min на max и знак >= на знак <=.

Задача 2: Дан одномерный массив, состоящий из n целых чисел. Найти индекс минимального элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: индекс минимального элемент массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  6  -1

5

10
0  4  5  2  77  62  4  8  0  45

9

Если в задаче требуется найти индекс минимального (максимального), то вводим переменную imin, в которую будем запоминать индекс минимального (максимального), причем первоначально ее значение равно 1.

program min2;
var a:array[1..100] of integer;
i,min,n,imin:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение индекса минимального элемента массива
min:=a[1];
imin:=1;
for i:=2 to n do
if min>=a[i] then begin
imin:=i;
min:=a[i];
end;
//вывод результата
writeln;
write(imin);
end.

Если в массиве есть несколько равных между собой минимальных элементов, то данная программа найдет номер последнего (правого) элемента. Для того чтобы найти индекс первого (левого) элемента достаточно изменить знак  >= на строгий знак >.
Эту программу можно оптимизировать, так как, зная индекс минимального элемента, можно найти значение минимального элемента массива. Значит, переменная min не нужна:

var a:array[1..100] of integer;
i,n,imin:integer;

Фрагмент нахождения индекса минимального элемента массива выглядит так:

imin:=1;
for i:=2 to n do
if a[imin]>=a[i] then imin:=i;

Задача 3: Дан одномерный массив, состоящий из n целых чисел. Найти количество минимальных элементов массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: количество минимальных элементов массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  -4  -1

2

10
0  4  5  2  77  0  4  8  0  45

3

program min3;
var a:array[1..100] of integer;
i,min,n,k:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-5,5);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then
min:=a[i];
//считаем количество равных элементов
k:=0;
for i:=1 to n do
if a[i]=min then k:=k+1;
//вывод результата
writeln;
write(k);
end.

Задача 4: Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 1000. Напишите программу, находящую минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно четырем. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре.

Исходные данные:

Результат:

10
5  -2  14  7  -4  22  0  -8  -6  -1

-6

10
0  4  5  -10  77  0  4  -12  0  45

-10

В этой задаче первый способ нахождения минимального не подойдет. Первый элемент массива может оказаться меньше, чем минимальный четный и не кратный четырем и программа выведет неверный результат. Каким должно быть начальное значение переменной min? Его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условие a[i] < min, и это «временное» начальное значение было бы заменено на реальное. Такое «подходящее» обязательно будет, так как это гарантировано условием задачи. Оно должно быть большим и таким, какое не может быть по условию задачи, например, 1001.

Кроме того заметим, что задавать элементы массива нужно с клавиатуры, чтобы обеспечить условия задачи.

Итак, находим минимальный элемент вторым способом.

2 способ

Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 4 не равен нулю и значение элемента меньше, чем значение переменной min, сохраняем в переменную min значение очередного элемента массива. После окончания работы цикла выводим значение переменной min.

program min4;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение минимального элемента массива
min:=1001;
for i:=1 to N do
if (a[i] mod 2=0) and (a[i] mod 4 <> 0) and (a[i]<min) then
  min:=a[i];
//вывод результата
writeln;
write(min);
end.

Проверяем на тестах:

10
411 837 755 90 520 203 581 798 401 640

90

10
195 264 127 936 658 152 339 504 395 553

658

 Конечно, решить эту задачу можно и первым способом, но для нахождения первого значения min нужно написать дополнительные команды поиска. Вот таким может быть решение:

program min5;
var a:array[1..100] of integer;
i,min,n,j:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение первого четного и не кратного 4 числа
i:=1;
while (i<=n)and not((a[i] mod 2=0) and (a[i] mod 4 <> 0)) do i:=i+1;
//в переменной i запомнился номер первого элемента, удовлетворяющего условию
//нахождение минимального, начиная со следующего за найденным
min:=a[i];
for j:=i+1 to N do
if (a[j] mod 2=0) and (a[j] mod 4 <> 0) and (a[j]<min) then
  min:=a[j];
//вывод результата
writeln;
write(min);
end.

Задача 5: Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым).

Исходные данные:

Результат:

10
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

45

Мы знаем, как найти первый максимум, а в этой задаче нужно найти второй по величине максимум. Попробуем это сделать это за один проход по массиву. Нам нужны две переменные, max1 (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max1, а второй по величине записываем в max2.

Затем в цикле перебираем все элементы, начиная с 3-го до последнего. Если очередной элемент a[i] больше, чем max1, записываем значение max1 в max2 (предыдущий максимум становится вторым), а значение a[i] – в max1. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2.

program min6;
var a: array [1..100] of integer;
i, k,n, max1, max2: integer;
begin
  //заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(0,100);
write(a[i],’ ‘);
end;
//начальные значения max1 и max2
if a[1] > a[2] then begin
max1:=a[1]; max2:=a[2]
end
else begin
max1:=a[2]; max2:=a[1]
end;
// поиск второго максимального
for i:=3 to N do
if a[i] > max1 then begin
max2:= max1;
max1:= a[i]
end
else
if a[i] > max2 then max2:=a[i];
//вывод результата
writeln;
writeln(max2);
end.

Задача 6: Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести минимальный элемент массива, шестнадцатеричная запись которого содержит ровно две цифры, причём первая (старшая) цифра больше второй (младшей).  Если таких чисел нет, нужно вывести ответ 0.

Исходные данные:

Результат:

20
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

45

Эта задача усложнена только тем, что элементы массива должны быть в диапазоне от 16 до 255. В этом случае первая цифра находится как результат деления нацело на 16, а вторая цифра – как остаток от деления на 16.

Кроме этого здесь массив можно объявить через константу n, так как размер массива задан явно: 20 элементов.

program z6;
//объявление массива через константу
const n=20;
var a: array [1..n] of integer;
i,min: integer;
begin
  //заполнение массива и вывод массива в строчку
for i:=1 to n do begin
a[i]:=random(0,10000);
write(a[i],’ ‘);
end;
writeln;
min := 10001;
for i := 1 to n do begin
//для проверки правильности программы выведем две шестнадцатеричные цифры:
//write(a[i] div 16,a[i] mod 16,’ ‘);
if (16 <= a[i]) and (a[i] < 256) and (a[i] div 16 > a[i] mod 16) and (a[i] < min) then
    min := a[i];
end;
writeln;
//вывод результата
if min = 10001 then
  writeln(0)
else
  writeln(min);
end.

Задачи для самостоятельного решения:

  1. Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 ­– рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
  2. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
  3. Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
  4. Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
  5. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
  6. Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
  7. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.

Источники информации

  1. Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
  2. Сайт К. Полякова http://kpolyakov.spb.ru/school/ege.htm

uses
  crt;
const
  m=4;
  n=4;
var
  a: array [1..m,1..n] of integer;
  i,j,min: integer;
begin
  clrscr;
  randomize;
  for i:= 1 to m do
  begin
    for j:= 1 to n do
    begin
      a[i,j]:=random(10);
      write(a[i,j],’ ‘);
    end;
    writeln;
  end;
  for i:= 1 to m do
  begin
    min:=a[i,1];
    for j:= 1 to n do
      if i mod 2 = 0 then
        if a[i,j]<min then
          min:=a[i,j];
    if i mod 2 = 0 then
      writeln(‘Min element ‘,i,’-oi stroki = ‘,min);
  end;
  readkey;
end.

Добавить комментарий