Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 9
1

Все элементы массива разделить на самый большой, отличный от нуля, элемент

21.11.2018, 11:31. Показов 1340. Ответов 15
Метки нет (Все метки)

2. Дан массив C (3,5). Все элементы массива разделить на самый большой, отличный от нуля, элемент.
Надо написать как можно проще
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2018, 11:31
Ответы с готовыми решениями:

В одномерном массиве найти самый большой элемент и заменить им все нулевые элементы
В одномерном массиве найти самый большой элемент и заменить им все нулевые элементы.

В одномерном массиве найти самый большой элемент и заменить им все нулевые элементы.
В одномерном массиве найти самый большой элемент и заменить им все нулевые элементы.

В одномерном массиве найти самый большой элемент и заменить им все нулевые элементы
В одномерном массиве найти самый большой элемент и заменить им все нулевые элементы. помогите...

Поменять местами самый первый элемент массива и самый большой
Вводится какой-нибудь массив, поменять местами самый первый элемент массива и самый большой

15
6924 / 4693 / 2698
Регистрация: 18.12.2017
Сообщений: 14,705
21.11.2018, 16:08 2
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
#include <iostream>
using namespace std;
 
int main()
{
    const int n=3, m=5;
    double a[n][m], max=0.0;
 
    cout <<"Enter matrix elements:\n";
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++)
     { 
     cin >>a[i][j];
     if ((i == 0 && j==0) || a[i][j] > max) max=a[i][j];
     }
 
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < m; j++)
      {
      a[i][j]/=max;
      cout <<a[i][j]<<" ";
      }
    cout <<endl;
    }
 
system("pause");
return 0;
}
0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
21.11.2018, 16:15 3
Yetty, у тебя не выполнено условие "самый большой, отличный от нуля". Если массив состоит из элементов -1, -2, 0, то самый большой это 0, а он по условию не проходит. Вероятно, в этом случае следует делить на -1, но в задании внятно не озвучено
1
6924 / 4693 / 2698
Регистрация: 18.12.2017
Сообщений: 14,705
21.11.2018, 16:21 4
Evg, спасибо, конечно упустил это условие

Marty321, дополните строку 21:
C++
1
if (max!=0.0) a[i][j]/=max;
Цитата Сообщение от Evg Посмотреть сообщение
в этом случае следует делить на -1
почему на -1 ? просто не выполняем деление
0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
21.11.2018, 16:23 5
Цитата Сообщение от Yetty Посмотреть сообщение
почему на -1 ?
Фраза "на самый большой, отличный от нуля" мне интуитивно читается как "на самый большой, среди тех, что отличны от нуля". А можно прочитать как "на самый большой, если он отличнен от нуля". Может быть как-то ещё
0
Модератор
1638 / 1092 / 487
Регистрация: 17.07.2012
Сообщений: 5,344
21.11.2018, 16:45 6
Согласен с Evg. Т.е по сути сначала берем все элементы отличные от 0, а потом среди них максимальный.
0
6924 / 4693 / 2698
Регистрация: 18.12.2017
Сообщений: 14,705
21.11.2018, 19:37 7
Лучший ответ Сообщение было отмечено Marty321 как решение

Решение

реализовал в коде то, что сказал Evg. просто исключаем 0 из кандидатов в максимальные:
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
#include <iostream>
using namespace std;
 
int main()
{
    const int n=3, m=5;
    double a[n][m], max=1.0; // это просто инициализация переменной
 
    cout <<"Enter matrix elements:\n";
    for (int i = 0; i < n; i++)
      for (int j = 0; j < m; j++)
     { 
     cin >>a[i][j];
     if (((i == 0 && j==0) || a[i][j] > max)&&a[i][j]!=0.0) max=a[i][j];
     }
 
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < m; j++)
      {
      a[i][j]/=max;
      cout <<a[i][j]<<" ";
      }
    cout <<endl;
    }
 
system("pause");
return 0;
}
0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
21.11.2018, 20:47 8
Цитата Сообщение от Yetty Посмотреть сообщение
реализовал в коде то, что сказал Evg. просто исключаем 0 из кандидатов в максимальные
Не учтён случай, если массив состоит из одних нулей
0
6924 / 4693 / 2698
Регистрация: 18.12.2017
Сообщений: 14,705
21.11.2018, 21:01 9
Цитата Сообщение от Evg Посмотреть сообщение
Не учтён случай, если массив состоит из одних нулей
как это не учтён ? если массив состоит только из нулей, он ни на что не делится ( поскольку нет элемента отличного от нуля ), массив так и останется состоящим из одних нулей

в самом коде элементы в этом случае делятся на число которым инициализирован max, но это никак не влияет на результат.
0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
21.11.2018, 21:06 10
Пардон, не обратил внимание, что max теперь по другому пересчитывается. Т.е. во втором цикле произойдёт деление на 1. Т.е. тебе повезло, что ты max изначально единицей инициализировал. Т.е. комментарий "просто инициализация переменной" несколько не соответствует действительности

Однако я по прежнему считаю, что этот случай не учтён. По условию задачи весь массив должен быть поделён на максимум. Максимум равен нулю, т.е. весь массив должен быть поделён на ноль. Т.е. программа математически должна упасть, но она не упадёт. В крайнем случае все элементы должны быть превращены в Nan, но этого тоже не произойдёт. Т.е. программа отработает НЕ в соответствии с предполагаемым условием
0
6924 / 4693 / 2698
Регистрация: 18.12.2017
Сообщений: 14,705
21.11.2018, 21:14 11
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. тебе повезло, что ты max изначально единицей инициализировал.
такое "везение" подходит для любого числа (кроме 0) если ноль разделить на любое число кроме 0 получим 0
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. комментарий "просто инициализация переменной" несколько не соответствует действительности
полностью соответствует
Цитата Сообщение от Evg Посмотреть сообщение
Однако я по прежнему считаю, что этот случай не учтён. По условию задачи весь массив должен быть поделён на максимум.
Evg, массив должен быть поделен не на максимум, а на максимальный элемент (элемент массива).
в массиве, состоящем из нулей максимальный элемент 0. так как на ноль делить нельзя, оставляем массив без изменений - мне совершенно непонятно, что у Вас вызывает сомнения.
0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
21.11.2018, 21:23 12
Цитата Сообщение от Yetty Посмотреть сообщение
полностью соответствует
Если бы это была "просто инициализация", то можно было бы инициализировать чем угодно. Т.е. инициализация нулём НЕ меняла бы поведение программы. Так что тут требуется инициализация каким-то осмысленным значением (в твоём случае ненулевым). Т.е. комментарий не верный

Цитата Сообщение от Yetty Посмотреть сообщение
так как на ноль делить нельзя, оставляем массив без изменений
Это уже придумал ты, в условии задачи этого не написано. Если бы была задача, где нужно взять корень из всех элементов массива, то ты наверное предложил бы правило "если элемент отрицательный, то из него корень брать нельзя, а потому оставим его без изменений". Это классическая подмена понятий
0
6924 / 4693 / 2698
Регистрация: 18.12.2017
Сообщений: 14,705
21.11.2018, 21:39 13
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. инициализация нулём НЕ меняла бы поведение программы.
При чём тут ноль ? я поставил max=1.0 и закомментил, что это инициализация переменной - просто инициализация переменной если угодно. комментарий исключительно для того, чтобы ТС не подумал что число 1 как-то участвует в вычислениях - на самом деле за первый max берётся первый элемент массива, а инициализация нужна чтобы некоторые компиляторы не ругались на сравнение с неинициализированной переменной.
Цитата Сообщение от Evg Посмотреть сообщение
в условии задачи этого не написано
чёрным-по белому написано:
Цитата Сообщение от Marty321 Посмотреть сообщение
Все элементы массива разделить на самый большой, отличный от нуля, элемент.
само собой если такого элемента нет, то и делить не на что
0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
21.11.2018, 21:59 14
Цитата Сообщение от Yetty Посмотреть сообщение
само собой если такого элемента нет, то и делить не на что
Очень смутно, но твою мысль уловил, хотя подобное условие выражать такими словами было бы ну очень коряво и не по русски. Получается, что это условно третья трактовка в дополнение к двум другим из поста #10

Цитата Сообщение от Yetty Посмотреть сообщение
а инициализация нужна чтобы некоторые компиляторы не ругались на сравнение с неинициализированной переменной
Понял. Так и пиши. Дабы не было двоякого толкования (как это имеет место быть с условием задачи)

Добавлено через 6 минут
Цитата Сообщение от Yetty Посмотреть сообщение
а инициализация нужна чтобы некоторые компиляторы не ругались на сравнение с неинициализированной переменной
Стоп! Это не так. В реальности инициализация нужна из-за того, что в программе есть траектория, по которой переменная max может оказаться неинициализированной. При этом неважно, что неинициализированное значение в конечном итоге окажется в операции деления, где числитель равен нулю, по стандарту это есть undefined behaviour. Например эльбрусе с его тэгированными регистрами это приведёт к поломке при исполнении кода (из-за использования неинициализированного значения). А потому инициализировать нужно потому, чтобы избежать работы с неициализированным значением. Более того, значение играет роль, оно должно быть ненулевым

Такое вот неочевидное действие за простым комментарием "просто инициализация". Так что это не просто инициализация
0
Yetty
21.11.2018, 22:04
  #15

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
твою мысль уловил
не сразу правда, но возможно что это я недостаточно ясно формулировал то, что хотел сказать
Цитата Сообщение от Evg Посмотреть сообщение
Понял.
так и написали бы сразу нах зачем тут единица :)
Цитата Сообщение от Evg Посмотреть сообщение
Дабы не было двоякого толкования
условие корректное, никакого двоякого, а тем более троякого толкования нет.

Evg, спасибо, что благодаря Вашим замечаниям код был подкорректирован.

надеюсь на этом дискуссию можно завершить :)

0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
21.11.2018, 22:06 16
Да, вот ещё. Неинициализированная переменная может случайно иметь нулевое значение. И тогда код сломается даже на нормальном процессоре, а не только на эльбрусе

В каком-то смысле это наглядная демонстрация того, как при проектировании алгоритма можно упустить всякую мелочь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2018, 22:06

Как переставить местами самый маленький и самый большой элементы массива?
1. Переставить местами маленький и самый большой элементы массива

Найти среднее арифметическое компонент массива, удалив самый большой и самый маленький элементы
Найти среднее арифметическое компонент массива , убрав самый большой и самый маленький элементы

Нормировать элемент каждого массива по максимальному(разделить все элементы массива на максимальных элемент)
Ребяяят, помогите, пожалуйста. Задание: Дано три массива A, B. C. Нормировать элемент каждого...

Найти второй самый большой элемент массива и второй самый маленький элемент массива
Помогите пожалуйста: Найти второй самый большой элемент массива и второй самый маленький элемент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.