Gå til innhold

Komme i gang med C


Anbefalte innlegg

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 av Teza
Lenke til kommentar
Videoannonse
Annonse

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 av Teza
Lenke til kommentar

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 av Gavekort
Lenke til kommentar

 

 

 

#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

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 duplication

De 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

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

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 av Emancipate
Lenke til kommentar
  

 

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.

Screenshot_20171029_133814.png

 

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

 

Screenshot_20171029_134926.png

Lenke til kommentar

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 av Teza
Lenke til kommentar

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

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

 

 

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

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

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

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 :wee:

 

 

@Gavekort,

Dette blir nesten som å sitte ned i forelesing uke 7, når man kun har lest stoffet for uke 1.

Stegvis progressjon :w00t:

 

@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,

Dette blir nesten som å sitte ned i forelesing uke 7, når man kun har lest stoffet for uke 1.

Stegvis progressjon :w00t:

 

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

 

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 :wee:

 

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...