Lupuz.de: Artikel-Portal / Magazin

Zurück   Postpla.net - die Forum Community > PC, Internet und Technik > Coder's Area

[C - GCC 3.4] Aufgabe >> Structs, Schleife, Eingabe/Ausgabe mit scanf/printf]

Anzeigen:

Thema geschlossen
 
Themen-Optionen Thema durchsuchen
outfreyn
Alt 25.01.2006, 18:44   #1
Böse [C - GCC 3.4] Aufgabe >> Structs, Schleife, Eingabe/Ausgabe mit scanf/printf]

grml grml grml ich versuche mich gerade in C einzufuchsen, frage mich wie ich C++ mal gepackt haben soll.

Erstellen Sie ein C-Programm, das eine Tabelle aus 18 Fußballvereinen
einlesen kann. Ein Verein wird durch die Daten

Vereinsname (max. 256 Zeichen),
Punkte
geschossene Tore
erhaltene Tore

beschrieben.

Die eingelesenen Daten sollen als formatiert Ausgegeben werden.
Hinweis: Erstellen Sie einen Verbunddatentyp für die Vereinsdaten. Die Tabelle kann dann als Feld von Vereinsdaten dargestellt werden.
Das Einlesen eines Strings mit der Deklaration

char str[256]; // Deklaration
erfolgt durch
scanf("%s",str); // Platzhalter %s Beachte KEIN & vor der Variable
Als erstes: Beschränken auf 2 Vereine, 18 kann ich ja eingeben wenn der Rest stimmt, nur komm ich soweit erst gar nicht. Nagut, ich stell mir 1) ein Struct vor:

Code:
   struct {
     char vname;
     int punkte;
     int gesTore;
     int erhTore;
   } tabelle[2];
2) mach ich 'ne Schleife die 2 mal je nach Vereinsname, Punkten und Toren fragt.

Ich scheitere am Zugriff auf das Struct, bzw. wenn ich

Code:
 tabelle[i].vname;
und irgendwo i++ sagen will, macht er's nicht.
Ebensowenig klappt das schreiben ins Struct, wenn ich mit scanf("%s",str); einlese klappt ne einfache Zuweisung im Sinne von strcpy(tabelle[i].vname,str); nicht.

Code:
int test;
printf("\n\nleck mich fett\n");
scanf(test);
printf(test);
Funzt auch nicht, vermutlich hab ich was am Kopf

Gut, ich habe heute erst angefangen, war ziemlich fertig, will mir aber trotzdem nicht in den Schädel woran's hängt. Werd jetzt ne Runde

Thanks in advance.


BTW: Lustiger wird es mit der Nächsten:

Erstellen Sie ein C-Programm, das eine Tabelle aus 18 Fußballvereinen sortiert. Hierzu sollen die Datenstrukturen und die Prozeduren zum Ein- und
Ausgeben der Tabelle aus der vorherigen Aufgabe verwendet werden.
Ein Verein V1 soll vor einem Verein V2 in der Tabelle stehen falls

1. V1 mehr Punkte als V2 hat.
2. Bei gleicher Punktzahl, falls V1 eine größere Tordifferenz als V2 hat.
Die Tordifferenz ist die Differenz aus geschossenen minus erhaltenen Toren.
3. Bei gleicher Tordifferenz, falls V1 mehr geschossene Tore als V2 hat.
4. Sind alle vorherigen Werte gleich so steht der alphabetisch kleinere vorn.
(Identische Einträge sollen ausgeschlossen sein)

Hinweis: die Funktion int strcmp(const char* s1, const char* s2) liefert

-1 falls s1 alphabetisch vor s2 kommt
0 bei Gleichheit
+1 falls s1 alphabetisch nach s2 kommt

Header-Datei <string.h>
Und die danach >> das ganze in Dateien schreiben/von Dateien lesen. Wobei ich SOWAS noch hinkriege, nur keine verdammten Structs.
 
 
Nach oben
Registrierter PPler
Anonymisierungsmodus aktiv!
Alt 25.01.2006, 19:21   #2
Standard

randbemerkung: wo hast du die aufgaben her? das wär was, was mich wirklich mal motivieren könnte meine bildung in dem bereich aufzufrischen.
 
 
Nach oben
Sidolin
Alt 25.01.2006, 20:04   #3
Standard

Poste doch bitte mal den gesamten code, dann ists deutlich einfach da irgendwelche Fehler zu finden...
 
 
Nach oben
outfreyn
Alt 25.01.2006, 20:35   #4
Standard

Das ist ein einziger Fehler. Es gibt noch keinen Code. Ich kann versuchen dir ein PAP oder nen Struktogramm zu basteln, aber davon abgesehen gibt's nix.

Den hab ich im Netz von irgendner Uni gefunden Spark :>

edit: Würde mir vielleicht schon reichen wenn mir jemand mit einem Struct (Zugriff) helfen könnte

Geändert von outfreyn (25.01.2006 um 21:10 Uhr).
 
 
Nach oben
xgenesis2000
Alt 25.01.2006, 22:13   #5
Standard

- für vname solltest du ein char feld nehmen, also char vname[255] <-- das sind dann schon 256 zeichen, denn es geht ja bei 0 los (das gilt immer, also hast du bei tabelle[2] auch schon 3 elemente...)

- weiß nicht was du mit dem fehler bei i++ meinst, aber vielleicht hast du nicht daran gedacht, dass i++ erst i auswertet und anschließend i erhöht. vielleicht hilft ++i

- was bei deinem struct los is seh ich jetzt nicht. poste mal deine schleife wo die probleme auftreten
 
 
Nach oben
outfreyn
Alt 25.01.2006, 22:43   #6
Standard

Verdammt, das man bei 0 anfängt wusste ich, das hat der Prof verhauen Oo

Naja so anderthalb Stunde Schlaf bringt was.

Meine Schleife kam nicht weiter als bis dahin:

Code:
#include <iostream>
using namespace std;

   struct a {
     char vname;
     int punkte;
     int gesTore;
     int erhTore;
   } ;


int main() {
  int i;
  char vname[255];
  struct a vereintab;
  
  for (i = 1; i < 5 ; i++) {
  
  printf("Vereinsnamen eingeben!\n\n");
  vereintab.vname =  scanf("%s",vereintab.vname);
  
  printf("Punkte eingeben!\n\n");
  vereintab.punkte = scanf("%s",&vereintab.punkte);
  
  printf("Erschossene Tore eingeben!\n\n");
  vereintab.vname =  scanf("%s",&vereintab.gesTore);
  
  printf("Erhaltene Tore eingeben!\n\n");  
  vereintab.vname =  scanf("%s",&vereintab.erhTore);
  }
}

Ähm, wobei ich nicht mehr weiss was ich da überhaupt mache. Grmpf.

edit: die For-Schleife kommt mit mehreren Anweisungen nicht klar und geht nur bis zum ersten scanf? ffs Oo

Geändert von outfreyn (25.01.2006 um 22:50 Uhr).
 
 
Nach oben
Leviathan
Alt 25.01.2006, 23:42   #7
Standard

kleines beispiel;

Code:
#include <string.h>
#include <stdio.h>
#include <conio.h>
struct vereine{
char *name;
int punkte;
int tore;
};
void main()
{
 struct vereine blvereine[18];
 int i;
 char c='j';
 clrscr();
 for(i=0; c!='n';i++)
 {
  printf("Name des Vereins\n");
  gets(blvereine[i].name);
  printf("\nPunkte: ");
  scanf("%i",&blvereine[i].punkte);
  //usw
  printf("Weiter ? j/n");
  c=getch();
 }
 
}
 



hmmm... also an deiner Stelle würd ich mir dein code nochma ganz genau anschauen =). und ansonsten ganz ruhig da ran gehen. überlegen und dann coden.. einfach was dahin klatschen bringt meisst nichts.
gl =)
 
 
Nach oben
xgenesis2000
Alt 25.01.2006, 23:48   #8
Standard

schau dir mal an was scanf genau macht (auch die benötigten platzhalter)

die schleife ist ja auch ziemlich sinnlos, da du vereintab ja kein feld ist (du benutzt i ja auch innerhalb der schleife nicht).

beachte, dass keinerlei abfang von fehleingaben realisiert ist!
weiter mit den problemen gehts, dass du keine leerzeichen beim vereinsnamen eingeben kannst. wie gesagt, schau die mal dokumentation zu scanf() an!


Code:
 
//#include "iostream.h"
//using namespace std;

   struct a {
     char vname[255];
     int punkte;
     int gesTore;
     int erhTore;
   } ;


int main() {
  int i;
  //char vname[255];
  struct a vereintab[5];
  
  for (i = 0; i <= 4 ; i++) {
  
  printf("%d. Vereinsnamen eingeben!\n\n",(i+1));
  scanf("%s",vereintab[i].vname);
   
  printf("Punkte eingeben!\n\n");
  scanf("%d",&vereintab[i].punkte);
  
  printf("Erschossene Tore eingeben!\n\n");
  scanf("%d",&vereintab[i].gesTore);
  
  printf("Erhaltene Tore eingeben!\n\n");  
  scanf("%d",&vereintab[i].erhTore);
  }

return 0;}

Geändert von xgenesis2000 (26.01.2006 um 00:02 Uhr).
 
 
Nach oben
outfreyn
Alt 26.01.2006, 21:56   #9
Standard

Erstmal fetten Dank an euch für eure Mühe

Ich kann nur sagen das man nach 6 Jahren kein C/C++, innerhalb der letzten beiden Jahre Visual Basic (bah) und eine unsystematische Herangehensweise gepaart mit dem Zwang es an einem Tag fertigzukriegen zu obigem Ergebnis führen *g*

Okay, wie dem auch sei, FYI die Muster-Lösung der zweiten Aufgabe:

Code:
// bl_tabelle.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

const int n = 100;
int zaehler=0;

//optische gestaltung der tabelle
#define maxelem 18
#define formstr "%3i. \263 %20s \263 %4i \263 %4i \263 %4i \263 %4i\n"

char tabelle_oben_1[n] = "Platz\t\t     Verein   Tore  GGTore  Diff   Punkte\n";
char tabelle_oben_2[n] = "\304\304\304\304\304\302\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304";
char tabelle_oben_3[n] = "\304\304\304\304\302\304\304\304\304\304\304\302\304\304\304\304\304\304\302\304\304\304\304\304";
char tabelle_oben_4[n] = "\304\302\304\304\304\304\304\304\304\n";
char tabelle_unten_1[n]= "\304\304\304\304\304\301\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304\304";
char tabelle_unten_2[n]= "\304\304\304\304\301\304\304\304\304\304\304\301\304\304\304\304\304\304\301\304\304\304\304\304";
char tabelle_unten_3[n]= "\304\301\304\304\304\304\304\304\304\n";
char tabelle_unten_4[n]= "\t\t\270\ \122\145\156\202 \123\143\150\162\145\151\142\145\162, \106\141\142\151\141\156 \123\164\145\143\150\145\162\n\n";

//zuweisen des tabellenzubehoers
struct tabelle {
     char Verein[n];
     int Tore;
     int GGTore;
     int Differenz;
     int Punkte;
};

//fuellen der tabelle
struct tabelle kartei[maxelem]= { 
      {"Bayern",35,12,27,44},
      {"Schalke_04",20,12,8,31},
      {"Kaiserslautern",23,44,-21,12},
      {"Borussia_Dortmund",23,24,-1,21},
      {"Duisburg",15,31,-16,12},
      {"1.FC_Nuernberg",18,30,-12,14}, 
      {"Wolfsburg",17,29,-12,18} ,
      {"Bielefeld",21,25,-4,20} ,
      {"Hannover_96",26,23,3,21} ,
      {"VfB_Stuttgart",21,17,4,25},
      {"Hertha_BSC",27,24,3,26} ,
      {"Bremen",46,21,25,36} ,
      {"Hamburger_SV",28,9,19,38},
      {"M'gladbach",24,21,3,25} ,
      {"Eintracht_Frankfurt",24,27,-3,21} ,
      {"Leverkusen",24,26,-2,19} ,
      {"Mainz",24,26,-2,16} ,
      {"1.FC_Koeln",24,39,-15,12}
      };

//ausgeben der tabelle
void ausgabe (struct tabelle* ausgabe){
    printf("\n\n");
    printf("%s%s%s%s",tabelle_oben_1,tabelle_oben_2,tabelle_oben_3,tabelle_oben_4);
    for (zaehler = 0; zaehler < maxelem; zaehler++)
      printf(formstr, zaehler+1, ausgabe[zaehler].Verein, ausgabe[zaehler].Tore, ausgabe[zaehler].GGTore,
                         ausgabe[zaehler].Differenz, ausgabe[zaehler].Punkte);
    printf("%s%s%s%s",tabelle_unten_1,tabelle_unten_2,tabelle_unten_3,tabelle_unten_4);
}

//prozedur des qsort befehls
int punktevergleich(const void *a, const void *b){
      struct tabelle *aa, *bb;
      aa = (struct tabelle *)a;
      bb = (struct tabelle *)b;
      return bb->Punkte - aa->Punkte;
   }  

//sortieren nach punkten
void punktesort(){
    printf("Tabelle wurde sortiert nach Punkten:\n");
    qsort(kartei, maxelem, sizeof(struct tabelle), punktevergleich);
    }

//sortieren nach tordiferenz
void differenzsort(){
    struct tabelle dummy[18];
    printf("Tabelle wurde sortiert nach Tordifferenz:\n");
    for (zaehler=0;zaehler<maxelem;zaehler++) {
        for (int zaehler2=zaehler; zaehler2<maxelem;zaehler2++) {
            if ((kartei[zaehler].Punkte == kartei[zaehler2].Punkte)&&(kartei[zaehler].Differenz<kartei[zaehler2].Differenz)) {
                dummy[zaehler] = kartei[zaehler2];
                kartei[zaehler2] = kartei[zaehler];
                kartei[zaehler] = dummy[zaehler];
            }
        }
    }
}

//sortieren nach namen
void namensort(){
    struct tabelle dummy[18];
    printf("Tabelle wurde sortiert nach Namen:\n");
    for (zaehler=0;zaehler<maxelem;zaehler++) {
        for (int zaehler2=zaehler; zaehler2<maxelem;zaehler2++) {
            if ((kartei[zaehler].Punkte == kartei[zaehler2].Punkte)&&
                (kartei[zaehler].Differenz == kartei[zaehler2].Differenz)){
                    if (kartei[zaehler].Verein > kartei[zaehler2].Verein) {
                        dummy[zaehler] = kartei[zaehler2];
                        kartei[zaehler2] = kartei[zaehler];
                        kartei[zaehler] = dummy[zaehler];
                        
                    }
            }
        }
    }
}

//hauptprogramm
int main(int argc, char* argv[]) {
    printf("Tabelle wurde so eingegeben: \n");
    ausgabe(kartei);
    punktesort();
    //ausgabe (kartei);
    differenzsort();
    //ausgabe (kartei);
    namensort();
    ausgabe (kartei);
    system ("PAUSE");
  }
Wenn ich die Zeit habe werde ich mich wohl langfristig damit auseinandersetzen müssen. Mühsam nährt sich das Eichhörnchen =)
 
 
Nach oben
xgenesis2000
Alt 26.01.2006, 23:10   #10
Standard

du sagst ja, dass du vorher schon 2 jahre VB erfahrung hast, das ist ja schonmal die halbe miete, da du dich mit programmstrukturen (schleifen, variablen, prozeduren, ...) auskennst.
das einzige wirkliche problem beim umstieg auf C von einer anderen (höher abstrahierenden) sprache ist, dass man nicht gewohnt ist, sich soviel gedanken über speicherverwaltung und systemnahe programmierung macht, weil dir das bei vb, java & co. abgenommen wird.
ein weitere stolperstein ist die c-syntax, da nicht gerade selbsterklärnd.
beispiel: "++i" ist nicht gleich "i++"
 
 
Nach oben
outfreyn
Alt 27.01.2006, 00:55   #11
Standard

Das weiss ich doch

Ich hab 'ne IT-Ausbildung genossen und damals anfänglich mit TP und weiterführend mit C++ rumgespielt. Bin allerdings doch schon schockiert was ich an Wissen verloren hab.

Die zwei Jahre VB, das war eher Software Engineering auf Niveau eines Techniker-Studiums, der Hansel meinte stets "Sie lernen hier keine Programmiersprache, sondern programmieren!" Nun gut.

Vom Sinn her hatte ich auch schon sowas wie einen PAP im Kopf, lediglich die Umsetzung ist fehlgeschlagen. Und, ich hätte mir mehr Zeit nehmen sollen

Die Aufgaben gehören zum Studium eines Mitbewohners, ich wollte ihm helfen und wie schon gesagt meine Kenntnisse auffrischen. Knackpunkt war das es zu Heute hätte fertig sein müssen >> daher keine Zeit für eine systematische Herangehensweise.

Kläglich versagt :-/
 
 
Nach oben
Anardil
Alt 28.01.2006, 12:27   #12
Standard

Verdammte Tat. Hätte ich auch mal wieder lernen sollen. Irgendwie sieht mir das alles viel zu fremd aus *grummel*
 
 
Nach oben
Anzeigen:
Thema geschlossen

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche



Alle Zeitangaben in WEZ +2. Es ist jetzt 04:44 Uhr.


Lupuz.de - wir können auch anders!
©1998 - 2008, Lupuz:Information-Network
Powered by vBulletin Version 3.7.1 (Deutsch), Jelsoft Enterprises Ltd.
Grüne Links?

SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.