1
votes

I've some issues with a basic C practice for school, I have to write a C program that calculates the replacement resistance of a ladder network.

This is my code (sorry for the dutch):

    /*laddernetwerk calculator*/
#include <stdio.h>
#include <math.h>
float R1, R2, Rinvoer;
int groep; //hierin wordt het nummer van de groep opgeslagen
char c; //hierin wordt de keuze van of er nog meer groepen zijn opgeslagen

int main(void){
    printf("Een laddernetwerk bestaat uit merdere goepen weerstanden in serie (zie tekening).\n");
    printf("Na elke verticale weesrand of weerstanden dient een lijn recht naar beneden getrokken te worden.\n");
    printf("In dit programma moeten alle weerstanden uit een bepaalde groep ingevoerd worden.\n");
    printf("Groep 1 bestaat in dit voorbeeld uit R1 en R2, groep 2 bestaat uit R3, R4 en R5.\n");
    printf("Er kunnen met dit programma natuurlijk veel meer dan 2 groepen opgelost worden, de afbeelding is slechts een voorbeeld\n");
    printf("\n");
    printf("            groep 1             |              groep 2                      |\n");
    printf("          -----------           |    ------------    -----------            |\n");
    printf("----------     R1    -----------|----     R3     ----     R4    ------------|---\n");
    printf("          -----------     |     |    ------------    -----------     |      |\n");
    printf("                        |   |   |                                  |   |    |\n");
    printf("                        | R |   |                                  | R |    |   etc.\n");
    printf("                        | 2 |   |                                  | 5 |    |\n");
    printf("                        |   |   |                                  |   |    |\n");
    printf("                          |     |                                    |      |\n");
    printf("--------------------------------|-------------------------------------------|---\n");
    printf("                                |                                           |\n");
    printf("\n"); 
    printf("Druk op enter om door te gaan met het programma");  
    while( getchar() != '\n' ); //wachten om door te gaan

    printf("Geef 1 voor 1 de weerstanden van groep 1, druk op een letter als alle waarden ingevuld zijn\n"); 
    R1=0;
    while (scanf("%f", &Rinvoer) == 1)
        R1 = Rinvoer + R1;    
    printf("Zijn er nog meer groepen weerstanden? type j voor ja, n voor nee\n");
    printf("%.2f",R1);
    /*--here the program stops--*/
    scanf("%s", &c);
    groep = 2;

    if (c == 'j')
    {
      /*this part isn't finished yet*/  
      printf("Geef 1 voor 1 de weerstanden van groep %d, druk op een letter als alle waarden ingevuld zijn\n",groep);
        while (scanf("%f", &Rinvoer) == 1)
            R2 = Rinvoer + R2;

    }

    if (c == 'n'){
        printf("De totale weerstand van dit laddernetwerk is %.2f Ohm",R1);
    }

}

After the while loop it prints the 2 lines, but then the program stops, it seems to disable the scanf. When I put the scanf between the both printf they both are printed, but the scanf still doesn't work. I've tried using a do loop, but without success. adding or removing curly braces also doesn't have any effect. Someone can tell me what I'm doing wrong?

1
scanf("%s", &c); %s is for strings, you're passing a char by pointer. undefined behaviour as scanf overwrites past c memoryJean-François Fabre
Aside: use the superior double type (which would require %lf in scanf) unless there is a good reason to use float.Weather Vane

1 Answers

0
votes

Consider using fgets for all input and parse with sscanf as needed.

#include <stdio.h>
#include <math.h>
float R1, R2, Rinvoer;
int groep; //hierin wordt het nummer van de groep opgeslagen
char c[100]; //hierin wordt de keuze van of er nog meer groepen zijn opgeslagen

int main(void){
    int result = 0;
    printf("Een laddernetwerk bestaat uit merdere goepen weerstanden in serie (zie tekening).\n");
    printf("Na elke verticale weesrand of weerstanden dient een lijn recht naar beneden getrokken te worden.\n");
    printf("In dit programma moeten alle weerstanden uit een bepaalde groep ingevoerd worden.\n");
    printf("Groep 1 bestaat in dit voorbeeld uit R1 en R2, groep 2 bestaat uit R3, R4 en R5.\n");
    printf("Er kunnen met dit programma natuurlijk veel meer dan 2 groepen opgelost worden, de afbeelding is slechts een voorbeeld\n");
    printf("\n");
    printf("            groep 1             |              groep 2                      |\n");
    printf("          -----------           |    ------------    -----------            |\n");
    printf("----------     R1    -----------|----     R3     ----     R4    ------------|---\n");
    printf("          -----------     |     |    ------------    -----------     |      |\n");
    printf("                        |   |   |                                  |   |    |\n");
    printf("                        | R |   |                                  | R |    |   etc.\n");
    printf("                        | 2 |   |                                  | 5 |    |\n");
    printf("                        |   |   |                                  |   |    |\n");
    printf("                          |     |                                    |      |\n");
    printf("--------------------------------|-------------------------------------------|---\n");
    printf("                                |                                           |\n");
    printf("\n"); 
    printf("Druk op enter om door te gaan met het programma");

    fgets ( c, sizeof c, stdin);

    printf("Geef 1 voor 1 de weerstanden van groep 1, druk op een letter als alle waarden ingevuld zijn\n"); 
    R1=0;
    //enter a blank line to exit loop
    do {
        if ( fgets ( c, sizeof c, stdin)) {
            if ( c[0] != '\n' && 1 == ( result = sscanf( c, "%f", &Rinvoer))) {
                R1 = Rinvoer + R1;    
            }
            if ( result == 0) { 
                printf ( "enter a float or a blank line\n");
            }
        }
    } while ( c[0] != '\n');
    printf("Zijn er nog meer groepen weerstanden? type j voor ja, n voor nee\n");
    printf("%.2f",R1);
    /*--here the program stops--*/
    fgets ( c, sizeof c, stdin);

    groep = 2;

    if (c[0] == 'j')
    {
        /*this part isn't finished yet*/  
        printf("Geef 1 voor 1 de weerstanden van groep %d, druk op een letter als alle waarden ingevuld zijn\n",groep);
        //enter a blank line to exit loop
        do {
            if ( fgets ( c, sizeof c, stdin)) {
                if ( c[0] != '\n' && 1 == ( result = sscanf( c, "%f", &Rinvoer))) {
                    R2 = Rinvoer + R2;    
                }
                if ( result == 0) { 
                    printf ( "enter a float or a blank line\n");
                }
            }
        } while ( c[0] != '\n');

    }

    if (c[0] == 'n'){
        printf("De totale weerstand van dit laddernetwerk is %.2f Ohm",R1);
    }

}