Форум программистов, компьютерный форум CyberForum.ru

Найти ошибку в программе - C++

Восстановить пароль Регистрация
 
TopLoader
 Аватар для TopLoader
41 / 41 / 4
Регистрация: 10.12.2011
Сообщений: 128
14.11.2012, 03:20     Найти ошибку в программе #1
Решаю задачу:
В метании молота состязается n спортcменов. Каждый из них сделал m бросков.
Если перенумеровать спортсменов числами от 0 до n-1, а попытки каждого из них – от 0 до m-1, то на вход программа получает массив int A[n][m], состоящий из неотрицательных чисел.
Будем считать, что побеждает спортсмен, у которого максимален наилучший бросок. Если таких несколько, то из них побеждает тот, у которого наилучшая сумма результатов по всем попыткам. Если и таких несколько, победителем считается спортсмен с минимальным номером. Определите номер победителя соревнований.
Тест:
Вход
4 3
8 8 8
5 9 3
9 4 7
6 6 2

Выход:
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
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 <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
 
    int n, m;
    int i, j;
    int max = 0;
    int sum;
    int maxSum = 0;
  int maxSumRow;
    int k;
    bool maxElementInRow;
 
    cout << "n>";
    cin >> n;
    cout << "m>";
    cin >> m;
 
    int a[n][m];
 
    // Чтение массива
    for(i=0; i<n; i++)
    for(j=0; j<m; j++)
      cin >> a[i][j];
  // Ищем
  for(i=0; i<n; i++) {
    maxElementInRow = false;
    sum = 0;  // сумма в строке = 0
    for(j=0; j<m; j++) {
      sum += a[i][j]; // считаем сумму
      if(a[i][j] > max) {
        max = a[i][j];
        k = i;
      } else if(a[i][j]==max)
          maxElementInRow = true;
    }
    if(maxElementInRow) {   // если в строке есть элемент, равный максимуму
        if(sum > maxSum) {
          maxSum = sum;
          k = i;
        }
      }
  }
 
  cout << "\n" << k << "\n";
 
    return 0;
}
Но он работает неправильно, не могу понять, что я не учитываю
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2012, 03:20     Найти ошибку в программе
Посмотрите здесь:

C++ найти ошибку в программе
найти ошибку в программе C++
C++ найти ошибку в программе
C++ Найти ошибку в программе
C++ Найти ошибку в программе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
polyaKIDze
63 / 63 / 12
Регистрация: 16.07.2012
Сообщений: 147
14.11.2012, 05:31     Найти ошибку в программе #2
после 44 строки вставьте:
C
1
printf ("i=%d sum=%d maxSum=%d\n", i, sum, maxSum);
и должны понять, в чем ошибка.
Кликните здесь для просмотра всего текста
maxSum должна сравниваться между двумя строками, имеющими одинаковый максимальный элемент
Illusive
17 / 17 / 0
Регистрация: 11.01.2008
Сообщений: 51
14.11.2012, 09:28     Найти ошибку в программе #3
В чем ошибка то?
Ответ и должен быть 2 -> k = 0,1,2,3

А вот задание массива в 26 строке работать не должно
n и m должны быть константами
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.11.2012, 10:35     Найти ошибку в программе #4
Цитата Сообщение от TopLoader Посмотреть сообщение
cout << "n>";
cin >> n;
cout << "m>";
cin >> m;
int a[n][m];
Разве так можно выделять динамический массив в Си?
TopLoader
 Аватар для TopLoader
41 / 41 / 4
Регистрация: 10.12.2011
Сообщений: 128
14.11.2012, 13:17  [ТС]     Найти ошибку в программе #5
polyaKIDze, разобрался. В данном случае нужно было обнулять maxSum после того, как изменится max.


Работающий код, вдруг кому пригодиться
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
55
56
57
58
59
60
61
62
63
/*
Будем считать, что побеждает спортсмен, у которого максимален
наилучший бросок. Если таких несколько, то из них побеждает
тот, у которого наилучшая сумма результатов по всем попыткам.
Если и таких несколько, победителем считается спортсмен с
минимальным номером. Определите номер победителя соревнований.
*/
#include <iostream>
#include <windows.h>
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
 
    int n, m;
    int i, j;
    int max = 0;
    int sum;
    int maxSum = 0;
    int k;
    bool maxElementInRow;
 
    cout << "n>";
    cin >> n;
    cout << "m>";
    cin >> m;
 
    int a[n][m];
 
    // Чтение массива
    for(i=0; i<n; i++)
    for(j=0; j<m; j++)
      cin >> a[i][j];
  // Ищем
  for(i=0; i<n; i++) {
    maxElementInRow = false;
    sum = 0;  // сумма в строке = 0
    for(j=0; j<m; j++) {
      sum += a[i][j]; // считаем сумму
      if(a[i][j] > max) {
        max = a[i][j];
        k = i;
        maxSum = 0;
      }
      if(a[i][j]==max)
        maxElementInRow = true;
    }
    if(maxElementInRow) {   // если в строке есть элемент, равный максимуму
        //cout << "i=" << i << " sum=" << sum << " maxSum=" << maxSum << "\n";
        if(sum >maxSum) {
          maxSum = sum;
          k = i;
        }
      }
  }
 
  cout << "\n" << k << "\n";
 
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.11.2012, 15:34     Найти ошибку в программе #6
Цитата Сообщение от TopLoader Посмотреть сообщение
Работающий код, вдруг кому пригодиться
Скажи, где проверялся этот "работающий" код? Не знаю как другие IDE, но MSVS такое точно не потерпит.
TopLoader
 Аватар для TopLoader
41 / 41 / 4
Регистрация: 10.12.2011
Сообщений: 128
15.11.2012, 00:29  [ТС]     Найти ошибку в программе #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Скажи, где проверялся этот "работающий" код? Не знаю как другие IDE, но MSVS такое точно не потерпит.
CodeBlocks: полёт нормальный.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.11.2012, 00:34     Найти ошибку в программе #8
Цитата Сообщение от TopLoader Посмотреть сообщение
CodeBlocks: полёт нормальный.
Значит сам CodeBlocks как раз ненормальный и вытворяет нестандартную отсебятину. Покажи мне, чтобы Страуструпп или Кериганн&Риттчи такое советовали и тогда это стало бы нормальным.
polyaKIDze
63 / 63 / 12
Регистрация: 16.07.2012
Сообщений: 147
15.11.2012, 01:05     Найти ошибку в программе #9
TopLoader, Kuzia domovenok, я согласен по поводу странного выделения памяти. Лучше воспользоваться malloc или просто выделить a[10][10]. Но, может быть, в документации codeBlocks оговаривается этот момент, и есть разумное объяснение. И хотелось бы напомнить, что проблема была заявлена, как ошибка в логике, а не синтаксисе. Считаю спор неконструктивным и не относящимся к теме.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
15.11.2012, 01:24     Найти ошибку в программе #10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Разве так можно выделять динамический массив в Си?
не поверишь можно( но не у всех)
вот ответ от Evg в моей теме про константы
кое-что про const
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.11.2012, 01:27     Найти ошибку в программе #11
Цитата Сообщение от ValeryS Посмотреть сообщение
не поверишь можно( но не у всех)
вот ответ от Evg в моей теме про константы
кое-что про const
Не поверишь, но если бы m и n были бы константы, я бы слова не сказал.
Цитата Сообщение от TopLoader Посмотреть сообщение
cin >> m;
int a[n][m];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2012, 01:37     Найти ошибку в программе
Еще ссылки по теме:

Найти ошибку в программе C++
C++ Найти ошибку в программе
C++ Найти ошибку в программе

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
15.11.2012, 01:37     Найти ошибку в программе #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Не поверишь, но если бы m и n бы ли б константы, я бы слова не сказал.
ты видать тему не полностью поднял там как раз и рассуждалось о разном поведении констант
вот мой текст(стартер)
Цитата Сообщение от ValeryS Посмотреть сообщение
вот так ведь правильно
C++
1
2
const int d=5;
int n[d];
т.е размер массива известен до исполнения
и так правильно
C++
1
2
3
int x;
std::cin >> x;
const int XXX = x;
переменная XXX будет известна при исполнении
а вот так уже неправильно ошибка компиляциии
C++
1
2
3
std::cin >> x;
const int XXX = x;
int n[XXX];
на что ответили
Цитата Сообщение от yekka Посмотреть сообщение
во дела! а почему такое вообще компилится? ведь для создания массива его размер должен быть известен на этапе компиляции, разве не так?
и тогда уже Evg ответил что ГНУс имеет собственные виды на стандарт
Yandex
Объявления
15.11.2012, 01:37     Найти ошибку в программе
Ответ Создать тему
Опции темы

Текущее время: 14:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru