2012-05-31 2 views
5

Моей проблема домашнего задания:C++ Поиск наибольшего числа в массиве

Массив целых чисел, названных parkingTickets был объявлен и инициализирован с числом парковочных билетов выдаваемого городской полицией каждый день с начала текущего года , (Таким образом, первый элемент массива содержит количество билетов, выданных 1 января, последний элемент содержит количество билетов, предоставленных сегодня.)

Переменная с именем ndays была объявлена ​​и инициализирована, чтобы сохранить размер массив. (Таким образом, если сегодня было 18 января, у ndays было бы значение 18, если сегодня было 3 февраля, у ndays было бы значение 34.)

Кроме того, была объявлена ​​переменная с именем mostTickets вместе с переменной k ,

Без использования каких-либо дополнительных переменных и без изменения значений ndays или элементов массива parkingTickets напишите некоторый код, который приводит к большинству тарифов, содержащих наибольшее значение, найденное в parkingTickets.

Для этого у меня есть следующий код:

for(k = 0; k < ndays; k++) { 
    if (parkingTickets[k] > parkingTickets[ndays]) { 
     mostTickets = parkingTickets[k]; 
    } 
} 

Но мое упражнение податель говорит, что это неправильно. Что случилось с моим кодом? Я тоже пробовал parkingTickets[ndays - 1], но это тоже не работает.

+1

Вы проверили код, чтобы убедиться, что он работает? Мне кажется (на первый взгляд) – Jon

+3

Разве вы не сравниваете 'parkingTickets [k]' с 'mostTickets', а не' parkingTickets [ndays] '(который либо является концом массива одного прошлого в зависимости от о том, как массив объявляется и проходит ваш оператор)? – birryree

+1

Извините, я не видел тег «домашняя работа» и предоставлял прямое решение. Удалил мой ответ. – mfontanini

ответ

9

Ваше сравнение неверно. Вы каждый раз сравниваете текущий элемент с последним элементом. Что вам нужно сделать, это сравнить текущий элемент с mostTickets. т.е.

if(parkingTickets[k] > mostTickets) 

Кроме того, для хорошей меры, я рекомендовал бы инициализацию mostTickets, чтобы быть parkingTickets [0].

+0

«Также, для хорошей меры, я рекомендовал бы инициализировать большинство тачек, чтобы быть в стоянке« Авиабилеты »[0]». - да, либо это, либо 0, и если использовать autoTickers [0], то цикл for может быть изменен на 'k = 1; k

+1

И если вы инициализируете 'mostTickets = parkingTickets [0];', вы должны проверить, чтобы 'ndays> 0' (в противном случае вы прочтете за конец пустого массива). – user

+0

Проблема с инициализацией его до 0, я обнаружил, заключается в том, что если массив содержит все отрицательные числа, то возникают проблемы. Хороший звонок Оливера. Вы не хотите, чтобы ошибка массива за пределами границ. –

11

C++ предоставляет std::max_element. Я сомневаюсь, что ваш учитель хочет, чтобы вы использовали это, но, вероятно, хорошо знать о стандартной библиотеке.

mostTickets = *std::max_element(parking_tickets, parking_tickets + ndays) 
+1

+1 Лучшим решением всегда является прекращение попытки перекомпоновки стандартной библиотеки. – ildjarn

+0

+1 ничего себе !!! Я никогда этого не знаю! – Rhexis

+0

Поскольку это домашнее задание, я подозреваю, что решение, использующее std :: max_element(), не будет приемлемым для включения в класс. –

1

Давайте сначала проанализировать ваше решение

int parkingTickets[] = {3,6,7,4,8,10,0}; 
int ndays = 7; 
for(k = 0; k < ndays; k++) { 
    if (parkingTickets[k] > parkingTickets[ndays]) { 
    mostTickets = parkingTickets[k]; 
    } 
} 

Проблема с этим решением является то, что вы не инициализируется переменная mostTickets и вы не имеете пункт еще. Этот код будет работать для вас.

int parkingTickets[] = {3,6,7,4,8,10,0}; 
int ndays = 7; 
int mostTickets = -1; 
for(int k = 0; k < ndays; k++) { 
    if (parkingTickets[k] > mostTickets) { 
    mostTickets = parkingTickets[k]; 
    } 
} 

После этого mostTickets проведет значение наибольшего числа в массиве. Это решение возьмет O (n) для завершения, так как мы перебираем массив и некоторые работы для сравнения.

Смежные вопросы