[C] Katalog biblioteczny - lista jednokierunkowa

agusiaz
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 3 sty 2012, o 21:01
Płeć: Kobieta
Lokalizacja: Warszawa
Podziękował: 1 raz

[C] Katalog biblioteczny - lista jednokierunkowa

Post autor: agusiaz »

Piszę z prośbą o pomoc. Mam do zrobienia projekt C na zaliczenie na koniec semestru, a ja niestety nigdy dobra nie byłam z progamowania ;( ;( Tak po prawdzie to ze mnie kompletna noga i niewiele poza "hello worldem" potrafię napisać a tutaj nauczyciel zadał mi taki program, że nawet nie wiem z której strony się za to zabrać... Muszę zrobić program katalog biblioteczny z nieograniczoną ilością książek, sortowaniem, ich edycją, dodawaniem, zapisem do pliku i koniecznie ma to być na liście jednokierunkowej... Bardzo proszę o pomoc, bo nie wiem, jak w ogólę zaliczę ten przedmiot ;( Nie proszę o gotowe rozwiązanie (chociaż nie ukrywam, że najwięcej by mi to pomogło), ale jeśli można, to bardzo bardzo proszę kogoś obeznanego w C o wyjaśnienie mi, ale tak najprościej i najbardziej przystępnie jak się tylko da jak dokładnie miałabym to zrobić i o co w ogóle w tym wszystkim chodzi

Jeszcze raz bardzo Wszystkich proszę o pomoc...
mikkuexc
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 19 maja 2011, o 20:33
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 5 razy

[C] Katalog biblioteczny - lista jednokierunkowa

Post autor: mikkuexc »

Witaj.
Może przyda Ci się mój bardzo stary programik napisany w C.

Kod: Zaznacz cały

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct ksiazka
{
       char imie[15];
       char nazwisko[15];
       int telefon;
       };
struct ksiazka osoba[51],tmp;// deklaracja zmiennej w strukturze
int n=0; // liczba osob
void dodaj(void)
{
     char numer[15];
     if(n==49) printf("Ksiazka przepelniona!");
     else {
     printf("Zostalo jeszcze %d miejsca w bazie\n",(50-n));
     puts("Podaj nazwisko");
     scanf("%s",osoba[n].nazwisko);
     puts("Podaj imie");
     scanf("%s",osoba[n].imie);
     puts("Podaj numer telefonu");
     scanf("%s",&numer);
     osoba[n].telefon=atoi(numer);}
     n++;
     }
void lista(void)
{
     if(n<1) printf("Lista jest pusta!");
     else
     {
         for(int i=0;i<n;i++)
         {
                 printf("%s %s %d",osoba[i].nazwisko,osoba[i].imie,osoba[i].telefon);
                 printf("\n");
                 }
     }
}
void sortuj(void)
{
     for(int i=0;i<n;i++)
     {
             if(strcmp(osoba[i].imie,osoba[i+1].imie)>0)
             {
                  osoba[i]=tmp;
                  osoba[i]=osoba[i+1];
                  osoba[i+1]=osoba[i];
                  }
                  }
}
int main()
{
   
    int a;
    while(a!=0)
    {
               char ch;
               printf("Jaka operacje mam wykonac?\n");
               printf(" d - dodaj \n p - pokaz aktualna liste \n s - sortuj \n z - zakoncz \n");
               scanf("%c",&ch);
               switch (ch)
               {
                      case 'd': dodaj();
                              break;
                      case 'p': lista();
                              break;
                      case 's': // sortuj
                              break;
                      case 'z': a=0;
                                break;
                      }
    } 
    getch();
    return 0;
}
agusiaz
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 3 sty 2012, o 21:01
Płeć: Kobieta
Lokalizacja: Warszawa
Podziękował: 1 raz

[C] Katalog biblioteczny - lista jednokierunkowa

Post autor: agusiaz »

Próbowałam, próbowałam... i żaden sposób nie chodzi... Działa mi tylko dodawanie do listy i wyświetlanie... Nic więcej nie potrafię, mimo, że czytałam już najróżniejsze strony i fora ;(

Wklejam kod, może ktoś coś mi pomoże? Każda pomoc się przyda - termin jest strasznie krótki, a ja już nie mam pomysłów :( W kodzie w komentarzach są niektóre rzeczy, które próbowałam zrobić, ale nie chodzą/nie umiem zrobić żeby chodziły... Proszę o pomoc, bo już nie mam pojęcia co robię źle...

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
 
 
typedef struct lista{

	int *obecny;
    char *tytul;
    char *nazwisko_autora;
    char *imie_autora;
    char *oddzial_biblioteki;
    int nr_katalogowy;
    struct lista *nastepny;

} element;

element *glowa = NULL;

element *dodaj(element **wsk, char *tytul, char *nazwisko_autora, char *imie_autora, char *oddzial_biblioteki, int nr_katalogowy){
	
	element *nowy;		 //
	nowy = malloc(sizeof(element));
	nowy->nastepny = *wsk;
	nowy->obecny = (int*)nowy;
	

	nowy->tytul = tytul;
	nowy->nazwisko_autora = nazwisko_autora;
	nowy->imie_autora = imie_autora;
	nowy->oddzial_biblioteki = oddzial_biblioteki;
	nowy->nr_katalogowy = nr_katalogowy;

	*wsk = nowy;
	return *wsk;

}

element wypisz_liste(element *glowa){
	printf("\n-----------------------------------------------------------------------------------\n");
	printf("%-30s %-30s %-30s %-30s %-30s\n","Tytul","Nazwisko autora","Imie autora", "Oddzial biblioteki", "Numer katalogowy");
	printf("-----------------------------------------------------------------------\n");
	while( glowa != NULL )     
	{
		printf("%-30s %-30s %-30s %-30s %-30d\n", 
				glowa->tytul,
				glowa->nazwisko_autora, 
				glowa->imie_autora, 
				glowa->oddzial_biblioteki, 
				glowa->nr_katalogowy);
		glowa = glowa->nastepny;
	}
	
}


/*element usun(element **wsk, char *tytul, char *nazwisko_autora)
 {
   element *wskaznik=*wsk;
   while (wskaznik->nastepny != NULL)
     {
     if (wskaznik->nastepny->tytul == tytul && wskaznik->nastepny->nazwisko_autora == nazwisko_autora)	// bierzemy wskaźnik do elementu poprzedzającego
       {
       element *usuwany=wskaznik->nastepny;	// zapamiętujemy usuwany element
       wskaznik->nastepny = usuwany->nastepny;	// przestawiamy wskaźnik next by omijał usuwany element
       free(usuwany);				// usuwamy z pamięci
       } else
         {
         wskaznik = wskaznik->nastepny;		// idziemy dalej tylko wtedy kiedy nie usuwaliśmy
         }					// bo nie chcemy zostawić duplikatów
       }
 }
 */


element usun(element **wsk, char *tytul, char *nazwisko_autora)
 {
  element *p, *p2;
  if(*wsk != NULL){ 
    if((*wsk)->tytul == tytul && (*wsk)->nazwisko_autora == nazwisko_autora){ 
      p = (*wsk)->nastepny;      
      free(*wsk); 
      *wsk = p; }
      
      else{ 
      p2 = *wsk; 
        p = p2->nastepny;      
       while (p != NULL){ 
          if(p->tytul == tytul && p->nazwisko_autora == nazwisko_autora){ 
          p2->nastepny = p->nastepny;            
          free(p); 
        
          break; 
        } 
          p2 = p; 
        p = p->nastepny; 
        
      } 
    } 
  } 
      
   } 


sortuj(element *glowa, char* nazwisko_autora)
{
    element *t;
    while(glowa)
    {
        t = glowa->nastepny;
        while(t)
        {
            if(t->nazwisko_autora < glowa->nazwisko_autora)
            {
                nazwisko_autora = glowa->nazwisko_autora;
                glowa->nazwisko_autora = t->nazwisko_autora;
                t->nazwisko_autora = nazwisko_autora;
            }
            t = t->nastepny;
        }
        glowa = glowa->nastepny;
    }
}

//void Import(char *filename);
//void zapis();
//char odczyt();
/*
void zapis(element *glowa)
{
         FILE *strumien;
         strumien=fopen("plik.txt","r"); 
         element *obecny=glowa;
         while(obecny!=NULL)
         {
         fwrite(obecny->tytul,sizeof(char),strlen(obecny->tytul),strumien);
         fwrite(obecny->nazwisko_autora,sizeof(char),strlen(obecny->nazwisko_autora),strumien);         
         fwrite(obecny->imie_autora,sizeof(char),strlen(obecny->imie_autora),strumien);         
         fwrite(obecny->oddzial_biblioteki,sizeof(char),strlen(obecny->oddzial_biblioteki),strumien);
         fwrite(obecny->nr_katalogowy,sizeof(int),1, strumien);
         obecny = obecny->nastepny;
         }
         
         fclose(strumien);
}
*/
/*char odczyt(glowa, tytul, nazwisko_autora, imie_autora, oddzial_biblioteki, nr_katalogowy)
{
         char name[50];
         printf("Podaj nazwe pliku do zaimportowanie (wraz z rozszerzeniem): ");
         scanf("%s", name);
         
         Import(name, glowa, tytul, nazwisko_autora, imie_autora, oddzial_biblioteki, nr_katalogowy);
}



void Import(char *filename, glowa, tytul, nazwisko_autora, imie_autora, oddzial_biblioteki, nr_katalogowy)
{
        FILE *strumien;
        strumien=fopen(filename,"r");
        element *obecny=glowa;
         while(obecny!=NULL)
         {
         dodaj(&glowa, tytul, nazwisko_autora, imie_autora, oddzial_biblioteki, nr_katalogowy);
         fread(obecny->tytul,sizeof(char),strlen(obecny->tytul),strumien);
         fread(obecny->nazwisko_autora,sizeof(char),strlen(obecny->nazwisko_autora),strumien);         
         fread(obecny->imie_autora,sizeof(char),strlen(obecny->imie_autora),strumien);         
         fread(obecny->oddzial_biblioteki,sizeof(char),strlen(obecny->oddzial_biblioteki),strumien);
         fread(obecny->nr_katalogowy,sizeof(int),1, strumien);
         }
         
         fclose(strumien); 
}

*/
/*

void odczyt() {
   FILE *file;
   file = fopen("data.txt", "r");
   if(!file) {
      printf(" error - no such file ");
      exit(1);
      }
      else {
         while(feof(file) == 0) {
            element *pointer;
            pointer = (element *)malloc(sizeof(element));

            element *pointer2;
            pointer2 = (element *)malloc(sizeof(element));

            int nr_katalogowy;
            char *tytul, *nazwisko_autora, *imie_autora, *oddzial_biblioteki;
            tytul = (char *)malloc(20*sizeof(char));
            nazwisko_autora = (char *)malloc(25*sizeof(char));
	    imie_autora= (char *)malloc(15*sizeof(char));
	    oddzial_biblioteki = (char *)malloc(25*sizeof(char));

            element *nowy;
            nowy = (element* )malloc(sizeof(element));

            fscanf(file, "%s", tytul);
            fscanf(file, "%s", nazwisko_autora);
	    fscanf(file, "%s", imie_autora);
	    fscanf(file, "%s", oddzial_biblioteki);
            fscanf(file, "%d", &nr_katalogowy);

            if(feof(file) == 0) {
                nowy->tytul = tytul;
                nowy->nazwisko_autora = nazwisko_autora;
                nowy->imie_autora = imie_autora;
		nowy->oddzial_biblioteki = misato;
		nowy->nr_katalogowy = nr_katalogowy;
		

                pointer = tail;
                while((pointer->nastepny != NULL)  && (strcmp(pointer->nazwisko_autora, new->nazwisko_autora) < 0) ) {
                   pointer = pointer->nastepny;}

                pointer2=pointer->prev;
                pointer->prev = nastepny;
                nowy->nastepny = pointer;
                pointer2->nastepny = nowy;
                nowy->prev = pointer2;

            }
        }
    }
   fclose(file);
   printf("Done.");
}

void zapis() {
   FILE *file;
   file = fopen("data.txt", "w");
   if(!file) {
      printf(" error - no such file ");
      exit(1);
      }
      else {
         element *pointer;
         pointer = (element *)malloc(sizeof(record));
         pointer = tail->nastepny;

         int n =1;
         while(pointer->nastepny != NULL) {
           fprintf(file, "%s\n", pointer->tytul); 
	   fprintf(file, "%s\n", pointer->nazwisko_autora);
	   fprintf(file, "%s\n", pointer->imie_autora);
	   fprintf(file, "%s\n", pointer->oddzial_biblioteki);
	    fprintf(file, "%d\n", pointer->nr_katalogowy);
            pointer = pointer->nastepny;
            n++;
         }
     }
printf("Done.");
}

*/


int main(){
  
  
  
  char tytul[20];
  char nazwisko_autora[25];
  char imie_autora[15];
  char oddzial_biblioteki[25];
  int nr_katalogowy;
  int option=0;
  

      
       printf("\n[1] Dodaj nowy wpis\n[2] Wyswietl wszystkie wpisy\n[3] Wyszukaj nr_katalogowy\n[4] Szukaj autora\n[5] 
Sortuj\n[6] Zapis\n[7] Odczyt\n[8] Usun wpis\n[9] Edytuj wpis\n[0] Zakoncz program\nWybrales . . . "); 
        
        while( (option = getchar()) != EOF ){
		if(option == '1'){					// DODAWANIE WPISU
                        
			printf("\nProsze podac dane osoby:\n");
			printf("Tytul:");
			scanf("%s", tytul);
			printf("Nazwisko autora:");
			scanf("%s", nazwisko_autora);
			printf("Imie autora:");
			scanf("%s", imie_autora);
			printf("Oddzial biblioteki:");
			scanf("%s", oddzial_biblioteki);
			printf("Numer katalogowy:");
			scanf("%i", &nr_katalogowy);
			printf("\n\n");

			glowa = dodaj(&glowa, tytul, nazwisko_autora, imie_autora, oddzial_biblioteki, nr_katalogowy);
		    
			system("clear");
			main();
		}
          
		if(option == '2'){
               
			system("clear");
			wypisz_liste(glowa);
			main();
		}
		    
          /*     if(option == '3'){					// SZUKAJ nr katalogowy
	      
		    system("clear");
                    szukaj_nr_katalogowyu();}
		    
               if(option == '4'){					// SZUKAJ autora
		 
		    system("clear");
                    szukaj_autora();
                    }
		    
		if(option == '5'){					// SORTUJ
		
		    //system("clear");}
                    sortuj(glowa, nazwisko_autora);
		    
                   // wypisz_liste(glowa);
		    //main();
		}
		    
		if(option == '6'){					// ZAPISZ
		  
                    zapis(glowa);
		    
                    //system("clear");}
                    
		    
               if(option == '7'){					// ODCZYT
		 
                    odczyt (glowa, tytul, nazwisko_autora, imie_autora, oddzial_biblioteki, nr_katalogowy);
		    
                    //system("clear");}
	     */
	      
               if(option == '8'){					// USUŃ
		 
		    printf("Tytul:");
		    scanf("%s", tytul);
		    printf("Nazwisko autora:");
		    scanf("%s", nazwisko_autora);
		    usun(&glowa, tytul, nazwisko_autora);
                    //system("clear");
		    //main();
                    }
       }
  return 0;
}
Ostatnio zmieniony 15 sty 2012, o 16:25 przez Afish, łącznie zmieniany 1 raz.
Powód: Za dużo kresek w kodzie.
ODPOWIEDZ