Erste Schritte in C

Alt 04.11.2009, 11:14   # 1
Richi
 
Benutzerbild von Richi
 
Registriert seit: 13.12.2008
Ort: Rosenheim
Beiträge: 213
Hallo zusammen ich bin gerade dabei mir selbstständig C beizubringen.. Aber aller Anfang ist schwer so auch bei mir und C.
Ich möchte ein ganz einfaches Programm schreiben welches mir den Literverbrauch auf 100 km berechnet und danach, je nach Literhöhe also bis 5 Liter, zwischen 5-10 Liter, und mehr als 10 Liter, den dementsprechenden Kommentar dazu einfügt...
Hier ist schonmal der Code den ich selbst geschrieben habe vielleicht weiss ja jemand wo der Fehler liegt??

Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


float liter,km,verbrauch;
char name[10];

int main(int argc, char *argv[])

{printf("\t\t\t\tBenzinverbrauch\n\n");

printf("Wie heisst du: ");
scanf ("%c",&name);
printf("%c ist ein schoener Name ;)",name);

printf("\n\nWieviele Kilometer bist du heute gefahren: ");
scanf("%4.2f",&km);
printf("\nDu bist also %4.2f Kilometer gefahren",km);

printf("\n\nWieviele Liter hast du dabei benoetigt: ");
scanf("%3.2f",&liter);
printf("\nDu hast also %3.2f Liter benoetigt...\n\n\n");

verbrauch = liter/km*100;

if (verbrauch <=5)
printf("Ahh, Smartwagenfahrer",verbrauch);

if (verbrauch >=10)
printf("Hoffentlich haste nen kleinen Bohrrurm im Garten stehen ...",verbrauch);

else

printf("Der typische Mittelklassewagenfahrer!\n\n",verbrauch);
  
  system("PAUSE");	
  return 0;
}
  Mit Zitat antworten
Alt 04.11.2009, 11:14 # --
netzwelt.de
 
Benutzerbild von netzwelt.de
 
 
 
   
Alt 10.11.2009, 17:19   # 2
Fab
 
Registriert seit: 08.11.2009
Ort: Ein kleines Eifelnest
Beiträge: 2
Was sagt denn der kompiler.
Ich kann C auch nicht besonders gut - ich bin eher ein Delphi-Mensch
Aber der Kompiler wird doch irgendetwas sagen

MFG
Fab
  Mit Zitat antworten
Alt 10.11.2009, 18:02   # 3
Manaja
 
Registriert seit: 13.07.2009
Beiträge: 199
Also, der Fehler liegt wohl darin, dass nur der Name eingegeben werden kann und das Programm nach Drücken der Return-Taste alle weiteren Meldungen so ausgibt, ohne weitere, manuell eigegebene Werte, ausgibt.

-----Doppelpost zusammengeführt am 10.11.2009 um 19:16:32-----

Okay, also mit Deinem Programm kommt man bis zur Eingabe des Namens:

Beispiel: Hugo

Dann gibt er allerdings nicht Hugo aus, sondern ein ASCII-Zeichen.
Ändert man jedoch das "%c" in den folgenden Zeilen um in "%s", gibt er auch den Namen aus.

printf("Wie heisst du: ");
scanf ("%s",&name);
printf("%s ist ein schoener Name ",name);

Das andere Problem mit dem Überspringen der manuellen Werteeingabe, ist wahrscheinlich auch ganz einfach zu lösen.

Grüssli,
Manaja

-----Doppelpost zusammengeführt am 10.11.2009 um 19:23:31-----

Spaßeshalber habe ich mal die Float-Deklaration, in eine Integer-Deklaration geändert. Ebenso alle "%f" in "%i".

Jetzt komme ich bis zur Eingabe der Kilometerzahl sowie der Eingabe des Verbrauchs in Litern.

Das Ergebnis, was dann ausgerechnet wird, ist jedoch erschreckend.
Die Lösung gibt's bestimmt noch in dieser Woche. :wink:

Ich klink mich hier mal aus.

-----Doppelpost zusammengeführt am 10.11.2009 um 19:46:34-----

Sooo, nun hab ich den Code mal ein wenig mehr verändert. Vielleicht passt es ja jetzt:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float liter,km,verbrauch;
char name[10];

int main(void)

{printf("\t\t\t\tBenzinverbrauch\n\n");

printf("Wie heisst du: ");
scanf ("%s",&name);
printf("%s ist ein schoener Name ",name);

printf("\n\nWieviele Kilometer bist du heute gefahren: ");
scanf("%f",&km);
printf("\nDu bist also %.0f Kilometer gefahren",km);

printf("\n\nWieviele Liter hast du dabei benoetigt: ");
scanf("%f",&liter);
printf("\nDu hast also %.0f Liter benoetigt...\n\n\n", liter);

verbrauch = liter/km * 100;

if (verbrauch <=5)
printf("Ahh, Smartwagenfahrer",verbrauch);

if (verbrauch >=10)
printf("Hoffentlich haste nen kleinen Bohrrurm im Garten stehen ...",verbrauch);

else

printf("Der typische Mittelklassewagenfahrer!\n\n",verbrauch);

system("PAUSE");
return 0;
}
Warum deklarierst Du "name" eigentlich als "character" und nicht als "string"?

Grüssli,
Manaja

-----Doppelpost zusammengeführt am 10.11.2009 um 19:57:52-----

Und noch eine Frage:

Bei der Ausgabe der Kommentare (Smartfahrer, Bohrturm..usw.) gibst Du am Ende der Codezeilen immer ",verbraucht" an, ohne vorher einen Platzhalter zu benutzen. Warum?

-----Doppelpost zusammengeführt am 10.11.2009 um 19:58:41-----

"verbrauch"....sorry
  Mit Zitat antworten
Alt 11.11.2009, 20:28   # 4
Richi
Threadstarter
 
Benutzerbild von Richi
 
Registriert seit: 13.12.2008
Ort: Rosenheim
Beiträge: 213
Zitat:
Zitat von Manaja Beitrag anzeigen
Warum deklarierst Du "name" eigentlich als "character" und nicht als "string"?

Grüssli,
Manaja

-----Doppelpost zusammengeführt am 10.11.2009 um 19:57:52-----

Und noch eine Frage:

Bei der Ausgabe der Kommentare (Smartfahrer, Bohrturm..usw.) gibst Du am Ende der Codezeilen immer ",verbraucht" an, ohne vorher einen Platzhalter zu benutzen. Warum?

-----Doppelpost zusammengeführt am 10.11.2009 um 19:58:41-----

"verbrauch"....sorry

Ich dachte mir ein Char hat alle Zeichen inbegriffen somit auch Buchstaben, und somit gefolgert das wäre das selbe wie einen float herzunehmen der aber nur natürliche Integerzahlen bekommt..

Brauch ich für |verbrauch| auch einen Platzhalter? Ist das durch die Formel nich schon gewissermassen vordeklariert? Oder muss ich das printen??

Muss ich für die Ober und Untergrenzen ( 10 + 5 ) bei der if abfrage vielleicht eine const hernehmen? Funktionierts vielleicht so in der Art:

const int untergrenze = 5,obergrenze = 10;

und danach

if (obergrenze<verbrauch)
printf(...);

if (untergrenze<verbrauch)

else
printf(::;


Vielen Dank schon mal für deine guten Erklärungen manaja

und auch

@fab: Der Kompiler sagt ständig das selbe was irgendwie keinem weiterhilft.
  Mit Zitat antworten
Alt 12.11.2009, 14:51   # 5
Manaja
 
Registriert seit: 13.07.2009
Beiträge: 199
Es ist auch bei mir ein wenig her, dass ich mich mit C/C++ auseinandergesetzt habe und ich hoffe, dass das, was noch hängengeblieben ist, Dir ein wenig weiter hilft.

Eine Variable vom Typ "char" nimmt 1 Zeichen auf. Ich für meine Wenigkeit würde mich bei einer längeren Zeichenkette immer für die Typenbezeichnung "string" entscheiden.
*was ja in Deinem Programm auch funktioniert*

Die Angabe "%.2f" sagt dem Programm, dass das Ergebnis mit 2 Nachkommastellen ausgegeben werden soll. Diese Angabe kommt aber nicht in die Eingabe-Zeile, da reicht "%f".
*probier mal aus, was passiert, wenn Du in die scanf-Zeile "%.2f" eingibst*

Muss für "verbrauch" im auszugebenen Text ein Platzhalter stehen?
Ja, denn -zumindest auf meinem Bildschirm- ohne Platzhalter, wird rein der Text ausgegeben, nicht aber der Inhalt der Variablen "verbrauch".

Deine Frage zu den const-Variablen: Konstanten setzt man nur ein, wenn die Inhalte sich tatsächlich nicht verändern sollen. Bei Deiner Ober- und Untergrenze ist die Idee also nicht verkehrt.

Dein Programm hat allerdings noch einen kleinen Schönheitsfehler:
Gibst Du bei Kilometer den Wert 100 ein und bei Liter den Wert 3, wird als Text sowohl "...Smartwagenfahrer" als auch der Text mit "...Mittelklassewagen" ausgegeben.

Kommst Du drauf, warum das so ist?

Grüssli,
Manaja

Hier nochmal Dein Code mit "leichten" Veränderungen:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


float liter,km,verbrauch;
char name[10];

int main(void)

{printf("\t\t\t\tBenzinverbrauch\n\n");

printf("Wie heisst du: ");
scanf ("%s",&name);
printf("%s ist ein schoener Name ",name);

printf("\n\nWieviele Kilometer bist du heute gefahren: ");
scanf("%f",&km);
printf("\nDu bist also %.2f Kilometer gefahren",km);

printf("\n\nWieviele Liter hast du dabei benoetigt: ");
scanf("%f",&liter);
printf("\nDu hast also %.2f Liter benoetigt...\n\n\n", liter);

verbrauch = liter/km * 100;

if (verbrauch <=5)
printf("Ahh, Smartwagenfahrer %.2f Liter pro 100km",verbrauch);

if (verbrauch >=10)
printf("Hoffentlich haste nen kleinen Bohrrurm im Garten stehen %.2f Liter pro 100km...",verbrauch);

else

printf("Der typische Mittelklassewagenfahrer! %.2f Liter pro 100 km\n\n",verbrauch);

system("PAUSE");
return 0;
}
  Mit Zitat antworten
Alt 14.12.2009, 17:53   # 6
King W.
Team SAT-Technik
 
Benutzerbild von King W.
 
Registriert seit: 01.01.2006
Ort: mitten im Kohlenpott
Beiträge: 10.369
Bin zwar nur ein lausiger Cobol-Programmierer mit wenig Ahnung von C, aber der Fehler ist leicht zu erkennen.

Wenn die Ausgabe "Smartwagenfahrer" erscheint, ist der Verbrauch nicht >= 10. Das Programm läuft bei der 2. Abfrage in den else-Zweig und gibt "Mittelklassefahrer" aus.

Lösung: Die 1. Abfrage muß um einen else-Zweig erweitert werden und dort hinein gehört die 2. Fallunterscheidung. Ist die erste IF-Abfrage "wahr", wird der else-Zweig und damit die 2. Abfrage nicht mehr durchlaufen, die falsche Ausgabe findet nicht mehr statt.

__________________
Es gibt keine großen Entdeckungen und Fortschritte, solange es noch ein unglückliches Kind auf Erden gibt.
Albert Einstein
  Mit Zitat antworten
Alt 14.12.2009, 20:59   # 7
Wiener78
 
Benutzerbild von Wiener78
 
Registriert seit: 24.03.2009
Ort: Wien
Beiträge: 873
Ohhhh, da erwachen wieder Erinnerungen, leider schon mehr als 1 Jahrzehnt her...
  Mit Zitat antworten
Alt 17.07.2010, 21:17   # 8
Jolosin
 
Registriert seit: 17.07.2010
Beiträge: 8
Zwar n bisschen spät der Post, aber vielleicht ist es noch von Interesse

Zum einen will ich erwähnen dass es im ANSI C keinen String als Datentyp gibt, da ist die Verwendung eines Char Array vollkommen richtig.

Was oft bei der Eingabe von Zahlen mit Nachkommastellen ein Problem ist, ist dass ein "," als Dezimaltrennzeichen verwendet wird statt ".". Um Mit einem Komma zu arbeiten sind ein paar kleine Umwege erforderlich.

Bei den Aufeinanderfolgenden If Abfragen lohnt es sich ein wenig mit verschachtelten IF-Anweisungen ala

IF bla
ELSE IF blabla
ELSE IF usw.

So kannst du besser vermeiden ungewollt in den Else Zweig zu kommen. Die Abfragen lassen sich meiner meinung dann auch relativ leicht gestalten und notfalls wieder umbauen.

Neben der Aneignung einer Programmiersprache ist es Hilfreich sich mit Strugkogrammen zu beschäftigen (Nassi-Shneiderman-Diagramm ist relativ einfach aber übersichtlich). Sie dienen der Abbildung prozeduraler Programmabläufe auf graphischer Ebene, und erleichtern oftmals die Entwicklung von Algorithmen.
  Mit Zitat antworten
Alt 03.11.2010, 16:16   # 9
Richi
Threadstarter
 
Benutzerbild von Richi
 
Registriert seit: 13.12.2008
Ort: Rosenheim
Beiträge: 213
Kommt zwar ein bisschen spät aber danke für die Infos

Für alle Neueinsteiger in bestimmte Programmiersprachen gibts unten einen kleinen Anhang in dem ein recht gutes Beispiel für eine 3fache for-schleife geschrieben steht.. Bei diesem Programm können 3 Variablen eingelesen (x,y,z) werden, die jeweils einen Anfangswert und einen Endwert erhalten. Dazu wird dann noch für alle 3 Variablen eine globale Schrittweite angegeben mit der angegeben werden kann mit welchem Abstand die Variablen innerhalb des Anfang und Endwertes berechnet werden sollen. Nach der Eingabe werden in diesem Beispiel sämtliche Multiplikationen der 3 Variablen ausgegeben.

Das Wichtige ist dass man anhand des Ausdrucks eben sehr gut erkennen in welcher Reihenfolge eine Schleife mit verschachtelten Schleifen abgearbeitet wird - ganz einfach eigentlich obwohls am Anfang verwirrend erscheint ^^
Angehängte Grafiken
Dateityp: jpg 3xforschleife.jpg (97,1 KB, 8x aufgerufen)
  Mit Zitat antworten

Alt 21.04.2014, 09:39 # --
News Flash
 
Benutzerbild von News Flash
 
 
 
   
Alt 21.04.2014, 09:39 # --
netzwelt.de
 
Benutzerbild von netzwelt.de
 
 
 
   
Antwort
Themen-Optionen



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.