Vinnaren i pepparkakshustävlingen!
2016-12-17, 13:40
  #1
Medlem
Tja!

Jag läser C och skulle behöva lite hjälpt med en uppgift.

* användaren som mata in valfritt antal heltal mellan intervallet 0-1000 men max 100 tal får matas in. inmatningen avsluts genom att mata in ett negativt tal.

*Funktionen i programmet ska beräkna vilket av de inmatade heltalen som förekommer flest gånger samt hur många gånger detta tal finns med i arrayen. Eftersom funktionen ska beräkna två resultat så behöver variablerna där resultatet ska sparas skickas in som pekare till funktionen.

Här är min kod som jag har skrivit:
Citat:
#include<stdio.h>
#define MAX 1000

void FrekvensAnalys(int tal[], int i, int *number, int *occurances)
{
int counters[MAX];
int k, max, val, counter_nr;

for (k=0; k<i; k++)
{
counter_nr=tal[k];
counters[counter_nr]++;
}

val = 0;
max = counters[0];

for (k=1; k<MAX; k++)
{
if (counters[k] > val)

{
val = k;
max = counters[k];
}
}

*number= val;
*occurances = max;

}

int main (void)
{

char svar='j';

do

{
int tal[100];
int number, occurances;
int varde;


printf("\nMata in tal mellan 0-1000 (max 100st). Avsluta med ett negativt tal.\n");

do
{


printf("Tal:");
scanf("%d", &varde);



} while (varde>=0);


FrekvensAnalys(tal, i, &number, &occurances);
printf("Talet %d forekommer flest gonger, totalt %d ggr", number, occurances);

printf("\nVill du mata in en ny sekvens j/n?:");
scanf("%s",&svar);

} while (svar=='j');



return 0;

}
Min fråga är vad har jag gjort för fel, den skriver inte ut vilket tal som förekommer flest och inte hur många gånger heller.
__________________
Senast redigerad av oblix 2016-12-17 kl. 14:23.
Citera
2016-12-17, 13:56
  #2
Medlem
kaks avatar
1. Använd CODE taggar när du postar kod
2. Du lägger aldrig in de inmatade värdena i arrayen tal.
3. Använd din debugger. Då hade du insett vad som gick fel omedelbart.
4. Kompilera koden. Koden du postat har fel i sig.
__________________
Senast redigerad av kak 2016-12-17 kl. 13:58.
Citera
2016-12-17, 14:33
  #3
Medlem
.
__________________
Senast redigerad av reedValveFlash 2016-12-17 kl. 14:37.
Citera
2016-12-17, 14:49
  #4
Medlem
När du vill ha hjälp hör det till god ton att beskriva felet så noggrant som möjligt. Din kod kompilerar inte ens. Du får följande meddelande:

f.c: In function ‘main’:
f.c:60:27: error: ‘i’ undeclared (first use in this function)
FrekvensAnalys(tal, i, &number, &occurances);

Variablen i är inte deklarerad. Å andra sidan använder du inte i i funktionen heller, så varför är den ens med?
Citera
2016-12-17, 16:36
  #5
Medlem
Här kommer delar av problemet.
Ta ut första värdet från arrayen
Loop sedan igenom arrayen och leta rätt på alla positioner med samma värde
Vid varje träff räkna upp räknaren och sätt -2 i arrayen så att du inte använder värdet igen.

Nu har du fått fram första värdet och dess antal. Spara dess i max variablerna

Leta reda på nästa värde i arrayen som inte är satt till - 2
Gör sedan samma sak och när hela arrayen är genom loopad kolla om max variablerna ska uppdateras





Kod:
    int inArr[10] = {1, 7, 5, 5, 1, 5, 1, 3, 1, 5};
    int maxCnt;
    int maxNum;
    int currCnt = 0;
    int currNum = -2;
    int i, k;


    maxCnt = -2;
    maxNum = -2;
    currCnt = 1;
    currNum = inArr[0];

    inArr[0] = -2;

    for( k= 0; k < 10; k++)
    {
        for(i = 0; i < 10; i++)
        {
            if(currNum == inArr[i] && inArr[i] != -2)
            {
               inArr[i] = -2;
               currCnt++;
            }
        }

        if(maxCnt == -2)
        {
            maxCnt = currCnt;
            maxNum = currNum;
        }
        else if(maxCnt < currCnt)
        {
            maxCnt = currCnt;
            maxNum = currNum;
        }


        i = 0;
        while(i < 10)
        {
            if(inArr[i] != -2)
            {
                currNum = inArr[i];
                currCnt = 1;
                inArr[i] = -2;
                break;
            }
            else
            {
                currCnt = -2;
            }
            i++;
        }

    }


    if(maxCnt < currNum)
    {
        maxCnt = currCnt;
        maxNum = currNum;
    }

    printf("number=%d, count=%d\n", maxNum, maxCnt);
__________________
Senast redigerad av reedValveFlash 2016-12-17 kl. 16:39.
Citera
2016-12-17, 22:17
  #6
Medlem
Tack, löste problemet!
Citera
2017-04-21, 23:09
  #7
Medlem
Xer0s avatar
En relaterad fråga.

Går det inte att retunera en struct på stacken i stället för att ha två pekare som inparametrar?

Finns det någon anledning varför man inte skulle vilja göra detta? Låt säga att man typdefar structen i en headerfil och låter den innehålla 2 intar?
Citera
2017-04-22, 02:14
  #8
Medlem
Simplare?
Kod:
int iv[MAX];
scanf("%d", &i);
v[i]++; 
Citera
2017-04-22, 02:50
  #9
Medlem
Citat:
Ursprungligen postat av Xer0
En relaterad fråga.

Går det inte att retunera en struct på stacken i stället för att ha två pekare som inparametrar?

Finns det någon anledning varför man inte skulle vilja göra detta? Låt säga att man typdefar structen i en headerfil och låter den innehålla 2 intar?
De returneras ej över stacken utan vanligtvis genom processorregister. Det går att returnera objekt i C. Skulle storleken på objekten överstiga arkitekturens wordsize så kommer kompilatorn att finna på råd.Till exempel genom att komplettera koden med ett anrop till memcpy för en pekare till mottagande variabel.

Eller så gör du det själv, det föredrar jag .
Citera
2017-04-22, 04:34
  #10
Medlem
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback