Teza Skrevet 28. oktober 2017 Forfatter Del Skrevet 28. oktober 2017 (endret) Hehe quote: " If you can't even spell C, you can learn to program in C with this book" Her begynner man tydeligvis med å lære alfabetet, så kanskje det finnes håp for meg også? Kunne ikke annet en å bestille den, takker. Endret 28. oktober 2017 av Teza Lenke til kommentar
Teza Skrevet 29. oktober 2017 Forfatter Del Skrevet 29. oktober 2017 (endret) Edit, se bort fra denne, skal prøve å bygge videre på IF. Prøver å bytte scanf() med putchar(), men får ikke helt det resultatet jeg forventet. #include <stdio.h> /* Terje Andersen 29/10-2017 Temperature conversion v 1.5 Program to learn to code in C Full progress info at: https://www.diskusjon.no/index.php?showtopic=1792480 */ int main() { int temperature_type, input; float celsius, fahrenheit, kelvin, rankine, delisle, newton, reaumur, romer, convert_to_celsius; // Calculations to convert from celsius. Used in menu IF function void convert_temperatures( float celsius) { delisle = (celsius * (3.0 / 2.0)) - 100.0; fahrenheit = (celsius * 1.80) + 32.0; kelvin = celsius + 273.15; newton = celsius * (33.0 / 100.0); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4.0 / 5.0); romer = (celsius * (21.0 / 40.0)) + 7.50; } // Print options, used in menu IF function 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); } // void print_temp // Main menu 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] Exit program\n\n"); printf("Please enter temperature type: "); scanf("%d", &temperature_type); do { input = getchar(); switch(input){ case'1': printf("Please enter temperature in celsius: "); scanf("%f", &celsius ); convert_temperatures(celsius); print_temp(); break; case'2': printf("Please enter temperature in delisle: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius + 100.0) * (2.0 / 3.0); convert_temperatures(celsius); print_temp(); break; case'3': printf("Please enter temperature in fahrenheit: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 32.0) * (5.0 / 9.0); convert_temperatures(celsius); print_temp(); break; case'4': printf("Please enter temperature in kelvin: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius - 273.15; convert_temperatures(celsius); print_temp(); break; case'5': printf("Please enter temperature in newton: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (100.0 / 33.0); convert_temperatures(celsius); print_temp(); break; case'6': printf("Please enter temperature in rankine: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 491.67) * (5.0 / 9.0); convert_temperatures(celsius); print_temp(); break; case'7': printf("Please enter temperature in reaumur: "); scanf("%f", &convert_to_celsius); celsius = convert_to_celsius * (5.0 / 4.0); convert_temperatures(celsius); print_temp(); break; case'8': printf("Please enter temperature in romer: "); scanf("%f", &convert_to_celsius); celsius = (convert_to_celsius - 7.5)* (40.0 / 21.0); convert_temperatures(celsius); print_temp(); break; case'0': break; } // input } //do while(input != '0'); return 0; return 0; } // main Endret 29. oktober 2017 av Teza Lenke til kommentar
Gavekort Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 (endret) Kritikk (konstruktiv forhåpentligvis): main() er en funksjon selv, så du skal ikke ha funksjoner inne i main. Disse variablene dine som du deklarer i main kunne heller vært i en struct som du returnerer fra convert_temperatures #include <stdio.h> /* Terje Andersen 29/10-2017 Temperature conversion v 1.5 Program to learn to code in C Full progress info at: https://www.diskusjon.no/index.php?showtopic=1792480 */ typedef struct{ float fahrenheit; float kelvin; float rankine; float newton; float reaumur; float romer; float delisle; } units_t; units_t convert_temperatures(float celsius) { units_t units; units.delisle = (celsius * (3.0 / 2.0)) - 100.0; units.fahrenheit = (celsius * 1.80) + 32.0; units.kelvin = celsius + 273.15; units.newton = celsius * (33.0 / 100.0); units.rankine = (celsius * 1.80) + 491.67; units.reaumur = celsius * (4.0 / 5.0); units.romer = (celsius * (21.0 / 40.0)) + 7.50; return units; } int main(){ units_t result = convert_temperatures(20.0); printf("Temperature in kelvin is %f\n\r", result.kelvin); return 0; } print_temp og "main menu" inneholder ekstremt mye code duplication. Ser du deg selv gjenta ting mer enn et fåtalls ganger så gjør du det garantert feil. Prøv å ikke bland konverteringslogikk og "interface". Konverteringen du gjør i input-delen din bør flyttes, slik at du får det samlet et sted med convert_temperatures. Endret 29. oktober 2017 av Gavekort Lenke til kommentar
Teza Skrevet 29. oktober 2017 Forfatter Del Skrevet 29. oktober 2017 #include <stdio.h> /* Terje Andersen 29/10-2017 Temperature conversion v 1.5 Program to learn to code in C Full progress info at: https://www.diskusjon.no/index.php?showtopic=1792480 */ typedef struct{ float fahrenheit; float kelvin; float rankine; float newton; float reaumur; float romer; } units_t; units_t convert_temperatures(float celsius) { units_t units; units.delisle = (celsius * (3.0 / 2.0)) - 100.0; units.fahrenheit = (celsius * 1.80) + 32.0; units.kelvin = celsius + 273.15; units.newton = celsius * (33.0 / 100.0); units.rankine = (celsius * 1.80) + 491.67; units.reaumur = celsius * (4.0 / 5.0); units.romer = (celsius * (21.0 / 40.0)) + 7.50; return units; } Prøv å ikke bland konverteringslogikk og "interface". Konverteringen du gjør i input-delen din bør flyttes, slik at du får det samlet et sted med convert_temperatures. Det å samle alle beregningene på ett sted har lenge vært planen, men uten kunnskap må jeg prøve å løse en og en ting (tar tid ). Akkurat nå prøver jeg å bytte ut scanf() med getchar(), da scanf() gjerne kan skape endel problemer. Setter pris på konstruktiv kritikk. Lenke til kommentar
Emancipate Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 Disse variablene dine som du deklarer i main kunne heller vært i en struct som du returnerer fra convert_temperaturesÅ returnere en så stor struct by value river i meg. Noe av poenget med å bruke C forsvinner hvis man koder ueffektivt med vilje. Men ja, de kunne vært i en struct. Jeg ville heller sendt inn en peker til variabelen (såkalt output parameter). Du mente kanskje at dette var litt for avansert foreløpig? print_temp og "main menu" inneholder ekstremt mye code duplicationDe siste versjonene er mye bedre enn de første. TS: Jeg skal prøve å få de funksjonene til å virke, men jeg har ikke noen erfaring med dem selv. Lenke til kommentar
Teza Skrevet 29. oktober 2017 Forfatter Del Skrevet 29. oktober 2017 Ved å sette inn getchar() virker det som det ikke lengre er tall men tegn som brukes, hvor alle menyvalg må endres fra 1 til '1'. Antar også at det blir feil løsning å legge inn en getchar() under hvert menyvalg? #include <stdio.h> /* Terje Andersen 27/10-2017 Temperature conversion v 1.4 Program to learn to code in C Full progress info at: https://www.diskusjon.no/index.php?showtopic=1792480 */ int main() { while(1){ // Loop the program until exit is chosen int temperature_type; float celsius, fahrenheit, kelvin, rankine, delisle, newton, reaumur, romer, convert_to_celsius; // Calculations to convert from celsius. Used in menu IF function void convert_temperatures( float celsius) { delisle = (celsius * (3.0 / 2.0)) - 100.0; fahrenheit = (celsius * 1.80) + 32.0; kelvin = celsius + 273.15; newton = celsius * (33.0 / 100.0); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4.0 / 5.0); romer = (celsius * (21.0 / 40.0)) + 7.50; } // Print options, used in menu IF function 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); } // void print_temp // Main menu 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] Exit program\n\n"); printf("Please enter temperature type: " ); temperature_type = getchar(); getchar(); if (temperature_type == '1') { printf("Please enter temperature in celsius: "); celsius = getchar(); getchar(); 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.0) * (2.0 / 3.0); 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.0) * (5.0 / 9.0); 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.0 / 33.0); 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.0 / 9.0); 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.0 / 4.0); 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.0 / 21.0); convert_temperatures(celsius); print_temp(); } else if (temperature_type == '0') { break; } 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 29. oktober 2017 Del Skrevet 29. oktober 2017 (endret) getchar() skulle være en erstatning for pause, ikke for å hente inn tallene. Der skal du bruke fgets og sscanf. #include <stdio.h> /* * Dokumentasjon: http://www.cplusplus.com/reference/cstdio/fgets/ http://www.cplusplus.com/reference/cstdio/sscanf/ */ // En streng som mottar det som brukeren skriver inn // Nødvendig for fgets #define INPUT_BUFFER_SIZE 4000 // størrelsen på strengen char input_buffer[INPUT_BUFFER_SIZE]; int main() { // Basic eksempel med fgets printf("Hva er navnet ditt? "); fgets(input_buffer, INPUT_BUFFER_SIZE, stdin); // Navnet + ny linje (enter-tasten) er nå lagret i input_buffer printf("Hei, %s!", input_buffer); puts(""); // Eksempel med sscanf // sscanf = scanf på en streng (første parameter) int choice; printf("Skriv inn et heltall: "); fgets(input_buffer, INPUT_BUFFER_SIZE, stdin); sscanf(input_buffer, "%d", &choice); printf("%d", choice); // Pause getchar(); } Edit: En annen fordel med dette er at du får mindre trøbbel når brukeren skriver inn noe feil (f.eks. en bokstav istedenfor et tall). Endret 29. oktober 2017 av Emancipate Lenke til kommentar
Gavekort Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 Disse variablene dine som du deklarer i main kunne heller vært i en struct som du returnerer fra convert_temperaturesÅ returnere en så stor struct by value river i meg. Noe av poenget med å bruke C forsvinner hvis man koder ueffektivt med vilje. Men ja, de kunne vært i en struct. Jeg ville heller sendt inn en peker til variabelen (såkalt output parameter). Du mente kanskje at dette var litt for avansert foreløpig? Personlig hadde jeg brukt en pointer, men ja, det er et nytt konsept som er vanskelig å sette seg inn i, og i praksis så spiller det ingen rolle. Dette er ikke 1980-tallet lenger, så skriv kode etter det som gir logisk mening. Disassembly av uoptimalisert kode, by value til venstre, by reference til høyre. Anbefaler gjerne å gjøre det slik som dette om du kan. #include <stdio.h> /* Terje Andersen 29/10-2017 Temperature conversion v 1.5 Program to learn to code in C Full progress info at: https://www.diskusjon.no/index.php?showtopic=1792480 */ typedef struct{ float fahrenheit; float kelvin; float rankine; float newton; float reaumur; float romer; float delisle; } units_t; void convert_temperatures(float celsius, units_t* units){ units->delisle = (celsius * (3.0 / 2.0)) - 100.0; units->fahrenheit = (celsius * 1.80) + 32.0; units->kelvin = celsius + 273.15; units->newton = celsius * (33.0 / 100.0); units->rankine = (celsius * 1.80) + 491.67; units->reaumur = celsius * (4.0 / 5.0); units->romer = (celsius * (21.0 / 40.0)) + 7.50; } int main(){ units_t result; convert_temperatures(20.0, &result); printf("Temperature in kelvin is %f\n\r", result.kelvin); return 0; } Reference til venstre, value til høyre, kompilert med O3 Lenke til kommentar
Teza Skrevet 29. oktober 2017 Forfatter Del Skrevet 29. oktober 2017 (endret) Fikk da flyttet de siste beregningene ut av IF setningene. Ettersom scanf() etterlater en \n som henger i minnet måtte jeg kjøre getchar() to ganger. #include <stdio.h> /* Terje Andersen 27/10-2017 Temperature conversion v 1.5 Program to learn to code in C Full progress info at: https://www.diskusjon.no/index.php?showtopic=1792480 */ int main() { while(1){ // Loop the program until exit is chosen int temperature_type; float celsius, fahrenheit, kelvin, rankine, delisle, newton, reaumur, romer, celsius_calc; // Calculations to convert from celsius. Used in menu IF function void convert_temperatures( float celsius) { delisle = (celsius * (3.0 / 2.0)) - 100.0; fahrenheit = (celsius * 1.80) + 32.0; kelvin = celsius + 273.15; newton = celsius * (33.0 / 100.0); rankine = (celsius * 1.80) + 491.67; reaumur = celsius * (4.0 / 5.0); romer = (celsius * (21.0 / 40.0)) + 7.50; } // Calculations to convert to celsius. Used in menu IF function void convert_to_celsius( float celsius_calc) { if ( temperature_type == 2 ) celsius = (celsius_calc + 100.0) * (2.0 / 3.0); if ( temperature_type == 3 ) celsius = (celsius_calc - 32.0) * (5.0 / 9.0); if ( temperature_type == 4 ) celsius = celsius_calc - 273.15; if ( temperature_type == 5 ) celsius = celsius_calc * (100.0 / 33.0); if ( temperature_type == 6 ) celsius = (celsius_calc - 491.67) * (5.0 / 9.0); if ( temperature_type == 7 ) celsius = celsius_calc * (5.0 / 4.0); if ( temperature_type == 8 ) celsius = (celsius_calc - 7.5)* (40.0 / 21.0); } // void print_temp // Print options, used in menu IF function 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); } // void print_temp // Main menu 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] Rankine\n"); printf("[7] Reaumur\n"); printf("[8] Romer\n"); printf("[0] Exit program\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", &celsius_calc); convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 3) { printf("Please enter temperature in fahrenheit: "); scanf("%f", &celsius_calc); convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 4) { printf("Please enter temperature in kelvin: "); scanf("%f", &celsius_calc); convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 5) { printf("Please enter temperature in newton: "); scanf("%f", &celsius_calc); convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 6) { printf("Please enter temperature in rankine: "); scanf("%f", &celsius_calc); convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 7) { printf("Please enter temperature in reaumur: "); scanf("%f", &celsius_calc); convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 8) { printf("Please enter temperature in romer: "); scanf("%f", &celsius_calc); convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); } else if (temperature_type == 0) { break; } else { printf("Please choose a number, 1-8, from above!\n\n"); } printf("\nPress a ENTER to continue..."); getchar(); // remove the \n that is left in memory from scanf() getchar(); // hold the program waiting for enter to be pressed system("cls"); } // while return 0; } // main /* v 1.5 Moved the rest of the calculations out of IF into seperate function replaced "system ("pause");" with getchar() v 1.4 Changed the exit of the program from "exit(0);" to "break" Compressed the void print_temp function v 1.3 Code cleanup Added code explanations Moved printf into seperate void function v 1.2 Moved calculations out of IF statement Verified formulas against www.metric-conversions.org 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; Removed errors from calculations Added: - While function to loop the program - Pause function - Clear screen, between menu choices - Program exit as menu option v 1.1 Added menu / option to convert both ways v 1.0 Conversion from celsius */ Ser at det enda er kode som repeteres 7 ganger i IF setningene: convert_to_celsius(celsius_calc); convert_temperatures(celsius); Blir det for oppdelt / lite lesbart om jeg plasserer disse utenfor IF setningene? Endret 29. oktober 2017 av Teza Lenke til kommentar
Emancipate Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 Når man bruker en peker, får man en masse dereference-operasjoner, så kanskje det faktisk er tregere. Lenke til kommentar
Emancipate Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 Fikk da flyttet de siste beregningene ut av IF setningene.Etter min mening har du egentlig bare gjort programmet unødvendig komplisert. Selv om jeg er klar over at du fulgte rådet fra Gavekort. Ettersom scanf() etterlater en \n som henger i minnet måtte jeg kjøre getchar() to ganger.Erstatt scanf() med fgets() og sscanf() for å løse problemet. Se over. Lenke til kommentar
Gavekort Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 TS: Ser du hvordan du skriver dette mange ganger etter hverandre? convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); Hva med å gjøre det slik? printf("Please enter temperature type: " ); scanf("%d", &temperature_type); switch(temperature_type){ case 1: printf("Please enter temperature in celsius: "); break; case 2: printf("Please enter temperature in delisle: "); break; case 3: printf("Please enter temperature in fahrenheit: "); break; case 4: printf("Please enter temperature in kelvin: "); break; case 5: printf("Please enter temperature in newton: "); break; case 6: printf("Please enter temperature in rankine: "); break; case 7: printf("Please enter temperature in reaumur: "); break; case 8: printf("Please enter temperature in romer: "); break; case 0: break; default: printf("Please choose a number, 1-8, from above!\n\n"); break; } scanf("%f", &celsius_calc); if(temperature_type != 1){ convert_to_celsius(celsius_calc); } convert_temperatures(celsius); print_temp(); Du kan også forenkle den switch-casen, men da kreves det litt flere fundamentale endringer. Når man bruker en peker, får man en masse dereference-operasjoner, så kanskje det faktisk er tregere. Jeg skal ikke gå for bastant inn i dette, men jeg som en relativt moderne C-utvikler har lært at kodestruktur er viktigere enn premature optimizations. Men i embedded-verdenen så bruker du stort sett bare pointers uansett, så returnerer du heller en feilkode i funksjonen. Det man må være forsiktig med er at man ikke driver å kopierer minne i hytt og pine, og skjønner jeg assemblykoden korrekt så skal ikke det skje. Skal man skrelle av instruksjoner og minne så er jeg helt klinkende klar enig med deg. Lenke til kommentar
Teza Skrevet 29. oktober 2017 Forfatter Del Skrevet 29. oktober 2017 Etter min mening har du egentlig bare gjort programmet unødvendig komplisert. Selv om jeg er klar over at du fulgte rådet fra Gavekort. Hadde tenkt på dette før han kom med forslaget. Selv om koden blir mer oppdelt synes jeg det er lettere å gå tilbake å gjøre endringer i beregningene når disse er samlet på ett sted. Liker ikke tanken på å måtte se gjennom mye kode for å finne alle beregningene som evt. må endres. Skal se på fgets() når jeg kommer hjem senere i kveld Takker Lenke til kommentar
Teza Skrevet 29. oktober 2017 Forfatter Del Skrevet 29. oktober 2017 TS: Ser du hvordan du skriver dette mange ganger etter hverandre? convert_to_celsius(celsius_calc); convert_temperatures(celsius); print_temp(); Hva med å gjøre det slik? printf("Please enter temperature type: " ); scanf("%d", &temperature_type); switch(temperature_type){ case 1: printf("Please enter temperature in celsius: "); break; case 2: printf("Please enter temperature in delisle: "); break; case 3: printf("Please enter temperature in fahrenheit: "); break; case 4: printf("Please enter temperature in kelvin: "); break; case 5: printf("Please enter temperature in newton: "); break; case 6: printf("Please enter temperature in rankine: "); break; case 7: printf("Please enter temperature in reaumur: "); break; case 8: printf("Please enter temperature in romer: "); break; case 0: break; default: printf("Please choose a number, 1-8, from above!\n\n"); break; } scanf("%f", &celsius_calc); if(temperature_type != 1){ convert_to_celsius(celsius_calc); } convert_temperatures(celsius); print_temp(); Jeg var innom den ideen i post #62, men valgte å gå tilbake til IF da jeg synes dette var mer lettlest. Kanskje etterhvert når jeg får mer kunnskap. Er også enig med Emancipate når det kommer til å holde programmet ukomplisert, så er usikker. Selv om det blir færre linjer / repetisjon, så er kanskje programmet mer lettlest når de ligger under IF setningene? I alle fall på det nivået hvor jeg befinner meg. Lenke til kommentar
Emancipate Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 Man trenger ikke å gjøre ting perfekt. Det er bedre å gå videre før man blir lei. Lenke til kommentar
Teza Skrevet 29. oktober 2017 Forfatter Del Skrevet 29. oktober 2017 Føler i grunn at jeg har oppnådd de endringene i koden som jeg ønsket, med unntak av å få byttet ut scanf(). Buggene som jeg vet om er: 1) \n henger igjen etter scanf() og gjør at jeg må kjøre getchar() to ganger. 2) Skriver jeg inn noe annet enn tall, blir det surr i programmet. Begge disse kan løses med fgets etter det jeg har forstått. Lenke til kommentar
Gavekort Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 Jeg er enig i at du bør pynte så mye du har lyst til å pynte på prosjektet, og heller begynne på neste prosjekt med de endringene du vil gjøre. Ikke helt sikker på hva problemet er, men scanf skal kunne gjøre susen. Prøv dette: https://stackoverflow.com/questions/5240789/scanf-leaves-the-new-line-char-in-the-buffer Lenke til kommentar
kjeita Skrevet 29. oktober 2017 Del Skrevet 29. 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. Én lærer mere av feilsøking, enn å bare bli matet det rette svaret @Gavekort, Dette blir nesten som å sitte ned i forelesing uke 7, når man kun har lest stoffet for uke 1. Stegvis progressjon @Teza, Hold på med dette til du blir lei. Så går du over på neste. Gradvis vil du tilegne deg mere informasjon, og senere kan du gå tilbake til dette og forbedre det. ie. struct og pekere Lenke til kommentar
Gavekort Skrevet 29. oktober 2017 Del Skrevet 29. oktober 2017 @Gavekort, Dette blir nesten som å sitte ned i forelesing uke 7, når man kun har lest stoffet for uke 1. Stegvis progressjon Er forsåvidt enig. Det med ytelse og pointers var bare en digresjon fordi det var interessant, men jeg mener det er greit å være klar over ting som code duplication og structs, slik at man vet hva det er, og ser på det som en redning når man finner ut at man gjentar kode for mange ganger, eller når man virkelig sliter med å passere verdier rundt i koden. Lenke til kommentar
Emancipate Skrevet 29. oktober 2017 Del Skrevet 29. 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. Én lærer mere av feilsøking, enn å bare bli matet det rette svaret Jeg synes ikke nybegynnere bør mates med det gale svaret, som du kom til å gjøre her (sikkert ikke med vilje). 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å