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", ¤t) != 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.
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.
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);
}
}
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 (i = 0; i <= ii; i++)
{
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:
int main(){
int element[100], ii=0, i=0, max=0, min=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 (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 += 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.
int element[SIZE], max = 0, min = 0;
double summa = 0;
for (int i = 0; i < SIZE; ++i)
{
if (i > 0)
printf("\nMedelvärdet är %.2f: ", (summa/i));
summa = 0;
printf("\n Mata in ett tal: ");
scanf("%d", &element[i]);
/* Skriver ut det största elementet */
max = element[0];
for (int j = 0; j <= i; ++j){
if (element[j]>max)
max = element[j];
}
printf(" \n Största elementet är: %d", max);
/* Skriver ut det minsta elementet */
min = element[0];
for (int j = 0; j <= i; ++j)
{
if (element[j] < min)
min = element[j];
}
printf("\nMinsta elementet är: %d", min);
/* Skriver ut medelvärdet av elementen */
for (int j = 0; j <= i; j++){
summa += element[j];
}
}
}
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.
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.
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.
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.
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!