webForumDet fria alternativet

räkna ut maxvärdet i arrayen

9 svar · 792 visningar · startad av Vinnaren

VinnarenMedlem sedan sep. 2005833 inlägg
#1

Hej

Jag behöver lite hjälp med mitt program jag håller på med.

Har hittills följande kod:

#include "stdafx.h"
#include <iostream>   
#include <iomanip>   
using namespace std;

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int size;
    cout << "Ange ett heltal: ";
    cin >> size;

    int *v = new int[size];                 

    srand ( time(NULL) );                             

    for(int i=0; i<size; i++)               
    {
        v[i] = rand() % 10000 - 5000;       
    }

    for(int i=0; i<size; i++)              
    {
        cout << setw(5) << v[i];
    }

	return 0;
}

Denna slumpar ett antal tal samt skriver ut dessa. Nu vill jag räkna ut Maxvärdet med hjälp av en pekare. När den har loopat igenom arrayen ska den peka på det största slumpade talet som finns i arrayen.

Hur löser jag detta??

Tacksam för all hjälp

Peter SMedlem sedan dec. 20025 483 inlägg
#2
    int* max = &v[0];
    for (int i = 1; i < size; ++i)
    {
        if (v[i] > *max)
        {
            max = &v[i];
        }
    }

    cout << "Max: " << *max << endl;
VinnarenMedlem sedan sep. 2005833 inlägg
#3

tack :bire

Om jag nu även vill räkna ut summan av talen med hjälp av pekaren. Har provat följande kod:

    int *sum = &v[0];
    for (int i = 1; i < size; ++i)
    {
        sum += &v[i];
    }

men det ger felmeddelandet:
error C2110: '+' : cannot add two pointers

Hur löser jag detta? :i

spangoMedlem sedan juni 20008 205 inlägg
#4

sum ska inte vara en pekare, det ska vara en int. Som du gör nu tar du adressen till första elementet i v och lägger i sum, och försöker sen loopa över v och lägga till adressen till varje element till sum. Det är inte vettigt att försöka addera två pekare (pekare + int går dock bra, det är ungefär samma sak som att indexera i en array).

Dessutom är int *pekare = &array[0] bara är en onödigt lång version av int *pekare = array eftersom en pekare och en array är samma sak.

int sum = 0;
for (int *p = v; p < v + size; ++p)
    sum += *p;
VinnarenMedlem sedan sep. 2005833 inlägg
#5

aha, ok. Tack :bire

En liten sak jag tänkte på.
Om man vill att min utskrift ska stoppas för var 200:e element som innehåller de slumpade talen.
Hur skulle man kunna lösa det?
Har följande kod:

    for(int i=0; i<size; i++)               
    {
        cout << setw(5) << v[i] << ", ";
    }
Peter SMedlem sedan dec. 20025 483 inlägg
#6

Vad menar du med "stoppas"? Radbrytning? Eller skall loopen avslutas?

    for(int i=0; i<size; i++)               
    {
        cout << setw(5) << v[i] << ", ";
        // radbrytning
        if ((i+1) % 200 == 0) cout << endl;
        // avbryt
        // if ((i+1) % 200 == 0) break;

    }
VinnarenMedlem sedan sep. 2005833 inlägg
#7

tack Peter S och spango för hjälpen, nu funkar det perfa :p

VinnarenMedlem sedan sep. 2005833 inlägg
#8

har fått ett litet problem med mina pekare, igen :r

har följande kod:

    int *max = v[0];
    int *min = v[0];
    int sum = 0;

    for (int *p = v; p < v + size; ++p)
    {
        if (*p > *max)
        {
            *max = *p;
        }

        if (*p < *min)
        {
            *min = *p;
        }

        sum+=*p;

    }

men får felmeddelandet:

'initializing' : cannot convert from 'int' to 'int *'

Vad har jag gjort för fel och hur löser jag det?

Tacksma för all hjälp :stud

spangoMedlem sedan juni 20008 205 inlägg
#9

Du deklarerar max och min som int*, men du initierar dem till vanliga int:ar (eftersom v[0] är en avreferering av en pekare). Antingen får du göra dem till vanliga int:ar, eller så får du låta dem peka på något istället. Dessutom skulle du i ditt nuvarande sätt skriva över v[0] med såväl det största som det minsta talet :)

[i]variant 1 - använd int:ar[/i]
    int max = v[0];
    int min = v[0];
    int sum = 0;
    for (int *p = v; p < v + size; ++p)
    {
        if (*p > max)
            max = *p;
        if (*p < min)
            min = *p;
        sum+=*p;
    }
[i]variant 2 - använd pekare på riktigt sätt[/i]
    int *max = NULL;
    int *min = NULL;
    int sum = 0;
    for (int *p = v; p < v + size; ++p)
    {
        if (!max || *p > *max)
            max = p;
        if (!min || *p < *min)
            min = p;
        sum+=*p;
    }

(!max och !min är ekvivalent med max == NULL resp. min == NULL)

En fin sak med nummer två är att den dessutom funkar bra även om size råkar vara 0, vilket inte ettan gör. Om så är fallet är pekarna max och min NULL när loopen är slut, annars pekar de på elementen i v som störst resp. minst värde.

VinnarenMedlem sedan sep. 2005833 inlägg
#10

aha, ok. Tack :bire

132 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)