Programm zur Playlist Verwaltung C

Neue Frage »

Auf diesen Beitrag antworten »
dghst Programm zur Playlist Verwaltung C

Hallöchen zusammen,

ich sitze an einem Programm, welches eine Playlist verwalten soll mit den funktionen Songs hinzu zufügen, zu löschen, zu shuffeln usw.

Es treten noch sehr viele Probleme auf und ich erwarte nicht, dass einer ankommt und mir das alles korregieren kann. Mich interessiert insbesondere das/die Problem(e) die beim kopieren der Strings in andere auftreten z.B. in Song einlesen (Song, *playlist, int laenge) da werden inkompatible typen angezeigt, wie kann ich das beheben? Des weiter ist ein Haupt Problem, dass beim Song einlesen dadurch die String nicht wieder an die Hauptfunktion zurück gegeben werden, was glaube ich auch an der falschen Struktur liegt.


Vielen Dank für eure Hilfe!
lG Paul

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>

enum{ STRLEN = 100 };
enum{ PLLEN = 100 };

/* Beginn Teilaufgabe a) */
typedef struct {
  char Interpret [100];
	char Titel [100];
	int Jahr [5];
	int Minuten [3];
	int Sekunden [3];
  
} Song;
/* Ende Teilaufgabe a) */


/* --- Vorgebene Funktionen, nicht aendern --- */

/* Diese Funktion gibt einen zufaelligen Index
   zwischen 0 und laenge-1 zurueck */
int zufallsIndex( int laenge ) {
  return (int) rand()%laenge;
}

int laden( Song *playlist ) {
  
  FILE* fin = NULL;
  int n = 0;
  
  if ( ( fin = fopen( "playlist.dat", "rb" ) ) != NULL ) {
    while ( fread( &(playlist[n]), sizeof(Song), 1, fin ) > 0 && n < PLLEN )
      n++;
    printf("\nDatensaetze geladen!\n\n");
    fclose( fin );
  } else {
    printf("\nDerzeit sind keine Datensaetze gespeichert!\n\n");
  }
  
  return n;
}

void speichern( Song *playlist, int laenge ) {
  
  FILE* fout = NULL;
  
  if ( ( fout = fopen( "playlist.dat", "wb" ) ) != NULL ) {
    fwrite( playlist, sizeof(Song), laenge, fout );
    printf("\nDatensaetze gespeichert!\n\n");
    fclose( fout );
  } else {
    printf("\nSpeichern fehlgeschlagen\n\n");
  }
}
/* --- Ende der vorgebenen Funktionen --- */


/* Beginn Teilaufgabe b) */

/* Diese Funktion liest alle Attribute eines Songs
   aus der Kommandozeile und gibt einen struct vom Typ Song zurück */
 Song einlesen( Song *playlist, int laenge ) {
	 Song einzulesender;
	 
	 printf( "Interpret: ");
	 scanf ("%s" , einzulesender.Interpret);
	 printf("Titel: ");
	 scanf ("%s" , einzulesender.Titel);
	 printf("Jahr: ");
	 scanf ("%d" , einzulesender.Jahr);
	 printf("Minuten: ");
	 scanf ("%d" , einzulesender.Minuten);
	 printf("Sekunden: ");
	 scanf ("%d" , einzulesender.Sekunden);
	 
	 for (int i=1; i<= laenge; i++)
	 {
	 
		strcpy ( playlist[i], einzulesender); 
	 }
	 
	 	
	 
	 laenge++;
  return einzulesender;
 // return laenge;
  
 }


/* Diese Funktion gibt alle Attribute eines Songs aus */
 void ausgeben( Song song, int i ,int laenge) {
	 for (i=1; i<= laenge; i++)
	 {
		 printf( "%d : %d - %d, %d, %d:%d " , i, song.Interpret[i] , song.Titel[i] ,  song.Jahr[i] , song.Minuten[i] , song.Sekunden[i]);
  
	 }
 }
/* Ende Teilaufgabe b) */


/* Beginn Teilaufgabe c) */
 int loeschen(Song *playlist, int pos , int laenge, *Song ) {
    pos = -1;
while(pos <<0||pos>>laenge)	
{
	printf ("Welcher Song soll gelöscht werden?");
	 scanf("%d" , &pos);
}
	 
	 for (int i=pos; i<=laenge; i++)
	 {	strcpy ( playlist.Song[i], playlist.Song[i+1]);
	 }
	return laenge--;
  
  
  }
/* Ende Teilaufgabe c) */


/* Beginn Teilaufgabe d) */
 void shuffle( Song *playlist, int laenge ) {
  
  for (int i=1; i<= laenge-1; i++)
  { 
	Song platzhalter;
	int teins=zufallsIndex, tzwei=zufallsIndex;
	strcpy (platzhalter, playlist[teins]);
	strcpy (playlist[teins], playlist[tzwei]);
	strcpy (playlist[tzwei], platzhalter);
  }


	  
  
  
 }
/* Ende Teilaufgabe d) */


/* Beginn Teilaufgabe e) */
int jahrSuchen( Song *playlist, int jahr[4], int laenge ) {
	int j,i;
	printf ("Nach Jahr suchen: ");
	scanf("%d" , jahr);
	
	for(i=0; i<=laenge; i++)
	{
		if ( strcmp (playlist.jahr[i], jahr, 3) ==1)
		{
			printf ("%s" , playlist[i]);
			j++;
		}
		else{}
	}
	printf ("Die Suche ergab %d treffer." , j);
  
  
}
/* Ende Teilaufgabe e) */


/* Beginn Teilaufgabe f) */
 int interpretSuchen( Song *playlist, char *interpret, int laenge ) {
	
	int interpret[];
	int j,i;
	printf ("Nach Interpret suchen: ");
	scanf("%d" , interpret);
	
	for(i=0; i<=laenge; i++)
	{
		if ( strcmp (playlist.interpret[i], interpret, PLLEN) ==1)
		{
			printf ("%s" , playlist[i]);
			j++;
		}
		else{}
	}
	printf ("Die Suche ergab %d treffer." , j);
  
  
 }
/* Ende Teilaufgabe f) */


int main( void ) {
  
  Song;
  Song playlist[PLLEN];
  int laenge = 0, fertig = 0, einlesen = 0, ausgeben,loeschen;
  char eingabe;
 // char *playlist;
  
  srand(time(NULL));
  
  while ( !fertig ) {
    printf("\nl: laden\n");
    printf("s: speichern\n");
    printf("e: einlesen\n");
    printf("d: loeschen\n");
    printf("a: ausgeben\n");
    printf("m: mischen\n");
    printf("j: jahr suchen\n");
    printf("i: interpret suchen\n");
    printf("b: beenden\n\n");
    printf("Eingabe: ");
    
    scanf(" %c", &eingabe );
    getchar();
        
    switch( eingabe ) {
      case 'l': laenge = laden( playlist ); break;
      case 's': speichern( playlist, laenge ); break;
	  case 'e': einlesen( laenge, playlist ); break;
	  case 'a': ausgeben (playlist); break;
	  case 'd': int loeschen(Song *playlist, int pos , int laenge, *Song ); break; 
	  case 'm': mischen ( ) ; break;
      case 'b': fertig = 1; break;
      default: printf("Funktion nicht verfuebar!\n\n");
    }
    
  }
  
  return 0;
}

 
Auf diesen Beitrag antworten »
InformaTiger RE: Programm zur Playlist Verwaltung C

Hallo Paul,

auf den ersten Blick fallen mir da mehrere Dinge auf. In deiner einlesen-Funktion hast du den
&-Operator bei scanf vergessen; sollte also vermutlich so aussehen:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
printf( "Interpret: ");
scanf ("%s" , &einzulesender.Interpret);
printf("Titel: ");
scanf ("%s" , &einzulesender.Titel);
printf("Jahr: ");
scanf ("%d" , &einzulesender.Jahr);
printf("Minuten: ");
scanf ("%d" , &einzulesender.Minuten);
printf("Sekunden: ");
scanf ("%d" , &einzulesender.Sekunden);

Außerdem kann ich nicht ganz nachvollziehen, was du genau mit dem strcpy machen möchtest. Falls dir dynamische Speicherverwaltung etwas sagt, solltest du meiner Meinung nach, deinen Song in der Funktion einlesen dynamisch erzeugen und einen Pointer auf den Song zurückgeben - dabei darfst du dann halt nicht vergessen ihn wieder freizugeben.

Und abschließend noch ein anderer Tipp: du kannst deinen Enumerator der PLLEN und STRLEN definiert durch eine Präprozessor-Direktive ersetzen. Sieht dann etwa wie folgt aus:

code:
1:
2:
#define PLLEN 100
#define STLEN 100


Mit freundlichen Grüßen
InformaTiger
Auf diesen Beitrag antworten »
dghst

Guten Abend, danke für eine Antwort zu solch später Stunde Augenzwinkern

da ich hier ja in einen string schreibe wurde mir beigebracht, das dort kein &(...) zu benutzen ist, funktioniert trotzdem beides Augenzwinkern

mit dem strcpy würde ich z.B. gerne wie in Zeile 137 den ersten Song der Playlist in den platzhalter string kopieren, jedoch wird da gesagt die hätten unterschiedliche Typen, dabei sind es doch beies strings mit der Song Struktur geschockt
Auf diesen Beitrag antworten »
InformaTiger

Das Problem hierbei ist, dass deine Playlist vom Typ "struct Song*" ist und du da mit strcpy versuchst einen String hin zu kopieren.

Wenn ich dich richtig verstehe, wäre dein Ziel den Song an die Playlist anzufügen smile
 
Auf diesen Beitrag antworten »
dghst

jap, das ist genau richtig!

wie kann ich denn eine ganze string struktur kopieren? also wie kann ich den gerade eingelesen Song an die Playlist weiter geben?
Auf diesen Beitrag antworten »
roflcopter123456789

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>

enum{ STRLEN = 100 };
enum{ PLLEN = 100 };


typedef struct {
  char Artist [100];
	char Titel [100];
	int Year ;
	int Minutes ;
	int Seconds ;
  
} Song;

int randomIndex( int length ) {
  return (int) rand()%length;
}

int laden( Song *playlist ) {
  
  FILE* fin = NULL;
  int n = 0;
  
  if ( ( fin = fopen( "playlist.dat", "rb" ) ) != NULL ) {
   while ( n < PLLEN && fread( &(playlist[n]), sizeof(Song), 1, fin ) > 0) 
      n++;
    printf("\nSuccess!\n\n");
    fclose( fin );
  } else {
    printf("\nNothing Artistd!\n\n");
  }
  
  return n;
}

void save( Song *playlist, int length ) {
  
  FILE* fout = NULL;
  
  if ( ( fout = fopen( "playlist.dat", "wb" ) ) != NULL ) {
    fwrite( playlist, sizeof(Song), length, fout );
    printf("\nSaved!\n\n");
    fclose( fout );
  } else {
    printf("\nError\n\n");
  }
}

 Song add( Song *playlist, int length ) {
	 Song new;
	 
	 printf( "Artist: ");
	 scanf ("%s" , new.Artist);
	 printf("Titel: ");
	 scanf ("%s" , new.Titel);
	 printf("Year: ");
	 scanf ("%d" , &new.Year);
	 printf("Minutes: ");
	 scanf ("%d" , &new.Minutes);
	 printf("Seconds: ");
	 scanf ("%d" , &new.Seconds);
	 
if(length < PLLEN)
{ 
    playlist[length] = new; 
    
}
	 
	 	
	 
	 /*length++; Do at main*/
  return new;
 
  
 }



void out1(Song *song, int length) 
{ 
    for (int i=0; i< length; i++) 
    { 
    printf( "%d : %s - %s, %d, %d:%d\n" , i, song[i].Artist, song[i].Titel, song[i].Year , song[i].Minutes , song[i].Seconds); 
        
    }
 }




 int delete(Song *playlist, int pos , int length) {
    pos = -1;
while(pos <0 || pos >= length)
{
	printf ("Chose song to delete");
	 scanf("%d" , &pos);
}
	 
for (int i=pos; i<length-1; i++)
{ 
    playlist[i] = playlist[i+1]; 
    
} 
return --length;
  
  
  }

 void shuffle( Song *playlist, int length ) {
  
  for (int i=1; i< length-1; i++)
  { 
	Song songcpy;
	int Index1 = randomIndex(length), Index2=randomIndex(length);
	songcpy = playlist[Index1];
	playlist[Index1] = playlist[Index2];
	playlist[Index2] = songcpy;
  }


	  
  
  
 }

int YearSearch( Song *playlist, int length )  {
	int j,i, Year;
	printf ("Search for Year: ");
	scanf("%d" , &Year);
	
	for(j=i=0; i<length; i++)
	{
		if ( playlist[i].Year == Year)
		{
			out1(&playlist[i]);
			j++;
		}
		else{}
	}
	printf ("You got %d results" , j);
  
  
}

 int ArtistSearch( Song *playlist, int length ) {
	
	char Artist [100];
	int j,i;
	printf ("Search for Artist: ");
	scanf("%99s" , Artist);
	
	for(j=i=0; i<length; i++)
	{
		if ( strcmp (playlist[i].Artist, Artist) ==0)
		{
			out1(&playlist[i]);
			j++;
		}
		else{}
	}
	printf ("You got %d results" , j);
  
  
 }



int main( void ) {
  
  
  Song playlist[PLLEN];
  int length = 0, ready = 0;
  char enter;
 
  
  srand(time(NULL));
  
  while ( !ready ) {
    printf("\nl: laden\n");
    printf("s: save\n");
    printf("e: add\n");
    printf("d: delete\n");
    printf("a: out\n");
    printf("m: shuffle\n");
    printf("j: Year Search\n");
    printf("i: Artist Search\n");
    printf("b: end\n\n");
    printf("enter: ");
    
    scanf(" %c", &enter );
    getchar();
        
    switch( enter ) {
      case 'l': length = laden( playlist ); break;
      case 's': save( playlist, length ); break;
	  case 'e': add( playlist , length ); ++length; break;
	  case 'a': out (playlist, length); break;
	  case 'd': {int pos; printf("delete no:"); scanf("%d%*c", &pos);length=delete(playlist, pos , length);} break;
	  case 'm': shuffle( playlist, length) ; break;
      case 'b': ready = 1; break;
      default: printf("Function doesn't exist\n\n");
    }
    
  }
  
  return 0;
}

Sind nur noch wenige Fehler vorhanden.
void out1 in zeile 84 macht noch probleme und wirkt sich dadurch auch auf Zeile 135/156 aus

 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »