C: Hilfe bei Programm (strings umwandeln)

Schnelle objektorientierte, kompilierende Programmiersprache.
Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Do Sep 12, 2013 2:09 pm

Hallo Leute.
Ich bin neu hier :D

Ich befinde mich gerade dabei die notwendigen Programme für mein Programmieren-Kurs zu schreiben um die Zulassung für die Klausur zu bekommen.
Die Aufgaben sind manchmal etwas gemein und gerade als C-Anfänger überseh ich da gerne mal die ein oder anderen Problemstellen...

Naja von den 7 zu lösenden Aufgaben fehlen mir noch 2 wobei ich bei 1 nichtmehr weiter komme und bei der anderen nichtmal die Aufgabenstellung versteh :(

Deswegen hoffe ich, dass mir hier jemand bei der einen Aufgabe noch weiterhelfen kann.

Die Aufgabe:

Schreiben Sie ein Programm "rechner", das als einziges Kommandozeilen-
Argument eine Grundrechenaufgabe enthält. Die Argumente der Aufgabe sollen
ganze positive Zahlen sein.
Aufrufbeispiele:
rechner 2*8 oder rechner 63+37
nicht aber rechner 2*-8 oder rechner -63+37
Die Rechenaufgabe ist also ohne Leerzeichen anzugegeben, d.h. nur ein Aufrufparameter!
Das Programm soll den gesamten Aufrufparameter, das Rechensymbol
(+-*/) selbst, seine Position im übergebenen String, beide Argumente und das
Ergebnis ausgeben.
In dieser Aufgabe sind vor allem spezielle Stringfunktionen aus der string.h und
die Konvertierfunktionen, wie atoi(), atol(),... einzusetzen.
Das Programm soll bei der Übergabe einer falschen Anzahl von Parametern mit
einem Fehlercode und einem Hinweis beendet werden!


So ich habs bis jetzt geschafft die beiden Zahlen aus dem String auszulesen.
Ich hab leider keinen Schimmer wie ich das Zeichen bekommen kann...
Wenn ich es als char-Variable hätte würde ich dann nen switch case machen für die 4 Grundrechenarten und den dann das Ergebnis ausgeben lassen.
Wie genau ich die Fehlermeldung für eine eingabe die größer als 2 Zahlen + ein Zeichen mache weiß ich auch noch nicht.
In der Aufgabe steht zwar das ich mich in der string.h mal umgucken soll....da find ich allerdings nichts was mir hilft...

Hier mal mein Code bis jetzt:

Code: Alles auswählen

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (void){

	char st [10], *zeichen,test;
	int a,b;
	printf("Bitte eine Rechnung ohne Leerzeichen angeben: \n");
	scanf("%s", &st); // Er holt sich den string
	
	a = strtol (st, &zeichen,0); // Der erste Wert wird a zugeordnet und ich erhalte nen Zeiger der auf den Rest des Strings zeigt
	printf("Erste Wert = %d\n Zeichen = %s\n",a,zeichen); 
	zeichen++; // Zeiger zeigt auf 2. Wert
	printf("Test: %s\n",zeichen); // Test
	b= atoi (zeichen); //Zuweisung des 2. Wertes auf b mithilfe von atoi
	printf("Test: %d\n",b);
    zeichen--; // Zeiger zeigt wieder auf das Zeichen
	printf("Test: %s\n",zeichen); //Test
	//printf("Test: %s\n",*zeichen); //Geht nicht...leider keine Ahnung wieso?


	
	// Wie krieg ich jetzt nur das Zeichen als char aus dem String raus gelesen?
	// Danach switch case für die 4 Grundrechenarten
	// Keinen Schimmer wie ich die Fehlermeldung reinbringen soll das der aufhört wenn man mehr als 2 Zahlen und 1 Zeichen eingibt...
Wäre sehr dankbar wenn mir jemand weiterhelfen oder zumindest nen Denkanstoß liefern könnte.

mfg Monkey101

p.s. Ich seh grad das sieht im Codefenster nen bissle unübersichtlich aus...ich pack die .cpp datei mal mit in den Anhang
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Do Sep 12, 2013 2:26 pm

Monkey101 hat geschrieben:Hallo Leute.
Ich bin neu hier :D
Macht nix, das ist schon anderen hier passiert ;-)
Monkey101 hat geschrieben:Die Aufgabe:

Schreiben Sie ein Programm "rechner", das als einziges Kommandozeilen-
Argument eine Grundrechenaufgabe enthält. Die Argumente der Aufgabe sollen
ganze positive Zahlen sein.
Aufrufbeispiele:
rechner 2*8 oder rechner 63+37
Du fragst bei Dir mit scanf() ab, das ist aber eigentlich nicht die Aufgabe.
Schau mal hier: c:tutorial:params
Monkey101 hat geschrieben:So ich habs bis jetzt geschafft die beiden Zahlen aus dem String auszulesen.
Ich hab leider keinen Schimmer wie ich das Zeichen bekommen kann...
Wenn ich es als char-Variable hätte würde ich dann nen switch case machen für die 4 Grundrechenarten und den dann das Ergebnis ausgeben lassen.
Wie genau ich die Fehlermeldung für eine eingabe die größer als 2 Zahlen + ein Zeichen mache weiß ich auch noch nicht.
Ich denke, der verständlichste erste Schritt wäre, wenn Du Dir kurz Gedanken machst, was Du eigentlich lesen möchtest.
Du liest zwei Zahlen. Hier könntest Du Dich mit isdigit() durch den String wuseln. Solange Du digits findest, kopierst Du diese in zwei Arrays vom typ (char [15]).
Wenn Du etwas findest, was kein Digit (Ziffer) ist, dann wird es vermutlich der Operator (+,-,*,/, Nullbyte?) sein. Du beendest also das erste Array für die Digits, in dem Du ein Nullbyte dahinter setzt. Findest Du keinen Operator, ist was verkehrt.
Dann kopierst Du den Operator in eine Char-Variable und verfährst mit dem zweiten Block - den Digits - genauso wie zuvor. nur dass Du diesmal in das zweite Array kopierst. Findest Du keine Digits, ist wohl irgendwas falsch gelaufen.

Das nennt sich Parsen. Du hast nun zwei Arrays mit Ziffern drin und ein char mit einem Operator. mit atoi kannst Du die beiden Arrays nun in integer-Variablen konvertieren, anschließend machst Du den Switch auf die Operator-Variable und gibst das Ergebnis wie von Dir vorgeschlagen in einer switch-case-Anweisung aus.


Bedenke, dass Du beim parsen immer Zustände wechselt. Ich erwarte eine Ziffer, wenn nicht => Fehler. Wenn ja, neuer Zustand: Ich lese eine Ziffer und erwarte noch eine Ziffer oder einen Operator. Wenn Ziffer, dann nochmal, wenn Operator, dann abschluss erste Zahl, Operator merken, Operator überspringen, Ziffer erwarten...
Diese Zustände musst Du ausformulieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Do Sep 12, 2013 3:00 pm

Hallo Xin.

Erstmal Danke für die Antwort.

Theoretisch hab ich dein Prinzip schonmal verstanden.

Leider scheitert es bei mir schon an dem Ding mit der Kommandozeile.
Ich benutze Visual Studio 2010 Express...
Ich kann da irgendwie über Extras -> Visuelle Eingabeaufforderung so nen Eingabefenster öffnen.
Leider hab ich keine Ahnung wie ich da jetzt irgendwelche Argumente aufrufe oder überhaupt mein Programm starten kann :(
Werd leider auch im Internet nicht wirklich fündig...oder besser gesagt ich versteh die Sachen die ich finde einfach nicht...

mfg Monkey101

edit:
Ok ich wollts jetzt einfach mal weiter machen mit dem string den ich durch scanf() eingelesen hab...aber bei dem isdigit() scheiterts auch gnadenlos bei mir.
Zum einen will er isdigit(st) /* st is der eingelesene string */ garnit erst einlesen.
Und zum anderen bin ich mir auch noch nicht sicher wie ich das in nen char array speichern soll.
Müsste ich das dann über ne if-Anweisung machen?
So nach dem Motto:
if (isdigit (st) == true) dann chararray = st (un das dann mit ner schleife durchzählen sodass der die werte nacheinander in den neuen array schreibt)
else break;

Falls ja käme ich wieder zum gleichen Problem wie vorher auch...er würde nach der ersten Zahl aufhören und ich weiß nicht wie ich an das Zeichen komme oder ihn danach weiterlaufen lassen kann um an die 2. Zahl zu kommen.

mfg Monkey101
Zuletzt geändert von Monkey101 am Do Sep 12, 2013 3:26 pm, insgesamt 1-mal geändert.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Do Sep 12, 2013 3:24 pm

Monkey101 hat geschrieben:Theoretisch hab ich dein Prinzip schonmal verstanden.
Schade, dass Du verstanden und nicht begriffen geschrieben hast, denn etwas theoretisch begreifen hätte den Satz noch schöner gemacht. :-D
Monkey101 hat geschrieben:Leider scheitert es bei mir schon an dem Ding mit der Kommandozeile.
Ich benutze Visual Studio 2010 Express...
Ich kann da irgendwie über Extras -> Visuelle Eingabeaufforderung so nen Eingabefenster öffnen.
Sagt mir nix... ich habe hier VS 2010 Professional, aber keine Visuelle Eingabeaufforderung.
Monkey101 hat geschrieben:Leider hab ich keine Ahnung wie ich da jetzt irgendwelche Argumente aufrufe oder überhaupt mein Programm starten kann :(
Drück die Windows-Taste und gib "cmd" ein und drücke Enter. Da kommt die Eingabe-Aufforderung.

Nun ist die Frage, wo Du Dein Projekt überhaupt hinkompiliert hast. Geh auf Dein Projekt in VisualStudio im "Projektmappen-Explorer" und mach einen Rechtsklick. Dort wählst Du Eigenschaften.
Ein Fenster geht auf und in Konfigurationseigenschaften->Allgemein gibt es eine Zeile Ausgabeverzeichnis. Merken! Auch das Inhalt von "Zielname"

Nun gehst Du zurück in die Eingabeaufforderung und gibst ein "cd \pfad\zum\ausgabeverzeichnis".
Wenn Du nun "dir" eingibst, erhältst Du eine Liste mit dem Inhalt dieses Verzeichnisses. Darunter sollte auch eine Datei sein, die so heißt, wie im "Zielname" in den Einstellungen und die die Erweiterung .exe trägt. Das ist Dein Programm.

Gibst Du nun den Programmnamen ein, startet Dein Programm.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Do Sep 12, 2013 3:51 pm

Ich komm mir grad ziemlich blöd vor...aber trotz der Erklärung krieg ich es nicht hin :cry:

Bild

Hab auch iwi probiert nen Pfad zu dem Ordner wo ich es gespeichert hab (c/desktop/meine Programme) einzugeben aber da kommen auch nur Fehler...

mfg Monkey101

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Do Sep 12, 2013 4:00 pm

Monkey101 hat geschrieben:Ich komm mir grad ziemlich blöd vor...aber trotz der Erklärung krieg ich es nicht hin :cry:
Liegt nicht an Dir, sondern dass meine Erklärung mit einem Standard-Projekt nicht passt ^^

SolutionDir usw. sind Variablen von Visual Studio, die kennt die Eingabekonsole so nicht. Bitte klick auf das kleine Dreieck rechts von $(SolutionDir...), ein Fenster öffenet sich.
Wenn Du unten auf "Macros >>" klickst siehst Du eine Liste, wo $(SolutionDir) und alles, was Du brauchst drin steht.

Oder etwas schneller (zumindest würde ich es bei einem Standardprojekt so erwarten):
Gib ein:

Code: Alles auswählen

cd "\Users\<DeinBenutzername>\Documents\Visual Studio 2010\Projects"
Mit "dir" erhältst Du eine Liste der Projekte. Dein Projekt heißt "Praktikum Auf. 5", also

Code: Alles auswählen

cd "Praktikum Auf. 5"
Du kannst mit Tab die Eingabe beschleunigen, so dass Du die Verzeichnisse nicht ausschreiben musst.

In dem Ordner solltest Du die .exe finden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Do Sep 12, 2013 4:22 pm

Ok Danke.

Also war jetzt ne lange Geburt aber ich hab die .exe gefunden^^
Das mit dem Tab scheint bei mir mit Ordnern nicht zu funktionieren...muss den Pfad bis in den Ordner wo die .exe liegt per Hand eingeben
Wie übergeb ich dem dann die Parameter?

Ich hatte mal kurz was probiert mit dem string den ich vorher über scanf eingelesen hab da kommt aber leider nur Müll bei rum...

Code: Alles auswählen

char st [10], *zeichen,test,ch1[15];
	int a,b,i=0;
	printf("Bitte eine Rechnung ohne Leerzeichen angeben: \n");
	scanf("%s", &st); // Er holt sich den string
	while (isdigit (st[i])){

		ch1[i]=st[i];
		i++;
		
	}
	printf("ch1 ist: %s\n",ch1);
Er spuckt dann nen haufen Zeichen aus und dann einfach den string den ich eingegeben hatte...

edit:
Ich hab jetzt mal Das Beispiel hier ausprobiert

Code: Alles auswählen

/* argument.c */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   int i;

   for(i=0; i < argc; i++) {
      printf("argv[%d] = %s ", i, argv[i]);
      printf("\n");
   }
   return EXIT_SUCCESS;
}
Ich kriegs aber leider nicht mit den Argumenten aufgerufen :(
Bild
Irgendwie versteh ich das Beispiel nit richtig glaub ich...

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Do Sep 12, 2013 6:09 pm

Update Nr 3:
Der Durchbruch!

Code: Alles auswählen

char st [10], *zeichen,test,ch1[15],ch2[15];
	int a,b,i=0,j=0;
	printf("Bitte eine Rechnung ohne Leerzeichen angeben: \n");
	scanf("%s", &st); // Er holt sich den string
	while (isdigit (st[i])){ // 1. Array mit den ersten Ziffern
		ch1[i]=st[i];
		i++;
	}
	ch1[i]='\0';
	printf("ch1 ist: %s\n",ch1);
	test=st[i]; // Das Rechenzeichen
	i+=1;
	while (isdigit (st[i])){ // 2. Array mit den folgenden Ziffern
		ch2[j]=st[i];
		i++;
		j++;
	}
	ch2[j]='\0';
	printf("ch2 ist: %s\n",ch2);
	printf("test ist: %c\n",test);
Jetzt spuckt er mir die richtigen Werte raus...ich probiers jetzt weiter mit atoi() und co...das mit der Kommandozeile hab ich immernoch nit hingekriegt :(

Update Nr2:
Ok Jetzt hab ich es glaub ich fast...der 2. Array funktioniert noch nicht wie gewollt.
Muss ich vllt nen fflush noch reinbauen oder sowas?

Code: Alles auswählen

char st [10], *zeichen,test,ch1[15],ch2[15];
	int a,b,i=0;
	printf("Bitte eine Rechnung ohne Leerzeichen angeben: \n");
	scanf("%s", &st); // Er holt sich den string
	while (isdigit (st[i])){ // 1. Array mit den ersten Ziffern
		ch1[i]=st[i];
		i++;
	}
	ch1[i]='\0';
	printf("ch1 ist: %s\n",ch1);
	test=st[i]; // Das Rechenzeichen
	i+=1;
	while (isdigit (st[i])){ // 2. Array mit den folgenden Ziffern
		ch2[i]=st[i];
		i++;
	}
	ch2[i]='\0';
	printf("ch2 ist: %s\n",ch2);
	printf("test ist: %c\n",test);


Update:

Also hier mal meine Grundidee für die isdigit()-Sache:

Code: Alles auswählen

char st [10],test,ch1[15],ch2[15];
	int i=0;
	printf("Bitte eine Rechnung ohne Leerzeichen angeben: \n");
	scanf("%s", &st); // Er holt sich den string
	while (isdigit (st[i])){ // 1. Array mit den ersten Ziffern
		ch1[i]=st[i];
		i++;
	}
	test=st[i]; // Das Rechenzeichen
	i+=1;
	while (isdigit (st[i])){ // 2. Array mit den folgenden Ziffern
		ch2[i]=st[i];
		i++;
	}

Das ch1=st; fumktioniert leider nicht...ich hab auch schon probiert mit strcpy() oder so zu arbeiten aber leider ohne Erfolg...

Wäre das denn (zumindest vom Gedankengang) her ok so?
Nach dem würden dann die atoi() Anweisungen kommen un der switch case...
Den Check ob ungültige Eingaben gemacht wurden muss ich dann noch iwi mit dem letzten isdigit verbinden...

mfg Monkey101

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Xin » Do Sep 12, 2013 7:40 pm

Kleiner Tipp: Leerzeilen trennen unterschiedliche Abschnitte des Algorithmus.

Und Du beschreibst ch2 an Stelle i mit den Chars, die Du bei st liest. Ich glaube nicht, dass Du bei beiden Fällen "i" meinst. ^^

Ansonsten passt der Gedankengang.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Monkey101
Beiträge: 15
Registriert: Do Sep 12, 2013 1:53 pm

Re: C: Hilfe bei Programm (strings umwandeln)

Beitrag von Monkey101 » Do Sep 12, 2013 7:52 pm

Hi.
Also soweit funktioniert das Programm (was mich schonmal erleichtert^^)
Hier die aktuelle Version:

Code: Alles auswählen

char st [10],zeichen,ch1[15],ch2[15];
	int z1,z2,e,i=0,j=0;
	printf("Bitte eine Rechnung ohne Leerzeichen angeben: \n");
	scanf("%s", &st); // Er holt sich den string
	while (isdigit (st[i])){ // 1. Array mit den ersten Ziffern
		ch1[i]=st[i];
		i++;
	}
	ch1[i]='\0';
	
	zeichen=st[i]; // Das Rechenzeichen
	i+=1;
	while (isdigit (st[i])){ // 2. Array mit den folgenden Ziffern
		ch2[j]=st[i];
		i++;
		j++;
	}
	ch2[j]='\0';
	if (st[i] != '\0'){ // Falls mehr Zeichen nachher kommen
		printf("Fehler!\n Ihre Eingabe entspricht nicht dem gewuenschtem Format\n");
		exit(0);
	}
	
	else {
	
	printf("ch1 ist: %s\n",ch1);
	printf("zeichen ist: %c\n",zeichen);
	printf("ch2 ist: %s\n",ch2);
	
	z1= atoi(ch1);
	z2= atoi(ch2);

	printf("Zahl 1 ist: %d\n Zahl 2 ist: %d\n",z1,z2);

	switch (zeichen)
	{
	case '+':
		e=z1+z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;

	case '-':
		e=z1-z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;

	case '*':
		e=z1*z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;
		
	case '/':
		e=z1/z2;
		printf("Das Ergebnis ist: %d\n",e);
		break;

	default:
		printf("FEHLER!!");
		break;


	}
	}
}
Probleme gibts noch wenn man ein Leerzeichen zwischen die Werte setzt (aber bei meiner printf() am anfang steht ja eig das man alles ohne Leerzeichen eingeben soll^^).

Jetzt fehlt nurnoch das übergeben von der Kommandozeile...da müsste ich dann den string tauschen und die scanf() rausnehmen.
Oder dem string der übergeben wird den Namen st[] geben.

Aber für heute mach ich erstmal Schluss bin da jetzt gute 7h dran...

Also bis hier hin schonmal vielen vielen Dank :)
Wäre schön wenn du mir noch mit der Kommandozeile helfen könntest (auch wenn ich da nen bisschen schwerfällig mit bin).

mfg Monkey101
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Antworten