[C] swich mit Wort

Murphy7

Ensign
Registriert
Mai 2008
Beiträge
135
Ich will ein rechenprogramm schreiben.
Durch die swich anweisung will ich entscheiden ob man addiert oder subtahiert.
Aber hier erstmal den code das ihr es besser versteht

Code:
#include <stdio.h>

int main()
{
    char rechenart[10]; /*die 10 steht dafür das "rechenart" 10 zeichen aufnehmen kann*/
    printf ("Was wollen sie machen?\n1)addieren\n2)subtrahieren\nGeben sie ein: ");
    scanf ("%s", rechenart);   /*s nimmt eine zeichenkette auf*/

    printf ("Sie wollen %s\n",rechenart);  /* ausgabe der rechenart*/


    switch (rechenart)
    {
    case "addieren": int summand1, summand2;

                            printf ("Summand1 eingeben: ");
                            scanf ("%d", &summand1);
                            printf ("Summand1 eingeben: ");
                            scanf ("%d", &summand2);
                            printf ("%d + %d = %d\n", summand1, summand2, summand1 + summand2);
                            break;
   case "subtrahieren": int minuend, subtrahend;
                            printf ("minuend eingeben: ");
                            scanf ("%d", &minuend);
                            printf ("subtrahend eingeben: ");
                            scanf ("%d", &subtrahend);
                            printf ("%d - %d = %d\n", minuend, subtrahend, minuend - subtrahend);
                            break;
    default: printf ("Es wurde etwas anderes angegeben.");
  }

    return 0;
}


Nur es funktioniert leider nicht, ich weiß auch warum weil sonst bei case ein zahl kommt
also das
Code:
case 1:
Mit zahl funktioniert es wenn ich oben nocht alles ändere

Nur ich will es mit dem wort addieren machen also mit einem String, das hier
Code:
case "addieren":

Nur wie kann ich das machen, dass es funktioniert?

Mein Compiler gibt dieses Problem an wem es hilft.
"case label does not reduce to an integer constant"
 
Das geht nicht mit switch-case!

Du müsstest es entweder mit Zahlen machen, oder du verwendest if, aber mit switch-case und strings wird das nichts.

Gruß
BlackMark
 
Ich habe eine neue idee.
Ich kann addieren und subtrahieren definieren
Code:
#define addieren  1
#define subtrahieren  2


Nur dann gibt mein compiler diese problem an "switch quantity not an integer". Ich weiß aber nicht was das bedeuten soll.

Dass ist dann der neu code
Code:
#include <stdio.h>
#define addieren  1
#define subtrahieren  2

int main()
{
    char rechenart[10]; /*die 10 steht dafür das "rechenart" 10 zeichen aufnehmen kann*/
    printf ("Was wollen sie machen?\n1)addieren\n2)subtrahieren\nGeben sie ein: ");
    scanf ("%s", rechenart);   /*s nimmt eine zeichenkette auf*/

    printf ("Sie wollen %s\n", rechenart);  /* ausgabe der rechenart*/


    switch (rechenart)
    {
    case addieren: int summand1, summand2;

                            printf ("Summand1 eingeben: ");
                            scanf ("%d", &summand1);
                            printf ("Summand1 eingeben: ");
                            scanf ("%d", &summand2);
                            printf ("%d + %d = %d\n", summand1, summand2, summand1 + summand2);
                            break;
   case subtrahieren: int minuend, subtrahend;
                            printf ("minuend eingeben: ");
                            scanf ("%d", &minuend);
                            printf ("subtrahend eingeben: ");
                            scanf ("%d", &subtrahend);
                            printf ("%d - %d = %d\n", minuend, subtrahend, minuend - subtrahend);
                            break;
    default: printf ("Es wurde etwas anderes angegeben.");
  }

    return 0;
}
 
Mit #define definierst du zwei Variablen mit den Werten 1 und 2.
Dann liest du einen String ein und vergleichst diesen mit den Variablen, also mit 1 und 2.
Das wird aber so nicht Funktionieren, weil du keinen String mit Integer vergleichen kannst!

Mach das Ganze doch einfach so:
Code:
#include <stdio.h>

int main()
{
	int rechenart;
	printf ("Was wollen sie machen?\n1)addieren\n2)subtrahieren\nGeben sie ein ( 1 || 2 ): ");
	scanf ("%d", &rechenart);

	switch (rechenart)
	{
	case 1: int summand1, summand2;

		printf ("Summand1 eingeben: ");
		scanf ("%d", &summand1);
		printf ("Summand1 eingeben: ");
		scanf ("%d", &summand2);
		printf ("%d + %d = %d\n", summand1, summand2, summand1 + summand2);
		break;

	case 2: int minuend, subtrahend;

		printf ("minuend eingeben: ");
		scanf ("%d", &minuend);
		printf ("subtrahend eingeben: ");
		scanf ("%d", &subtrahend);
		printf ("%d - %d = %d\n", minuend, subtrahend, minuend - subtrahend);
		break;

	default: printf ("Es wurde etwas anderes angegeben.");
	}

	return 0;
}

Funktioniert super und ist auch leichter zum eingeben ;)

Gruß
BlackMark
 
schreib die cases als block.. also
case 1:
{
..
}

das ist schon deshalb angebracht dass sich die variablen innerhalb des cases nicht mit denen aus der funktion überlagern.
 
Die Art und Weise wie du scanf einsetzt ist übrigens auch nicht ohne. Was passiert, wenn der Benutzer ein Wort eingibt, das länger als 9 (9 + Nullbyte = 10) Zeichen ist?

benutze bitte sowas:
Code:
scanf ("%9s", rechenart);
 
Vielen dank für die antworten hab es so gemacht
Code:
   #include <stdio.h>
  
int main()
{

int wiederholung;
do
{

    int rechenart;
    printf ("Was wollen sie machen?\n1)addieren\n2)subtrahieren\n3)multiplizieren\n4)dividieren\nWählen Sie!: ");
    scanf ("%d", &rechenart);

switch (rechenart)
    {
    case 1: int summand1, summand2;

                            printf ("Sie wollen addieren! (a+b=c)\nGeben sie ein Wert für a ein: ");
                            scanf ("%9d", &summand1);
                            printf ("Geben sie ein wert für b ein: ");
                            scanf ("%9d", &summand2);
                            printf ("\a%d + %d = %d\n", summand1, summand2, summand1 + summand2);
                            break;
   case 2: int minuend, subtrahend;
                            printf ("Sie wollen subtrahieren! (a-b=c)\nGeben sie ein Wert für a ein: ");
                            scanf ("%9d", &minuend);
                            printf ("Geben sie ein Wert für b einn: ");
                            scanf ("%9d", &subtrahend);
                            printf ("\a%d - %d = %d\n", minuend, subtrahend, minuend - subtrahend);
                            break;
    case 3: int faktor1, faktor2;
                            printf ("Sie wollen multiplizieren! (a*b=c)\nGeben sie ein Wert für a ein: ");
                            scanf ("%9d", &faktor1);
                            printf ("Geben sie ein wert für b ein: ");
                            scanf ("%9d", &faktor2);
                            printf ("\a%d * %d = %d\n", faktor1, faktor2, faktor1 * faktor2);
                            break;
    case 4: int dividend, divisor;
                            printf ("Sie wollen dividieren! (a:b=c)\nGeben sie ein Wert für a ein: ");
                            scanf ("%9d", &dividend);
                            printf ("Geben sie ein wert für b ein: ");
                            scanf ("%9d", &divisor);
                            printf ("\a%d : %d = %d\n", dividend, divisor, dividend / divisor);
                            break;


    default: printf ("Sie wollen nicht rechnen\n");

}
printf ("Wollen sie nochmal rechnen? (1.ja/2.nein): ");
scanf ("%d", &wiederholung);
}
while (wiederholung == 1);


    return 0;
}
 
"%9d" machst so keinen Sinn. Es ist zwar gut, dass du versuchst das anzuwenden aber am besten liest du erstmal was das macht bevor du es anwendest. Mit "%s" liest scanf beliebig viele Zeichen ein(bis zum nächsten Leerzeichen/Enter/etc). Und schreibt das in die Variable rein. Wenn die Eingabe länger ist, als der Speicher groß ist, den du reserviert hast, knallt das früher oder später. Mit "%ZAHLs" kannst du das auf ZAHL Zeichen begrenzen. Bei einer Zahl ist die Gefahr nicht gegeben, da hört der Computer von selbst auf.
 
Zuletzt bearbeitet:
wenn du es elegant lösen willst, machst du es mit einer aufzählung:
Code:
enum Operation { addieren = 0, subtrahieren, multiplizieren, dividieren };
// ...
printf( addieren + " zum addieren\r\n" );
printf( subtrahieren + " zum subtrahieren" );
// oberes nur fiktiv dargestellt
// ...
switch( rechenart )
{
  case dividieren :
    // ...
  break;
  case multiplizieren :
    // ...
  break;
  case subtrahieren :
    // ...
  break;
  case addieren : default : 
    // ...
}
präprozessordefinitionen werden nämlich anderweitig verwendet und nicht für solch kleine sachen (im prinzip ist es aber egal).

btw: variablendeklarationen innerhalb einer switch anweisung solltest du so weit wie möglich umgehen, denn wenn du mal mit msvc++ arbeitest, überspringt er diese deklarationen einfach. eine abhilfe ist nur eine deklaration vor dem switch oder du beginnst in jedem case-zweig einen block ({ ... }).
 
Wieder einer, der sein SICP heute noch nicht gelesen hat.
Code:
(define rechenart
  (lambda (x)
    (cond ((eq? x 'dividieren) +)
          ((eq? x 'multiplizieren) *)
          ((eq? x 'addieren) +)
          ((eq? x 'subtrahieren) -)
          ...
          (else #f))))

Code:
> ((rechenart 'addieren) 7 ((rechenart 'multiplizieren) 5 4))
27
7 mit 5 mal 4 addieren ergibt 27.
 
Zuletzt bearbeitet:
hehe asdfman... Pseudocode in allen Ehren, aber ich glaube niemand versteht das so recht wenn das Buch dazu nicht gelesen wurde. :)
 
Ich kenn das Buch, habs aber selber nur spartanisch gelesen, aus dem einfachen Grund dass es schlichtweg nicht mehr zeitgemäße Formulierungen in Sachen Pseudocode darstellt... Meines Wissens beruht das Buch auch auf einer Logiksprache genannt LISP. LISP ist hier vollkommen fehl am Platz.

All das was ich in Pseudocode formulieren will, schreibe ich in Pascal, der momentan üblichen Methode sich auf diesem Wege auszutauschen.
 
Zuletzt bearbeitet:
Und wie mache ich das dann mit if wenn ich Strings verwenden will. Bitte mit Beispiel, muss nicht mein Beispiel sein.

Vielen Dank
 
Code:
str1= "test";
if(strcmp(str1, "test") == 0){
   printf("test gefunden");
} else if(strcmp(str1, "bla") == 0){
   printf("bla gefunden");
} else {
   printf("nichts gefunden");
}
 
Code:
void main()
{
int str1= 'test';

	if (str1 == 'test')
		{
			printf("test gefunden");
		}

	else if  (str1 == 'bla')
		{
			printf("bla gefunden");
		}

	else
		{
			printf("nichts gefunden");
		}

	getchar();
}

PS: Ich würde nach einem "scanf" ein "fflush(stdin)" machen, damit der Tastatur Buffer geleert wird.
 
Zuletzt bearbeitet:
walter33331 schrieb:
PS: Ich würde nach einem "scanf" ein "fflush(stdin)" machen, damit der Tastatur Buffer geleert wird.

Das ist undefiniertes Verhalten. fflush ist nur auf Ausgabestreams anwendbar.

Die Annahme, dass stdin immer die Tastatur ist, ist falsch. Manche Compilerbauer haben sich in dem Leidklagen, dass fflush(stdin) nichts täte, dazu breitschlagen lassen den Tastaturpuffer zu leeren. Das ist trotzdem kein definiertes Verhalten oder etwas, was man auf einem anderen Compiler als funktionierend erwarten darf. Was soll z.B. ein fflush(stdin) machen, wenn ein Bandlaufwerk an der Standardeingabe hängt? Das ganze Band durchnudeln?

Ist zwar ein nett gemeinter Hinweis, aber nicht zum Nachmachen geeignet.
 
Gibt es den einen allgemeinen definierten Befehl, um in [C] den Tastaturbuffer zu leeren?
Also einer der bei den meisten Compiler funktioniert.

Ist manch mal noch hilf reich, wenn ich im Programm mehrere oder eine Eingabe habe und dann nach der Ausgabe ein getchar() mache. Mit fflush(stdin) muss ich nur ein getchar() sonst muss ich zwei machen.
 
Wenn man stdin bis zum Zeichenende-Zeichen leeren möchte, wäre so was hier möglich
Code:
intc; 
while ((c = getchar()) != EOF && c != '\n');
 
@walter33331:
Also wenn du hier keine Strings aus C++ (std::string) verwendest dann ist dein Code mit den "==" falsch...hier gehts ja um char-Arrays in C und da ist ein solcher Vergleich fatal weil es eben ein Array ist. strcmp oder strncmp (wenns bissel sicherer sein soll) sind eben das Mittel der Wahl weil du sonst nicht korrekt vergleichst!

Außerdem sollte ja wohl str1 nicht als int definiert sein...
 
Zurück
Oben