räkna ut maxvärdet i arrayen

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Vinnaren
    Medlem
    • 2005-09-18
    • 858

    #1

    räkna ut maxvärdet i arrayen

    Hej


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

    Har hittills följande kod:
    Code:
    #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 S
    Medlem
    • 2002-12-15
    • 5484

    #2
    [kod] int* max = &v[0];
    for (int i = 1; i < size; ++i)
    {
    if (v[i] > *max)
    {
    max = &v[i];
    }
    }

    cout << "Max: " << *max << endl;[/kod]

    Comment

    • Vinnaren
      Medlem
      • 2005-09-18
      • 858

      #3
      tack

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

      Code:
          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?

      Comment

      • spango
        Medlem
        • 2000-06-02
        • 6147

        #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.
        [kod]
        int sum = 0;
        for (int *p = v; p < v + size; ++p)
        sum += *p;
        [/kod]
        Vissa dagar är man asfalten, andra dagar är man ångvälten.
        Vissa dagar är man myggan, andra dagar är man vindrutan.

        XML är som våld; löser det inte ens problem betyder det att man använder för lite.

        Comment

        • Vinnaren
          Medlem
          • 2005-09-18
          • 858

          #5
          aha, ok. Tack

          En liten sak jag tänkte på.
          Om man vill att min utskrift ska stoppas för var 200 element som innehåller de slumpade talen.
          Hur skulle man kunna lösa det?
          Har följande kod:
          Code:
              for(int i=0; i<size; i++)               
              {
                  cout << setw(5) << v[i] << ", ";
              }

          Comment

          • Peter S
            Medlem
            • 2002-12-15
            • 5484

            #6
            Vad menar du med "stoppas"? Radbrytning? Eller skall loopen avslutas?[kod] 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;

            }
            [/kod]

            Comment

            • Vinnaren
              Medlem
              • 2005-09-18
              • 858

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

              Comment

              • Vinnaren
                Medlem
                • 2005-09-18
                • 858

                #8
                har fått ett litet problem med mina pekare, igen

                har följande kod:
                Code:
                    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

                Comment

                • spango
                  Medlem
                  • 2000-06-02
                  • 6147

                  #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
                  [kod]
                  variant 1 - använd int:ar
                  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;
                  }
                  variant 2 - använd pekare på riktigt sätt
                  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;
                  }
                  [/kod]
                  (!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.
                  Vissa dagar är man asfalten, andra dagar är man ångvälten.
                  Vissa dagar är man myggan, andra dagar är man vindrutan.

                  XML är som våld; löser det inte ens problem betyder det att man använder för lite.

                  Comment

                  • Vinnaren
                    Medlem
                    • 2005-09-18
                    • 858

                    #10
                    aha, ok. Tack

                    Comment

                    Working...