Vinnaren i pepparkakshustävlingen!
2017-10-09, 16:28
  #2881
Medlem
smellyproofs avatar
Citat:
Ursprungligen postat av SuperSizeMe
Uppgiften är redan klar. Det står ju inte att du behöver anropa funktionen.
Man ska även visa exempel på anrop till funktionen. Är detta korrekt gjort?
Kod:
#include <stdio.h>
void addera( int tal1, int tal2)
{
int summa = tal1 + tal2;
printf("\n Summan av de två talen är: %d \n",summa);

}


int main()
{
int tal1, tal2;

printf("\nSkriv in heltal n1: ");
scanf("%d", &tal1);
printf("\nSkriv in heltal n2: ");
scanf("%d", &tal2);

addera(tal1, tal2);

return 0;
}


Inmatning av tal1 och tal2 sker ju i main här.
__________________
Senast redigerad av smellyproof 2017-10-09 kl. 16:32.
Citera
2017-10-09, 16:42
  #2882
Avstängd
Citat:
Ursprungligen postat av smellyproof
Man ska även visa exempel på anrop till funktionen. Är detta korrekt gjort?
Kod:
#include <stdio.h>
void addera( int tal1, int tal2)
{
int summa = tal1 + tal2;
printf("\n Summan av de två talen är: %d \n",summa);

}


int main()
{
int tal1, tal2;

printf("\nSkriv in heltal n1: ");
scanf("%d", &tal1);
printf("\nSkriv in heltal n2: ");
scanf("%d", &tal2);

addera(tal1, tal2);

return 0;
}


Inmatning av tal1 och tal2 sker ju i main här.

Inmatning från användare och inparametrar till en funktion är olika saker. Det första är interaktion mellan användaren och programmet, det andra internt mellan delar av programmet. Variablerna tal1 och tal2 i main() är helt skilda från variablerna med samma namn i addera(), och kunde ha hetat olika saker. Kanske de borde göra det också i ett så litet program, för att undvika förvirring. Du hade kanske inte ens behövt fråga användaren efter talen, utan bara anropat t.ex. `addera(1, 2)`, men det är helt korrekt som det är och gcc ger inga varningar.
__________________
Senast redigerad av SuperSizeMe 2017-10-09 kl. 16:45.
Citera
2017-10-09, 16:48
  #2883
Medlem
smellyproofs avatar
Citat:
Ursprungligen postat av SuperSizeMe
Inmatning från användare och inparametrar till en funktion är olika saker. Det första är interaktion mellan användaren och programmet, det andra internt mellan delar av programmet. Variablerna tal1 och tal2 i main() är helt skilda från variablerna med samma namn i addera(), och kunde ha hetat olika saker. Kanske de borde göra det också i ett så litet program, för att undvika förvirring. Du hade kanske inte ens behövt fråga användaren efter talen, utan bara anropat t.ex. `addera(1 + 2)`, men det är helt korrekt som det är och gcc ger inga varningar.
Okej tack för att du klargjorde.
Citera
2017-10-10, 15:47
  #2884
Medlem
smellyproofs avatar
Ska skriva en funktion som tar emot två flyttal och kollar om de är lika stora. Om de är lika stora ska true returneras annars false.

Vad är fel med denna kod? Den verkar alltid returerna 0 alltså false.

Kod:
float flyttal(float tal1, float tal2)
{
if (tal1 == tal2)
return 1;
else
return 0;
}
Citera
2017-10-10, 17:07
  #2885
Medlem
splitfaces avatar
Citat:
Ursprungligen postat av smellyproof
Ska skriva en funktion som tar emot två flyttal och kollar om de är lika stora. Om de är lika stora ska true returneras annars false.

Vad är fel med denna kod? Den verkar alltid returerna 0 alltså false.

Kod:
float flyttal(float tal1, float tal2)
{
if (tal1 == tal2)
return 1;
else
return 0;
}
Generellt inom programmering skall flyttal ej jämföras direkt mot varandra. En lätt googlesökning får dig på rätt spår.
Citera
2017-10-10, 17:22
  #2886
Medlem
smellyproofs avatar
Citat:
Ursprungligen postat av splitface
Generellt inom programmering skall flyttal ej jämföras direkt mot varandra. En lätt googlesökning får dig på rätt spår.
Okej tack för info.
Citera
2017-10-10, 23:42
  #2887
Avstängd
Citat:
Ursprungligen postat av smellyproof
Ska skriva en funktion som tar emot två flyttal och kollar om de är lika stora. Om de är lika stora ska true returneras annars false.

Vad är fel med denna kod? Den verkar alltid returerna 0 alltså false.

Kod:
float flyttal(float tal1, float tal2)
{
if (tal1 == tal2)
return 1;
else
return 0;
}

Inget fel med koden, förutom "==" eftersom flyttal är inexakta istället för att kunna rinna under/över. Det ger mig en lugnande känsla i skrevet att kunna använda värden utan att bry mig om för stora eller för små värden, och dessutom kunna använda decimaler, men flyttal är tyvärr fortfarande lagrade i ett ändligt antal byte.

Ju större tal desto större inexakthet, men under en viss gräns tror jag att ett heltal lagrat i flyttalsform är OK att jämföra med ett annat eftersom de alltid (?) lagras som: ett tecken (plus eller minus), ett heltal och en exponent. Men huruvida t.ex. `sqrt(81.0) == 9.0` alltid går att lita på har jag inte lyckats få svar på ens på Stack Overflow.

För att jämföra flyttal, som är smittade av inexakthet, måste du veta hur smittade de maximalt kan vara, vilket beror på vilka operationer du har utfört på dem tidigare, och välja en gräns där de anses vara lika. En funktion som ska jämföra två flyttal borde nog ha ett tredje argument: den tillåtna felmarginalen.

Felet kan vara positivt eller negativt, så ett sätt är att använda funktionen abs() från matematikbiblioteket och göra det positivt, sen jämföra det m.h.a. operatorerna "<=" eller ">=" (eller blir det "<" och ">"?) med ett konstant positivt värde. Kom ihåg att inkludera <math.h> och länka till matematikbiblioteket. Det är det enda bibliotek inbyggt i C som kompilatorer inte länkar till automatiskt.

Nej, skit i matematikbiblioteket, det kanske inte är tillgängligt på en begränsad enchipsdator och är inte värt att kräva bara för detta problem. En egen abs()-funktion skiver man hur lätt som helst.

PS: "double" är egentligen den naturliga flyttalstypen i C. Den är motsvarigheten till heltalens "int", den typ som processorn kan arbeta med snabbast.
Citera
2017-10-11, 11:01
  #2888
Medlem
smellyproofs avatar
Citat:
Ursprungligen postat av SuperSizeMe
Felet kan vara positivt eller negativt, så ett sätt är att använda funktionen abs() från matematikbiblioteket och göra det positivt, sen jämföra det m.h.a. operatorerna "<=" eller ">=" (eller blir det "<" och ">"?) med ett konstant positivt värde.
Jo klurade ut det där själv när jag testade min kod. Jag kan dock inte förstå varför en dator egentligen ska ha svårt att direkt jämföra två flyttal. Den har ju tyldigen inte problem med att jämföra heltal. Flyttal är ju bara tal med fler decimaler så en dator som tänker logiskt borde inte ha några problem med detta men vad vet jag.
Citera
2017-10-11, 20:11
  #2889
Medlem
Jag vill fixa utskrift av talen 1-20 i omvänd
storleksordning.

Här är min kodning, men det funkar inte..

Vad är det jag har ställt till med??

#include <stdio.h>

int main()
{
int n, reverse = 0;

printf("20\n");
scanf("%d", &n);

while (n != 0)
{
reverse = reverse * 10;
reverse = reverse + n%10;
n = n/10;
}

printf("Reverse of entered number is = %d\n", reverse);

return 0;
}
Citera
2017-10-11, 21:57
  #2890
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av rudimentarperson
Jag vill fixa utskrift av talen 1-20 i omvänd
storleksordning.

Här är min kodning, men det funkar inte..

Vad är det jag har ställt till med??

#include <stdio.h>

int main()
{
int n, reverse = 0;

printf("20\n");
scanf("%d", &n);

while (n != 0)
{
reverse = reverse * 10;
reverse = reverse + n%10;
n = n/10;
}

printf("Reverse of entered number is = %d\n", reverse);

return 0;
}
Du har glömt att kommentera koden. Skriv ner var olika kodstycken gör.
Citera
2017-10-12, 07:03
  #2891
Medlem
Citat:
Ursprungligen postat av rudimentarperson
Jag vill fixa utskrift av talen 1-20 i omvänd
storleksordning.

Här är min kodning, men det funkar inte..

Vad är det jag har ställt till med??

#include <stdio.h>

int main()
{
int n, reverse = 0;

printf("20\n");
scanf("%d", &n);

while (n != 0)
{
reverse = reverse * 10;
reverse = reverse + n%10;
n = n/10;
}

printf("Reverse of entered number is = %d\n", reverse);

return 0;
}
Varför inte bara en forloop?
Citera
2017-10-12, 08:04
  #2892
Medlem
Citat:
Ursprungligen postat av Gottisborgen
Varför inte bara en forloop?


Hur menar du?

hur skulle det se ut då?
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