5

My homework problem:

An array of integers named parkingTickets has been declared and initialized to the number of parking tickets given out by the city police each day since the beginning of the current year. (Thus, the first element of the array contains the number of tickets given on January 1; the last element contains the number of tickets given today.)

A variable named ndays has been declared and initialized to hold the size of the array. (Thus, if today were January 18, ndays would have the value 18; if today were February 3, ndays would have the value 34.)

In addition, a variable named mostTickets has been declared, along with a variable k .

Without using any additional variables, and without changing the values of ndays or the elements of the parkingTickets array, write some code that results in mostTickets containing the largest value found in parkingTickets .

For this, I have the following code:

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

But my exercise submitter is saying it's wrong. What's wrong with my code? I tried parkingTickets[ndays - 1] as well, but that doesn't work either.

Mike
49.8k30 gold badges119 silver badges180 bronze badges
asked May 31, 2012 at 2:07
3
  • 1
    Have you tested the code to see if it's working? It looks right to me (at first glance) Commented May 31, 2012 at 2:09
  • 3
    Shouldn't you be comparing parkingTickets[k] to mostTickets, rather than parkingTickets[ndays] (which is either the end of the array of one-past depending on how the array is declared and going by your statement)? Commented May 31, 2012 at 2:10
  • 1
    Sorry, I didn't see the "homework" tag and provided a direct solution. Deleted my answer. Commented May 31, 2012 at 2:14

4 Answers 4

12

C++ provides std::max_element as well. I doubt that your teacher wants you to use this, but it's probably good to know about the standard library.

mostTickets = *std::max_element(parking_tickets, parking_tickets + ndays)
answered May 31, 2012 at 2:15
2
  • 1
    +1 The best solution is always to stop trying to poorly reimplement the standard library. Commented May 31, 2012 at 2:32
  • Since this is homework, I suspect that a solution using std::max_element() won't be acceptable to turn in for a grade. Commented Jul 27, 2012 at 16:43
9

Your comparison is wrong. You're comparing the current element to the last element each time. What you need to do is compare the current element to mostTickets. i.e.

if(parkingTickets[k] > mostTickets)

Also, for good measure, I would recommend initializing mostTickets to being parkingTickets[0].

answered May 31, 2012 at 2:10
3
  • "Also, for good measure, I would recommend initializing mostTickets to being parkingTickets[0]." - yes, either that or 0, and if using parkingTickers[0] then the for loop could be changed to k = 1; k < ndays... to emphasise the logic. Commented May 31, 2012 at 2:15
  • 1
    And if you initialize mostTickets = parkingTickets[0];, you should check to make sure ndays > 0 (otherwise you'll read past the end of the empty array). Commented May 31, 2012 at 2:16
  • The problem with initializing it to 0, I found, is that if the array contains all negative numbers, then you run into problems. Good call by Oliver as well. You don't want an array out of bounds error. Commented May 31, 2012 at 2:17
1

Let us first analyze your solution

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]; 
 }
}

The problem with this solution is that you have not initialized the mostTickets variable and you dont have an else clause. This code would work for you.

 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]; 
 }
 }

After this mostTickets will hold the value of the largest number in the array. This solution will take O(n) to complete since we are looping through the array and some work for comparisons.

answered Jul 27, 2012 at 16:39
-2
mostTickets = parkingTickets[0]; k = 1;
while (k < ndays) {
 if (mostTickets < parkingTickets[k])
 mostTickets = parkingTickets[k];
 k++;
}
ChrisMM
10.1k19 gold badges40 silver badges59 bronze badges
answered Jan 31, 2022 at 15:31
1
  • 1
    This doesn't explain at all what is wrong with the initial code. And it is unclear why you use a while loop instead of the for loop provided in the question. Commented Feb 1, 2022 at 17:10

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.