Mit Arrays rechnen?



  • Hallo,

    ich bin ganz neu hier im Forum und hab mal ne Frage

    Ich habe auch erst vor 4 Tagen mit C angefangen, deshalb erwartet nicht allzu viel 😃

    Und zwar bin ich grade dabei eine Formelsammlung inkl. Rechner für Elektrotechnik Physik usw. zu schreiben.
    Das klappt soweit auch super und hatte bis jetzt keine Probleme.

    Nun bin ich aber zu dem Punkt gekommen wo es mit dem Rechnen losgeht.
    Der Benutzer navigiert als zur elektrischen Leistung und wird gefragt welche Größe er ausrechnen will (P, U, I).

    Wählt er z.b. P aus wird er zuert nach der Spannung gefragt, dann gibt er diese ein und anschließend wird er nach der Stromstärke gefragt und gibt diese ebenfalls an.

    Diese Werte lese ich mit fgets ein und speichere sie in einem Char Array.

    Wie kann ich jetzt die beiden Werte (I undf U) miteinander multiplizierenn?

    Ich hab es schon einfach mit Ergebnis = U*I usw. probiert aber alles ohne Erfolg.

    Und dann würde ich noch ganz gerne wissen, wie ich überprüfen kann ob etwas in einem Char Array außer /n und /0 und ENTER (also die Taste Enter(ich glaub ASCII 10), damit ich das weiterführe kann was ich mit scanf realisiert hab, siehe zweiter Quelltext.

    Warum ich das nicht scanf und float Variablen mache erkläre ich später.

    Hier der Teil des Quelltextes des Programms:

    #include <stdio.h>
    #include <stdlib.h>
    #define size 12
    
    //---Formelsammlung V0.1---
    
    int main() {
    	float Ergebnis;
    	char P[10], U[10], I[10], R[10], E[10];
    	int AuswahlLeistung;
    	P[10]='\0';																	//Alle Arrays auf 0 setzen
    	U[10]='\0';
    	I[10]='\0';
    	R[10]='\0';
    	printf("\n\nSie haben Leistung gewaehlt");		
    	printf("\n\n(1) P (Leistung W)");
    	printf("\n\n(2) I (Stromstaerke A)");
    	printf("\n\n(3) U (Spannung V)");
    	printf("\n\n(4) R (Widerstand %c)", 234);
    	printf("\n\nWas wollen Sie berechnen?");
    	scanf("%d", &AuswahlLeistung);												//Benutzer wird aufgefordert die Auswahl als Zahl einzugeben
    	switch(AuswahlLeistung) {													//Die Zahl wird eingelesen
    		case 1: printf("\nWenn Sie einen der Werte nicht haben, druecken Sie einfach ENTER"); //Wenn 1 eingegeben wurde springe hierhin	
    				fflush(stdin);													//Tastatur-Puffer leeren
    				printf("\n\nStromstaerke(Ampere) eingeben: ");					//Benutzer wird aufgefordert einen Wert einzugeben
    				fgets(I, size, stdin);											//Benutzereingabe wird eingelesen
    				fflush(stdin);													//Tastatur-Puffer leeren
    				printf("Spannung(Volt) eingeben: ");							//Benutzer wird aufgefordert einen Wert einzugeben
    				fgets(U, size, stdin);											//Benutzereingabe wird eingelesen	
    				E[10] = I[10]*U[10];											//Die beiden eingegebenen Werte (Arrays) werden miteinander multipliziert	
    				puts(E);														//Das Ergebnis(E) wird ausgegeben
    		break;
    		}
    	return 0;
    
    }
    

    Es hat alles wunderbar mit scanf und float Variablen funktioniert.

    Wie ihr sehen könnt wird dort auf dem Bildschirm ausgegeben: "Wenn Sie einen der Werte nicht haben, drücken Sie einfach ENTER.

    Es gibt noch weitere Wege um nach P (Leistung) zu kommen:
    P = U²/R
    P = I² * R

    Wenn der Benutzer aber jetzt nicht wie oben Spannung und Stromstaerke hat sondern z.b. nur Stromstaerke und Widerstand kann er ja bei Spannung nichts eintragen und soll einfach nur die ENTER Taste drücken.
    Wenn er aber Sapnnung und Strom hat wird er erst garnicht nach dem Widerstand gefragt, sondern das Ergebnis wird direkt ausgerechnet.

    Da ich aber mit der ENTER Taste ein scanf nicht "überspringen" kann muss ich es mit fgets machen.

    Zum besseren Verständnis hier der Ausschnitt des Quelltextes mit scanf:

    Leistung:;
    	int AuswahlLeistung;
    	P=0;
    	U=0;
    	I=0;
    	R=0;
    	printf("\n\nSie haben Leistung gewaehlt");
    	printf("\n\n(1) P (Leistung)");
    	printf("\n\n(2) I (Stromstaerke)");
    	printf("\n\n(3) U (Spannung)");
    	printf("\n\n(4) R (Widerstand)");
    	printf("\n\nWas wollen Sie berechnen?");
    	scanf("%d", &AuswahlLeistung);
    	switch(AuswahlLeistung) {
    		case 1: /*printf("\nWenn Sie einen der Werte nicht haben, druecken Sie einfach ENTER");*/
    				check1 = 0;
    				printf("\n\nStromstaerke(Ampere) eingeben: ");
    				check1 = scanf("%f", &I);
    				printf("Spannung(Volt) eingeben: ");
    				check2 = scanf("%f", &U);
    				if (check1 == 1 && check2 == 1) {							//If Bedingung für P=U*I
    																			//Wenn Strom und Spannung eingegeben wurde
    																			//Dann wird nicht mehr nach Widerstadn gefragt
    					Ergebnis = U*I;
    					if(Ergebnis > 1000) {
    						Ergebnis = Ergebnis / 1000;
    						printf("Ergebnis: %.4fkW\n\n", Ergebnis);
    						system("pause");
    						goto anfang;
    					} else {
    						if(Ergebnis < 1) {
    							Ergebnis = Ergebnis * 1000;
    							printf("Ergebnis: %.4fmW\n\n", Ergebnis);
    							system("pause");
    							goto anfang;
    						} else {
    							printf("Ergebnis: %.4f\n\n", Ergebnis);
    							system("pause");
    							goto anfang;
    						}
    					}
    				} else {
    					}
    				printf("Widerstand(%c) eingeben: ", 234);
    				check3 = scanf("%f", &R);
    				if(check1 == 1 && check3 == 1) {							//If Bedingung für P=I²*R
    																			//Wenn Strom und Widerstand eingegeben wurde
    					Ergebnis = (I*I)*R;
    					if(Ergebnis > 1000) {
    						Ergebnis = Ergebnis / 1000;
    						printf("Ergebnis: %.4fkW\n\n", Ergebnis);
    						system("pause");
    						goto anfang;
    					} else {
    						if(Ergebnis < 1) {
    							Ergebnis = Ergebnis * 1000;
    							printf("Ergebnis: %.4fmW\n\n", Ergebnis);
    							system("pause");
    							goto anfang;
    						} else {
    							printf("Ergebnis: %.4f\n\n", Ergebnis);
    							system("pause");
    							goto anfang;
    						}
    					}
    				} else {
    					}
    				if(check2 == 1 && check3 == 1) {							//If Bedingung für P=U²/R
    																			//Wenn Spannung und Widerstand eingegeben wurde
    					Ergebnis = (U*U)/R;
    					if(Ergebnis > 1000) {
    						Ergebnis = Ergebnis / 1000;
    						printf("Ergebnis: %.4fkW\n\n", Ergebnis);
    						system("pause");
    						goto anfang;
    					} else {
    						if(Ergebnis < 1) {
    							Ergebnis = Ergebnis * 1000;
    							printf("Ergebnis: %.4fmW\n\n", Ergebnis);
    							system("pause");
    							goto anfang;
    						} else {
    							printf("Ergebnis: %.4f\n\n", Ergebnis);
    							system("pause");
    							goto anfang;
    						}
    					}
    				} else {
    				}
    		break;
    		}
    

    Warum das ganze nur damit man einmal weniger nach einem Wert gefragt wird?
    Das ist für mich einfach aus Übung, ich werde dieses Programm später warscheinlich nie verwenden, es geht mir einfach um den Lern-Effekt.

    Vielen Dank schonmal!
    Ich freue mich auf eure Antworten 😃

    Gruß

    P.S.: Hier ist das komplette Programm mit scanf : https://www.dropbox.com/sh/rbz9jtqnb1katz3/AAAwxEaUtXuSQLm6sif10Rr8a?dl=0

    Nicht wundern es ist noch nicht fertig



  • Gen-Italien schrieb:

    Diese Werte lese ich mit fgets ein und speichere sie in einem Char Array.

    Wie kann ich jetzt die beiden Werte (I undf U) miteinander multiplizierenn?

    Ich hab es schon einfach mit Ergebnis = U*I usw. probiert aber alles ohne Erfolg.

    Rechnen kann man nur mit numerischen Typen, nicht mit char-Arrays. Um den Zahlenwert aus einem String zu extrahieren, gibt es Funktionen wie strtod oder sscanf.

    Und dann würde ich noch ganz gerne wissen, wie ich überprüfen kann ob etwas in einem Char Array außer /n und /0 und ENTER (also die Taste Enter(ich glaub ASCII 10), damit ich das weiterführe kann was ich mit scanf realisiert hab, siehe zweiter Quelltext.

    Indem du die Elemente des Arrays darauf untersuchst? Sorry, ich versteh zwar was du machen willst, aber nicht, was eigentlich das Problem daran sein soll. In deinem zweiten Quelltext kann ich darauf auch keinen Bezug finden.

    Allgemeine Hinweise:
    - Benutze am Anfang kein goto. Manche würden auch sagen benutze NIE goto, siehe "Spaghetti-Code" usw.
    - Benutze kein fflush(stdin) um den "Tastaturpuffer" zu löschen ... fflush ist nur für Ausgabeströme definiert, Anwendung auf Eingabeströme hat undefiniertes Verhalten. Dass das bei stdin funktioniert, ist ein spezielles Verhalten mancher C-Implementationen und nicht allgemeingültig.



  • Okay super, dann werde ich das mal ausprobieren 🙂
    Vielen Dank schonmal!

    Mit den untersuchen meine ich folgendes:

    Ich habe ja in dem zweiten Quelltext vor den scanf jeweils die Variable check gesetzt.
    Damit wird ja geprüft ob eine Eingabe getätigt wurde.

    Als erstes soll der Benutzer die Stromstärke eingeben und dann die Spannung.
    Wenn er die beiden Werte hat, brauch er ja nicht mehr den dritten Wert also den Widerstand eingeben.

    Und wenn das der Fall ist, dann wird die Frage nach der Eingabe für den Widerstand übersprungen und sofort mit Ergebnis = U*I gerechnet.

    Mit dem Spaghetti-Code hatte ich mir schon gedacht, weil ich es vorher irgendwo schonmal gelesen hatte, dann werde ich das weglassen und zusätzliche Funktionen einfügen 🙂

    Aber wenn ich fflush weglasse, dann wird das erste fgets einfach übersprungen und ich kann dort nichts mehr eingeben 😞

    Gruß



  • Gen-Italien schrieb:

    char P[10], U[10], I[10], R[10], E[10];
        ...
                    E[10] = I[10]*U[10];                                            //Die beiden eingegebenen Werte (Arrays) werden miteinander multipliziert
    

    lol

    Das geht natürlich so nicht.
    Sinnvoll multiplizieren kann man nur numerische Typen und kein char[].
    Du musst erst den Inhalt einer Variablen vom Typ char[] in einen Wert vom Typ double umwandeln und den dann einer Variable vom typ double zuweisen.
    Danach kannst du rechnen.

    Schreibe dir eine Funktion, die genau eine Nutzereingabe als C-String zurückliefert. Diese Funktion verwendest du dann immer, d.h. immer wenn der Nutzer etwas eingeben soll.
    Den Rückgabestring wertest du dann aus (z.B. testest auf leere Eingabe, wandelst in double um,...); dazu sind Funktionen nämlich da, dein Code wird sehr viel kürzer, übersichtlicher und weniger fehleranfällig.
    Indexe für Arrays in C laufen von 0...Größe-1, deine Zugriffe P[10] = ... sind allesamt Müll. Ebenso wie fflush(stdin).

    Eine universelle Funktion zur Rückgabe einer Nutzereingabe als String könnte z.B. so aussehen,

    char *lies(void)
    {
      static char s[100];
      fgets(s,100,stdin);
      if(!strchr(s,'\n'))while(!ferror(stdin)&&!feof(stdin)&&getchar()!='\n');
      return s;
    }
    

    Aufruf dann z.B.

    char *eingabe;
    ...
    eingabe = lies();
    if( *eingabe==0 ) /* Leer-Eingabe */
    
    double d = atof(eingabe); /* double-Umwandlung */
    
    char c = *eingabe;  /* erstes eingegebenes Zeichen */
    usw.
    


  • Ich verstehe leider nicht ganz was du da gemacht hast 😃

    Eine universelle Funktion zur Rückgabe einer Nutzereingabe als String könnte z.B. so aussehen,

    char *lies(void)
    {
      static char s[100];
      fgets(s,100,stdin);
      if(!strchr(s,'\n'))while(!ferror(stdin)&&!feof(stdin)&&getchar()!='\n');
      return s;
    }
    

    Als erstes erstellst du eine neue Funktion, aber wofür ist das * vor dem lies?
    deklariert man damit nicht eigentich zeiger?
    Dann deklarierst du das feste Array s.
    Dann liest du die Benutzereingabe aus.+
    und dann wirds schwieriger 😃

    das if ist auch noch klar, die Bedingung vom if ist ja: wenn kein "Enter Zeichen" eingegeben wurde fahre fort.

    Dann kommt das while, wenn If wahr ist.
    Was machen die Funktionen in der while Bedinung genau?

    Aufruf dann z.B.

    char *eingabe;
    ...
    eingabe = lies();
    if( *eingabe==0 ) /* Leer-Eingabe */
    
    double d = atof(eingabe); /* double-Umwandlung */
    
    char c = *eingabe;  /* erstes eingegebenes Zeichen */
    usw.
    

    Hier deklarierst du als erstes den Zeiger "eingabe".

    dann speicherst du in ihm den Rückgabewert der lies funktion, in diesem Fall den string.
    Anschließend: wenn der wert der variable des zeigers 0 ist mache dies und das....
    Dann: wird der string in double umgewandelt um damit später zu rechnen?

    und in c ist dann das erste eingegebene zeichen gespeichert?

    Vielen Dank für die Hilfe!

    Ich hoffe ich hab das so einigermaßen richtig verstanden, wenn nicht bitte erklären 😃



  • Troll.


Anmelden zum Antworten