mein programm verbessern.
-
hallo,
ich hab vor drei wochen mit einem c-ansi-kurs angefangen. freitag habe ich eine aufgabe bekommen, die ich auch gelöst hab, aber meine lösung gefällt mir nicht ganz. ich denke, dass es sicher eine geschicktere lösung dafür gäbe.
die aufgabe:
3 leute wohnen zusammen. da wird immer abgewechselt, wer den einkauf übernimmt. das ausgegebene geld wird notiert. am ende des monats wird geguckt, wer wieviel ausgegeben hat. im programm werden die namen und die bezahlten summen eingegeben und der programm listet sortiert, wer wieviel noch bezahlen muss bzw. wieviel zurück bekommt.wir haben neulich das thema "pointers" und "string" gehabt. kann man mit hilfe strings das geschickter programieren?
vielen dank im voraus,
pouyamein programm:
#include <stdio.h> #include <stdlib.h> #include <string.h> void uit(float t,char s[10]){ if (t < 0){ t=-t; printf("%s betaalt %.2f\n",s,t); }else{ printf("%s ontvangt %.2f\n",s,t); } } int main(int argc, char *argv[]) { char a[10],b[10],c[10]; float x,y,z,m; scanf("%s", a); scanf("%f", &x); scanf("%s", b); scanf("%f", &y); scanf("%s", c); scanf("%f", &z); m=(x+y+z)/3; x=x-m; y=y-m; z=z-m; if (x>y && y>z){ uit(z,c); uit(y,b); uit(x,a); }else{ if (x>y && y<=z && x>z){ uit(y,b); uit(z,c); uit(x,a); }else{ if (x<y && y>z && x>=z){ uit(z,c); uit(x,a); uit(y,b); }else{ if (x<y && y>z && x<z){ uit(x,a); uit(z,c); uit(y,b); }else{ if (x>y && y<z && x<z){ uit(y,b); uit(x,a); uit(z,c); }else{ uit(x,a); uit(y,b); uit(z,c); } } } } } return 0;
-
Wie du deinen Quelltext formatierst - das bereitet mir Probleme beim lesen - ich
würde das anders machen.Hast du schon mal versucht die Daten von mehr als einer Person in dein Programm einzugeben?
Vielleicht auch vor der Eingabe schreiben was der Nutzer eingeben soll?Das ist keine ausführliche Analyse deines Quelltextes von dem du schreibst das er die Aufgabebedingungen erfüllt - erfüllt er die wirklich?
-
Ach ja hatte ich vergessen, ich gehe davon aus, das öfter als 3 mal im Monat eingekauft wird oder?
-
ok, anscheinend hab ich es echt nicht gut erklärt.
1. es ist nicht wichtig, wie oft eingekauft wird. jeder rechnet seine ausgabe zusammen und sagt, wie viel er am ende des monats bezahlt hat. das wird dann im programm eingegeben.
ein bespiel:
input:
pouya 87.65
frank 67.96
lisa 73.5output:
frank betaalt 8.41 (betaalt == bazahlt)
lisa betaalt 2.87
pouya ontvangt 11.28 (ontvangt == bekommt)die rechnung an sich ist ja sehr simpel. ich hatte bloß probleme mit sortieren von strings. das muss nämlich genau wie da oben sortiert sein.
danke nochmal!
-
also mein erster verbesserungsvorschlag wäre, dass du schleifen verwendest, in etwa so:
#define NUM 3 #define BUFSIZE 20 int main() { char name[NUM][BUFSIZE]; float spent[NUM]; int i; for(i=0; i<NUM; ++i) { //Abfrage hier } }
als nächstes würde ich dem benutzer mitteilen, was er denn gerade eingibt (wie bereits erwähnt). zur eingabe selbst: vor allem für strings würde ich scanf nicht benutzen, stattdessen:
fgets(&name[i], BUFSIZE, stdin); //o.ä.
-
@kommer€z:
das mit der schleife hab ich verstanden. aber warum sollte ich kein scanf benutzen? wie gesagt, ich bin anfänger und kenne den befehl fgets nicht. was ist der vorteil davon?
das ist mir auch klar, dass es unübersichtlich ist, wenn keine abfrag da steht, jedoch die korrektheit unserer programme wird von einem system kontrolliert und von daher ist ein sehr strenges layout notwendig. und in dieser aufgabe sollte keine anfrage itegriert sein.mein größtes problemm ist immer noch das sortieren von den strings. ich kann ja die ints oder floats ganz einfach sortieren:
if(x>y){ hilfe=x; x=y; y=hilfe; } if(y>z){ hilfe=y; y=z; z=hilfe; }
aber das klappt ja bei den chars nicht! ich hab es auch mit pointers versucht, aber da wurde allein die erste buchstabe immer vertauscht.
-
hallo,
ppouya schrieb:
wir haben neulich das thema "pointers" und "string" gehabt. kann man mit hilfe strings das geschickter programieren?
geschickter gehts mit strukturen und mit der funktion qsort.
für übungszwecke zum selber machen:
wenn du zeichenketten mit mehr als einem buchstaben vergleichen willst, dann nimm strcmp/strncmp, oder schreib diese funktionen selbst.gruß,
g.
-
jedoch die korrektheit unserer programme wird von einem system kontrolliert
Huh. So wie der seL4-Kernel?