• 1
  • 2
2015-04-21, 17:09
  #13
Medlem
Citat:
Ursprungligen postat av Big-Endian
Då behöver du inte arrayen (om du inte planerar att göra andra saker med talen i senare övningar). Skippa den, spara en massa minne och bli av med den otrevliga maxgränsen på 100 tal.



Kod:
#include <limits.h>
#include <stdio.h>

int main(void) {
    int current, max;

    max = INT_MIN;
    while (1) {
        fputs("skriv in ett tal: ", stdout);
        fflush(stdout);
        if (scanf("%d", &current) != 1) break;
        if (current > max) {
            max = current;
        }
        printf("det största talet hittills är %d\n", max);
    }
    return 0;
}

Absolut bättre om man bara ska testa största och minsta tal i ett "flöde" av inkommande tal. Beror helt enkelt på vad syftet med detta program är.
__________________
Senast redigerad av sampanl 2015-04-21 kl. 17:39.
Citera
2015-04-22, 22:26
  #14
Medlem
smellyproofs avatar
Citat:
Ursprungligen postat av masterflex22
Problemen ligger i raderna jag markerat
Eftersom du börjar med att incrementera ii innan du läser in första värdet så läggs det värdet på plats 1 i arrayen elements. Du läser sedan ut första max från index 0 i arrayen. Den platsen är helt oinitierad och kan innehålla precis vad som helst, dvs troligen ett tal större än vad du matar in.

Ett annat problem med att incrementera ii först är att du kommer läsa in ditt 100'e tal utanför din array eftersom ii då kommer vara 100, men arrayen sträcker sig bara mellan 0 och 99. När du gör det kan du korrumpera stacken och orsaka alla möjliga jobbiga crasher. I just det här fallet är det nog igen fara dock.

Så för att fixa programmet borde du flytta "ii++" till längst ner i while-loopen.
Tack, bra förklarat det löste biffen.
Citera
2015-04-27, 01:08
  #15
Medlem
smellyproofs avatar
Har ett problem där när jag nu istället vill skruva ut medelvärdet. Jag börjar med att skriva ut summan. Men det blir fel summa varför? Kolla det fetstilade.
Kod:
#include <stdio.h>
int main(){
    int element[100], ii, i, max, min; 
    int summa = 0;
    
  ii = 0;
    while( ii < 100) {
		printf("\n Mata in ett tal: ");
    scanf("%d", &element[ii]);
    
   
    /* Skriver ut det största elementet */
    max = element[0];
    for(i=0;i<=ii;++i){
       if(element[i]>max) 
           max=element[i];
    }
    printf(" \n Största elementet är: %d", max);
    
    /* Skriver ut det minsta elementet */
    min = element[0];
    for(i=0;i<=ii;++i)  
    {
       if(element[i]<min) 
           min=element[i];
    }
    printf("\nMinsta elementet är: %d",min);
  
      /* Skriver ut medelvärdet av elementen */
    for(i=0;i<=ii;i++)
    {
		summa = summa +  element[i];
    }
    
    
    ii++;
  
printf("\nMedelvärdet är %d: ", summa);
}
}
Citera
2015-04-27, 02:47
  #16
Medlem
Citat:
Ursprungligen postat av smellyproof
Har ett problem där när jag nu istället vill skruva ut medelvärdet. Jag börjar med att skriva ut summan. Men det blir fel summa varför? Kolla det fetstilade.
Kod:
#include <stdio.h>
int main(){
    int element[100], ii, i, max, min; 
    int summa = 0;
    
  ii = 0;
    while( ii < 100) {
		printf("\n Mata in ett tal: ");
    scanf("%d", &element[ii]);
    
   
    /* Skriver ut det största elementet */
    max = element[0];
    for(i=0;i<=ii;++i){
       if(element[i]>max) 
           max=element[i];
    }
    printf(" \n Största elementet är: %d", max);
    
    /* Skriver ut det minsta elementet */
    min = element[0];
    for(i=0;i<=ii;++i)  
    {
       if(element[i]<min) 
           min=element[i];
    }
    printf("\nMinsta elementet är: %d",min);
  
      /* Skriver ut medelvärdet av elementen */
    for(i=0;i<=ii;i++)
    {
		summa = summa +  element[i];
    }
    
    
    ii++;
  
printf("\nMedelvärdet är %d: ", summa);
}
}
Kod:
printf("\nMinsta elementet är: %d"min);

        
/* Skriver ut medelvärdet av elementen */
        
for (0<= iii++)
        {
            
summa += element[i];
        }

        
ii++;
        
printf("\nMedelvärdet är %d: ", (summa/ii));

        
summa 0;
    } 

vet du ens hur man räknar ut ett medelvärde? sedan msåte du återställa variabeln summa till 0

För övrigt tycker jag du ändrar summa till en double och formateringen när du skriver ut medelvärdet. Kod:

Kod:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(){
    
int element[100], ii=0i=0max=0min=0;
    
double summa 0;

    
ii 0;
    while (
ii 100
    {
        
printf("\n Mata in ett tal: ");
        
scanf("%d", &element[ii]);

        
/* Skriver ut det största elementet */
        
max element[0];
        for (
0<= ii; ++i){
            if (
element[i]>max)
                
max element[i];
        }
        
printf(" \n Största elementet är: %d"max);

        
/* Skriver ut det minsta elementet */
        
min element[0];
        for (
0<= ii; ++i)
        {
            if (
element[i] < min)
                
min element[i];
        }
        
printf("\nMinsta elementet är: %d"min);

        
/* Skriver ut medelvärdet av elementen */
        
for (0<= iii++)
        {
            
summa += element[i];
        }

        
ii++;
        
printf("\nMedelvärdet är %.2f: ", (summa/ii));

        
summa 0;
    }


sedan undrar jag om du har något emot for-loopar? du deklarerar även i "globalt" för hela main, ha för vana att kapsla in dina forloopar, det kan bli riktigt skumma fel annars.

Vad är felet med att koden ser ut såhär, tex?:


När man sysslar med flera nestlade loopar kan det vara bra att döpa uppräknaren till t.ex i,j,k,l osv. Anledning? du håller reda hur många nivåer den nestlade loopen består av. Att döpa en variabel till ii "make no sense"
__________________
Senast redigerad av sampanl 2015-04-27 kl. 03:12.
Citera
2015-04-27, 11:39
  #17
Medlem
smellyproofs avatar
Citat:
Ursprungligen postat av sampanl
text
Bra svar. Så "+=" betyder alltså addera alla element från en array? Då måste man ju nollställa summa varje gång ja precis.

Double ska jag använda för medelvärdet kan ju ibland vara något annat än ett heltal.

Sen så varför jag använder en while och for loop är för att de är en grundläggande skoluppgift så de är bra att ha med olika moment. Kommer bara läsa den här grundläggande programmeringskursen för läser egentligen något anant så behöver inte fördjupa mig onödigt mycket just nu.
Citera
2015-04-27, 14:10
  #18
Medlem
Citat:
Ursprungligen postat av smellyproof
Bra svar. Så "+=" betyder alltså addera alla element från en array? Då måste man ju nollställa summa varje gång ja precis.

Double ska jag använda för medelvärdet kan ju ibland vara något annat än ett heltal.

Sen så varför jag använder en while och for loop är för att de är en grundläggande skoluppgift så de är bra att ha med olika moment. Kommer bara läsa den här grundläggande programmeringskursen för läser egentligen något anant så behöver inte fördjupa mig onödigt mycket just nu.

Kod:
summa += array[idx
är lika som
Kod:
summa summa + array[idx

Uttrycket betyder inte att addera alla element från en array. Men det är det du gör eftersom du går igenom en loop.
__________________
Senast redigerad av sampanl 2015-04-27 kl. 14:12.
Citera
2015-04-27, 16:50
  #19
Medlem
smellyproofs avatar
ta bort
__________________
Senast redigerad av smellyproof 2015-04-27 kl. 17:02.
Citera
2015-04-27, 17:02
  #20
Medlem
smellyproofs avatar
ta bort
Citera
2015-04-27, 19:06
  #21
Medlem
Citat:
Ursprungligen postat av smellyproof
Double ska jag använda för medelvärdet kan ju ibland vara något annat än ett heltal.

Summan är ett heltal, den kan vara int. Fast om du inte tänker checka för overflow är den största heltalstypen ett bättre val: long i standard C eller long long i C99. Det är inte förrän du räknar ut medelvärdet som du behöver float, double eller long double (C99).

Om du inte tänker använda en flyttalstyp som skydd mot overflow förstås. Då blir summan mer och mer inexakt, och när den blir tillräckligt stort påverkar adderingarna till sist den inte alls, eller så blir det INF eller något. I det här fallet, och i den här versionen av programmet, kanske det är då det ska fungera, men flyttal tror jag i regel man ska undvika för heltalslagring och -beräkningar.

Citat:
Ursprungligen postat av smellyproof
Kommer bara läsa den här grundläggande programmeringskursen för läser egentligen något anant så behöver inte fördjupa mig onödigt mycket just nu.

Kan ändå vara värt att nämna att du slösar bort väldigt mycket tid på att göra samma summeringar om och om igen, och att det skulle räcka med några variabler (antal, max, min och summa) istället för en array. Om du redan har räknat ut summan av elementen 0-67, är det ju onödigt att nästa gång i loopen räkna ut denna summa igen, plus 68.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in