Gjest Slettet+5132 Skrevet 27. oktober 2017 Del Skrevet 27. oktober 2017 Skal sies at eksempelet kan gjøres enklere via enten funksjonspekere (veldig generell tilnærming, først bør du lære deg å lage C funksjoner) eller bruke et array av koeffisienter, den siste er hva jeg ville anbefalt. For å beskrive det i litt grove trekk: Du regner alltid tilbake til Celcius via Hvor T er temperaturen i den andre temperaturenhenten og a og b er konstanter som avhenger av temperaturenheten gitt inn. Du kan da lage et array a og b (for a og b), som hver temperatur har koeffisienter for a og b. Eg void main() { /* ... litt andre thing her */ /* Vi antar at temperatur til celsius er paa formen T_C = a[temperatur_type-1] + b[temperatur_type-1] */ double a[] = {/*element 0 */ <koeffisient_til_celcius >(1), /*element 1 */ <koeffisient til temperatur 2> , /*element 2 osv*/}; double b[] = {/*element 0 */ <translasjon til celicus> (0), /*element 1 */ <translasjon til temperatur 2>, /*element 2 osv*/}; /* Du kan ogsaa lagre inn temperaturnavn hvis du vil skrive dem ut enkelt */ const char ** temperature_names ={"Celcius", "delisle", /**osv*/}; /* merk ingen if her, alt skjer via samme kode */ scanf("%d", &temperature_type); printf("Please enter temperature in celsius: "); scanf("%f", &calculation); /* Her kommer det viktige: Du aksesserer arrays med heltall, og foerste element er alltid 0, * Siden du nummerer temperaturtypene med 1 som start, maa du trekke fra 1 for a faa riktig array * indeks */ celsius = a[temperature_type-1]*calculation + b[temperature_type-1]; printf("The temperature was given in %s and was \t\t%6.2f\n", temperature_names[temperature_type-1]); /* regn ut de andre temperaturene her:*/ delisle = ((100.00 - celsius) * (3.00 / 2.00)); fahrenheit = ((celsius * 1.80) + 32.00); kelvin = (celsius + 273.15); newton = (celsius * (33.00 / 100.00)); rankine = ((celsius + 273.15) * (9.00 / 5.00)); romer = ((celsius * (21.00 / 40.00)) + 7.50); printf( "\nThe temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in r\x9bmer is \t\t %6.2f \n\n", romer); } Lenke til kommentar
Teza Skrevet 27. oktober 2017 Forfatter Del Skrevet 27. oktober 2017 (endret) Hva som skrives ut og hvordan det gjøres er "ikke" viktig, programmet skal ikke brukes til annet enn å lære litt C. Æ, ø og å får jeg komme tilbake til, ved å se på forslaget til PingEnt. Ønsker å lage programmet slik at alle beregningene samles på ett sted, slik at de ikke gjentas flere steder i koden. Grunnen til dette er at det blir lettere å gjøre endringer dersom man oppdager feil. Jeg har gått gjennom resultatene av beregningene (da de var inkludert i IF setningene) og ser at noe er feil. Er det bedre måter å gjøre det på, eller er det "void" jeg bør sette meg inn i, ala slik du har gjort det? Edit: Kan ikke stole på wikipedia, der er formlene feil Endret 27. oktober 2017 av Teza Lenke til kommentar
Emancipate Skrevet 27. oktober 2017 Del Skrevet 27. oktober 2017 Bygg på eksempelet mitt med void convert_temperatures(float celsius), det er den beste måten å gjøre det på ut ifra det du kan nå. Dette er en "funksjon", dvs. en liste med statements som du kan kjøre fra andre steder i koden. Fullfør endringen av programmet ved å legge alle temperaturene inn i funksjonen, og la alle if-branchene kalle opp funksjonen (sånn som det er vist i de to første if-branchene). Lenke til kommentar
Teza Skrevet 27. oktober 2017 Forfatter Del Skrevet 27. oktober 2017 Fullfør endringen av programmet ved å legge alle temperaturene inn i funksjonen, og la alle if-branchene kalle opp funksjonen (sånn som det er vist i de to første if-branchene). Denne fungerte, dog en bug jeg kom over da jeg kjørte det: Hvis jeg bruker komma i stedet for punktum i temperaturen, så henger programmet? #include <stdio.h> int main() { /* celsius = (fahrenheit - 32.) * (5. / 9.) celsius = kelvin - 273.15 celsius = (rankine - 491.67) * (5. / 9.) celsius = (delisle + 100) * (2. / 3.) celsius = newton * (100. / 33.) celsius = reaumur * (5. / 4.) celsius = (romer - 7.5)* (40. / 21.) delisle = (celsius * (3. / 2.)) - 100; fahrenheit = (celsius * 1.80) + 32.; kelvin = celsius + 273.15; newton = celsius * (33. / 100.); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4. / 5.); romer = (celsius * (21. / 40.)) + 7.50; Formlene er verifisert mot www.metric-conversions.org */ while(1){ printf("Temperature conversion tool\n\n"); printf("Choose what type to convert from:\n"); printf("[1] Celsius\n"); printf("[2] Delisle\n"); printf("[3] Fahrenheit\n"); printf("[4] Kelvin\n"); printf("[5] Newton\n"); printf("[6] Rankie\n"); printf("[7] Reaumur\n"); printf("[8] Romer\n"); printf("[0] Avslutt programmet\n\n"); printf("Please enter temperature type: "); int temperature_type; float celsius, fahrenheit, kelvin, rankine, delisle, newton, reaumur, romer, convert_to_celsius; void convert_temperatures( float celsius) { delisle = (celsius * (3. / 2.)) - 100; fahrenheit = (celsius * 1.80) + 32.; kelvin = celsius + 273.15; newton = celsius * (33. / 100.); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4. / 5.); romer = (celsius * (21. / 40.)) + 7.50; } scanf("%d", &temperature_type); if (temperature_type == 1) { printf("Please enter temperature in celsius: "); scanf("%f", &celsius ); convert_temperatures(celsius); printf( "\nThe temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); } else if (temperature_type == 2) { printf("Please enter temperature in delisle: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius + 100) * (2. / 3.); convert_temperatures(celsius); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); } else if (temperature_type == 3) { printf("Please enter temperature in fahrenheit: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 32.) * (5. / 9.); convert_temperatures(celsius); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); } else if (temperature_type == 4) { printf("Please enter temperature in kelvin: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius - 273.15; convert_temperatures(celsius); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); } else if (temperature_type == 5) { printf("Please enter temperature in newton: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (100. / 33.); convert_temperatures(celsius); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); } else if (temperature_type == 6) { printf("Please enter temperature in rankine: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 491.67) * (5. / 9.); convert_temperatures(celsius); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); } else if (temperature_type == 7) { printf("Please enter temperature in reaumur: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (5. / 4.); convert_temperatures(celsius); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in romer is \t\t %6.2f \n", romer); } else if (temperature_type == 8) { printf("Please enter temperature in romer: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 7.5)* (40. / 21.); convert_temperatures(celsius); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); } else if (temperature_type == 0) { exit(0); } else { printf("Please choose a number, 1-8, from above!\n\n"); } system ("pause"); system("cls"); } // while return 0; } // main Lenke til kommentar
kjeita Skrevet 27. oktober 2017 Del Skrevet 27. oktober 2017 (endret) Correct. Kompilatoren benytter ikke det franske systemet for desimalseperasjon, som vi i Norge gjør, men heller den engelske si stilen som usa og Storbritannia bruker. Eksempel: Bruk av . float tall = 5.0; Bruk av , void toinnput ( int tall, char tekst ); Det er vel mye grønt. Hva med å samle utskriving i en funksjon? #include <stdio.h> int main() { /* celsius = (fahrenheit - 32.) * (5. / 9.) celsius = kelvin - 273.15 celsius = (rankine - 491.67) * (5. / 9.) celsius = (delisle + 100) * (2. / 3.) celsius = newton * (100. / 33.) celsius = reaumur * (5. / 4.) celsius = (romer - 7.5)* (40. / 21.) delisle = (celsius * (3. / 2.)) - 100; fahrenheit = (celsius * 1.80) + 32.; kelvin = celsius + 273.15; newton = celsius * (33. / 100.); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4. / 5.); romer = (celsius * (21. / 40.)) + 7.50; Formlene er verifisert mot www.metric-conversions.org */ while(1){ printf("Temperature conversion tool\n\n"); printf("Choose what type to convert from:\n"); printf("[1] Celsius\n"); printf("[2] Delisle\n"); printf("[3] Fahrenheit\n"); printf("[4] Kelvin\n"); printf("[5] Newton\n"); printf("[6] Rankie\n"); printf("[7] Reaumur\n"); printf("[8] Romer\n"); printf("[0] Avslutt programmet\n\n"); printf("Please enter temperature type: "); int temperature_type; float celsius, fahrenheit, kelvin, rankine, delisle, newton, reaumur, romer, convert_to_celsius; void convert_temperatures( float celsius ) { delisle = (celsius * (3. / 2.)) - 100; fahrenheit = (celsius * 1.80) + 32.; kelvin = celsius + 273.15; newton = celsius * (33. / 100.); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4. / 5.); romer = (celsius * (21. / 40.)) + 7.50; } scanf("%d", &temperature_type); void print_temp() { printf( "\n" ); if ( !temperature_type == 1 ) printf( "The temperature in celsius is \t\t %6.2f \n", celsius); if ( !temperature_type == 2 ) printf( "The temperature in delisle is \t\t %6.2f \n", delisle); if ( !temperature_type == 3 ) printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); if ( !temperature_type == 4 ) printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); if ( !temperature_type == 5 ) printf( "The temperature in newton is \t\t %6.2f \n", newton); if ( !temperature_type == 6 ) printf( "The temperature in rankine is \t\t %6.2f \n", rankine); if ( !temperature_type == 7 ) printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); if ( !temperature_type == 8 ) printf( "The temperature in r\x9bmer is \t\t %6.2f \n", romer); } if (temperature_type == 1) { printf("Please enter temperature in celsius: "); scanf("%f", &celsius ); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 2) { printf("Please enter temperature in delisle: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius + 100) * (2. / 3.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 3) { printf("Please enter temperature in fahrenheit: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 32.) * (5. / 9.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 4) { printf("Please enter temperature in kelvin: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius - 273.15; convert_temperatures(celsius); print_temp(); } else if (temperature_type == 5) { printf("Please enter temperature in newton: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (100. / 33.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 6) { printf("Please enter temperature in rankine: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 491.67) * (5. / 9.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 7) { printf("Please enter temperature in reaumur: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (5. / 4.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 8) { printf("Please enter temperature in romer: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 7.5)* (40. / 21.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 0) { exit(0); } else { printf("Please choose a number, 1-8, from above!\n\n"); } system ("pause"); system("cls"); } // while return 0; } // main Endret 28. oktober 2017 av kjeita Lenke til kommentar
Emancipate Skrevet 27. oktober 2017 Del Skrevet 27. oktober 2017 Eksempel: Bruk av . int tall = 5.0; Det eksempelet gir ikke mening. 5.0 gir et flyttall, men det lagres direkte i en int, så 5 hadde gitt samme resultat. Ellers smart samling av utskriving. TS, selv om du "fikk lov" lenger oppe å skrive 5. uten null, vil jeg på det sterkeste oppfordre deg til å skrive 5.0 med null. 5. ser bare dumt ut. Lenke til kommentar
Teza Skrevet 27. oktober 2017 Forfatter Del Skrevet 27. oktober 2017 (endret) Takker, det var den neste jeg tenkte på Kan du dog fortelle hvorfor denne ikke skriver ut noe, mens hvis jeg bruker følgende, så skriver den ut mange ganger?: Gir ingen mening da koden ser lik ut.. void print_temp() { printf( "\n" ); if ( !temperature_type == 1 ) printf( "\nThe temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); if ( !temperature_type == 2 ) printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); if ( !temperature_type == 3 ) printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); if ( !temperature_type == 4 ) printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); if ( !temperature_type == 5 ) printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); if ( !temperature_type == 6 ) printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); if ( !temperature_type == 7 ) printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in romer is \t\t %6.2f \n", romer); if ( !temperature_type == 8 ) printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); } void print_temp() { printf( "\n" ); if ( !temperature_type == 1 ) printf( "The temperature in celsius is \t\t %6.2f \n", celsius); if ( !temperature_type == 2 ) printf( "The temperature in delisle is \t\t %6.2f \n", delisle); if ( !temperature_type == 3 ) printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); if ( !temperature_type == 4 ) printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); if ( !temperature_type == 5 ) printf( "The temperature in newton is \t\t %6.2f \n", newton); if ( !temperature_type == 6 ) printf( "The temperature in rankine is \t\t %6.2f \n", rankine); if ( !temperature_type == 7 ) printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); if ( !temperature_type == 8 ) printf( "The temperature in romer is \t\t %6.2f \n", romer); } Endret 27. oktober 2017 av Teza Lenke til kommentar
Teza Skrevet 27. oktober 2017 Forfatter Del Skrevet 27. oktober 2017 TS, selv om du "fikk lov" lenger oppe å skrive 5. uten null, vil jeg på det sterkeste oppfordre deg til å skrive 5.0 med null. 5. ser bare dumt ut. Godt poeng Lenke til kommentar
Emancipate Skrevet 27. oktober 2017 Del Skrevet 27. oktober 2017 Legg merke til at det er et utropstegn i hver if-setning, det betyr "not". Lenke til kommentar
Teza Skrevet 27. oktober 2017 Forfatter Del Skrevet 27. oktober 2017 (endret) Legg merke til at det er et utropstegn i hver if-setning, det betyr "not". Så den skriver ut alle temperaturene (fungerer som tidligere) ved å bruke: void print_temp() { printf( "\n" ); printf( "\nThe temperature in celsius is \t\t %6.2f \n", celsius); printf( "The temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n\n", romer); } og den kan programeres til å ekskludere enkelte linje med IF og ! om jeg forstår det riktig. Endret 27. oktober 2017 av Teza Lenke til kommentar
kjeita Skrevet 28. oktober 2017 Del Skrevet 28. oktober 2017 Eksempel: Bruk av . int tall = 5.0; Det eksempelet gir ikke mening. 5.0 gir et flyttall, men det lagres direkte i en int, så 5 hadde gitt samme resultat. Oi, den overså jeg. Det stod egentlig kun: tall=5.0, men når jeg rettet på tabulatorfeilene mine så tenkte jeg at jeg måtte deklarere den. Jeg var nok mere opptatt av det med rett mellomrom enn den der @Teza, if ( !temperature_type == 1 ) printf( "\nThe temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); Vil ikke virke. Du må skrive: if ( !temperature_type == 1 ) { printf( "\nThe temperature in delisle is \t\t %6.2f \n", delisle); printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); printf( "The temperature in newton is \t\t %6.2f \n", newton); printf( "The temperature in rankine is \t\t %6.2f \n", rankine); printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); printf( "The temperature in romer is \t\t %6.2f \n", romer); } Du kan sløyfe {} hvis hva som er i if-løkken kun består av en enkel linje. Her er hva eksemplet egentlig gjør. temp_type = 1 er Celsius Hvis temp_type IKKE er 1, så skriver den ut Celsius. Hvis temp_type IKKE er 2, så skriver den ut Delisle. Poenget var å få samme utskrift som du hadde tidligere, men uten å måtte repetere samme printf() noen plasser. Noe som gjør det lettere å redigere det senere Lenke til kommentar
Teza Skrevet 28. oktober 2017 Forfatter Del Skrevet 28. oktober 2017 Tok en pause til i dag for å tømme hodet litt, men føler meg fremdeles ganske dum. void print_temp() { printf( "\n" ); if ( !temperature_type == 1 ) printf( "The temperature in celsius is \t\t %6.2f \n", celsius); if ( !temperature_type == 2 ) printf( "The temperature in delisle is \t\t %6.2f \n", delisle); if ( !temperature_type == 3 ) printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); if ( !temperature_type == 4 ) printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); if ( !temperature_type == 5 ) printf( "The temperature in newton is \t\t %6.2f \n", newton); if ( !temperature_type == 6 ) printf( "The temperature in rankine is \t\t %6.2f \n", rankine); if ( !temperature_type == 7 ) printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); if ( !temperature_type == 8 ) printf( "The temperature in r\x9bmer is \t\t %6.2f \n", romer); } Slik jeg forstår denne sjekker programmet hver IF setning, og dersom: temperature_type == 1 ikke er 1 skrives: celsius, og hopper til neste linje hvor temperature_type == 2 ikke er 2 skrives: delisle, og hopper til neste linje hvor temperature_type == 3 ikke er 3 skrives: fahrenheit, og så videre. Så slik jeg leser koden, skal den skrive ut alle temperaturene, untatt for det valget som er gjort. Dog når jeg kjører denne koden, skriver den ikke ut noe som helst, uansett hvilket valg jeg tar? Så noe gjør jeg feil, eller må jeg laste inn et tilleggs bibliotek for denne? #include <stdio.h> int main() { while(1){ int temperature_type; float celsius, fahrenheit, kelvin, rankine, delisle, newton, reaumur, romer, convert_to_celsius; void convert_temperatures( float celsius ) { delisle = (celsius * (3. / 2.)) - 100; fahrenheit = (celsius * 1.80) + 32.; kelvin = celsius + 273.15; newton = celsius * (33. / 100.); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4. / 5.); romer = (celsius * (21. / 40.)) + 7.50; } void print_temp() { printf( "\n" ); if ( !temperature_type == 1 ) printf( "The temperature in celsius is \t\t %6.2f \n", celsius); if ( !temperature_type == 2 ) printf( "The temperature in delisle is \t\t %6.2f \n", delisle); if ( !temperature_type == 3 ) printf( "The temperature in fahrenheit is \t %6.2f \n", fahrenheit); if ( !temperature_type == 4 ) printf( "The temperature in kelvin is \t\t %6.2f \n", kelvin); if ( !temperature_type == 5 ) printf( "The temperature in newton is \t\t %6.2f \n", newton); if ( !temperature_type == 6 ) printf( "The temperature in rankine is \t\t %6.2f \n", rankine); if ( !temperature_type == 7 ) printf( "The temperature in reaumur is \t\t %6.2f \n", reaumur); if ( !temperature_type == 8 ) printf( "The temperature in r\x9bmer is \t\t %6.2f \n", romer); } printf("Temperature conversion tool\n\n"); printf("Choose what type to convert from:\n"); printf("[1] Celsius\n"); printf("[2] Delisle\n"); printf("[3] Fahrenheit\n"); printf("[4] Kelvin\n"); printf("[5] Newton\n"); printf("[6] Rankie\n"); printf("[7] Reaumur\n"); printf("[8] Romer\n"); printf("[0] Avslutt programmet\n\n"); printf("Please enter temperature type: "); scanf("%d", &temperature_type); if (temperature_type == 1) { printf("Please enter temperature in celsius: "); scanf("%f", &celsius ); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 2) { printf("Please enter temperature in delisle: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius + 100) * (2. / 3.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 3) { printf("Please enter temperature in fahrenheit: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 32.) * (5. / 9.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 4) { printf("Please enter temperature in kelvin: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius - 273.15; convert_temperatures(celsius); print_temp(); } else if (temperature_type == 5) { printf("Please enter temperature in newton: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (100. / 33.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 6) { printf("Please enter temperature in rankine: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 491.67) * (5. / 9.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 7) { printf("Please enter temperature in reaumur: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (5. / 4.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 8) { printf("Please enter temperature in romer: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 7.5)* (40. / 21.); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 0) { exit(0); } else { printf("Please choose a number, 1-8, from above!\n\n"); } system ("pause"); system("cls"); } // while return 0; } // main Lenke til kommentar
Emancipate Skrevet 28. oktober 2017 Del Skrevet 28. oktober 2017 (endret) Tok en pause til i dag for å tømme hodet litt, men føler meg fremdeles ganske dum. Dess mer du tømmer, dess dummere blir du. Nei da, C og programmering er vanskelig, og det tar lang tid å lære. Du bør skaffe deg et steg-for-steg læreverk (f.eks. en bok). Edit: for grunnen til at koden ikke skriver ut noe, se neste innlegg. Les det helst før dette innlegget. Når jeg kompilerer koden din får jeg endel warnings: temp_printfunk.c:110:9: warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration] exit(0); ^ temp_printfunk.c:116:5: warning: implicit declaration of function ‘system’ [-Wimplicit-function-declaration] system ("pause"); ^ Disse funksjonene finnes sikkert i diverse header-filer. Men i første omgang vil jeg be deg om å ikke bruke dem. For å avslutte programmet, bryt heller ut av while-løkka ved å skrive break; La programmet avsluttes ved at det når slutten av main. Dette er bedre stil. system() utfører en kommando i operativsystemet. Dette er stort sett uønsket, fordi kommandoene ikke er like på alle OS. Hverken pause eller cls finners på Linux. Derfor får jeg bare feilmelding underveis i programmet: sh: 1: pause: not found sh: 1: cls: not found Her drøftes problemet: https://stackoverflow.com/questions/1391548/why-doesnt-getchar-wait-for-me-to-press-enter-after-scanf Legg merke til svaret "I would suggest reading an actual line (use fgets(3)) and then using sscanf() to scan the string." cls er umulig å gjøre uten system. Endret 28. oktober 2017 av Emancipate Lenke til kommentar
Teza Skrevet 28. oktober 2017 Forfatter Del Skrevet 28. oktober 2017 Bump: Har oppdatert første post med alle versjonene av dette programmet, for lettere se utviklingen fra versjon til versjon. Lenke til kommentar
Emancipate Skrevet 28. oktober 2017 Del Skrevet 28. oktober 2017 Koden er laget helt feil. Det du trenger er enten: if ( temperature_type != 1 )eller if (!(temperature_type == 1))Førstnevnte er såklart best stil. Den er enklest å lese. Lenke til kommentar
Teza Skrevet 28. oktober 2017 Forfatter Del Skrevet 28. oktober 2017 Fantastisk, og da kjenner jeg igjen uttrykket != fra tidligere "break" fungerte glimrende men erstattningen for cls må jeg se nærmere på Lenke til kommentar
Emancipate Skrevet 28. oktober 2017 Del Skrevet 28. oktober 2017 Det finnes ingen erstatning for cls. Men det er en erstatning for pause. Lenke til kommentar
Teza Skrevet 28. oktober 2017 Forfatter Del Skrevet 28. oktober 2017 Dess mer du tømmer, dess dummere blir du. Nei da, C og programmering er vanskelig, og det tar lang tid å lære. Du bør skaffe deg et steg-for-steg læreverk (f.eks. en bok). Ble tipset om denne boken i begynnelsen av tråden, men er litt usikker på om det kanskje finnes bedre alternativer. Lenke til kommentar
Emancipate Skrevet 28. oktober 2017 Del Skrevet 28. oktober 2017 (endret) Ble tipset om denne boken i begynnelsen av tråden, men er litt usikker på om det kanskje finnes bedre alternativer.Det sier seg selv at den ikke passer. "This book is for the knowledgeable C programmer,". Et søk på beginner c programming lister denne øverst: https://www.amazon.com/Programming-Absolute-Beginners-Guide-3rd/dp/0789751984/ref=sr_1_5?s=books&ie=UTF8&qid=1509231557&sr=1-5&keywords=c+programming Den ser bra ut, men ikke kjøp kindle-versjonen (iflg. anmeldelsene). Endret 28. oktober 2017 av Emancipate Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå