szydlak Opublikowano 13 Stycznia 2006 Zgłoś Opublikowano 13 Stycznia 2006 (edytowane) pomożcie bo nie moge sobie poradzic z sortowaniem danych, maja byc 2 sortowania do wyboru, troszke zacząłem ale dalej nie potrafie, prosze tylko o 2 algorytmy #include <stdio.h> /* Standardowe funkcje wejscia/wyjscia */#include <string.h> /* Funkcje przetwarzania tekstu */#include <stdlib.h> /* Makrodefinicje EXIT_SUCCESS i EXIT_FAILURE, funkcja system */#include <ctype.h> #include <conio.h> #ifndef EXIT_SUCCESS#define EXIT_SUCCESS 0#endif#ifndef EXIT_FAILURE#define EXIT_FAILURE 1#endif#define MAX 30 /* Maksymalna liczba wpisow w bazie danych */#define INPUT 4 /* Maksymalna dlugosc wprowadzanego indeksu */#define FALSE 0#define TRUE 1 #define DOS typedef short int BOOL; typedef struct /* Definicja typu strukturalnego telefony */{ char Nazwisko[50]; char Imie[50]; // imie, char adres[50]; /* Miejscowosc */ char telefon[20]; /* Numer telefonu */} telefony;int wszystkie_wpisy(void);void /*inline*/ potwierdzenie(void);int dane_osoby(void); /* Prezentuje dany wpis */int szukaj_wpisu(void); /* Przeszukuje baze */int dodaj_wpis(void); /* Dodaje nowy wpis */int usun_wpis(void); /* Usuwa wpis */int zachowaj_baze(void); /* Zapisuje baze danych do pliku */int wczytaj_baze(void); /* Laduje baze z pliku do pamieci */void sortuj_baze(void); /* Sortuje baze wg pola personalia */void info(void); telefony baza[MAX]; /* Zmienna strukturalna baza */int numer = 0; /* Licznik wszystkich wpisow */void /*inline*/ potwierdzenie(void){#ifdef DOS printf("\n "); system("pause");#else printf("\n Nacisnij ENTER, aby kontynuowac..."); while (getchar() != '\n');#endif} int main(void){char wybor; do /* Petla do-while musi wykonac sie przynajmniej raz */ { /* Menu glowne programu */ clrscr(); printf("\n KSIAZKA TELEFONICZNA \n\n"); printf(" [1] Wyswietl wszystkie wpisy w bazie \n\n" " [2] Przedstaw informacje o osobie \n\n" " [3] Znajdz wpis w bazie danych \n\n" " [4] Dodaj wpis do bazy danych \n\n" " [5] Usun wpis z bazy \n\n" " [6] Zachowaj baze danych \n\n" " [7] Zaladuj baze danych \n\n" " [8] Sortowanie bazy danych \n\n" " [9] Informacje o programie \n\n" " [0] Wyjscie \n\n"); /* Pobierz dane od uzytkownika */ printf(" Twoj wybor: "); wybor = getchar(); fflush(stdin); /* Wyczysc bufor klawiatury */ clrscr(); /* Wywolanie funkcji w zaleznosci od wyboru uzytkownika */ switch (wybor) { case '1' : wszystkie_wpisy(); break; case '2' : dane_osoby(); break; case '3' : szukaj_wpisu(); break; case '4' : dodaj_wpis(); break; case '5' : usun_wpis(); break; case '6' : zachowaj_baze(); break; case '7' : wczytaj_baze(); break; case '8' : sortuj_baze(); break; case '9' : info(); break; case '0' : break; default : { printf("\n Nie ma takiej opcji! \n"); potwierdzenie(); } break; } } while (wybor != '0'); printf("\n ZAMYKANIE PROGRAMU \n"); potwierdzenie(); return EXIT_SUCCESS;} int wszystkie_wpisy(void){int i; /* Zmienna pomocnicza - indeks petli */ printf("\n WYKAZ WSZYSTKICH WPISOW \n"); if (numer == 0) /* Nie ma zadnego wpisu! */ { printf("\n Baza danych jest pusta" " lub nie zostala zaladowana z pliku! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Wyswietl wszystkie osoby wraz z numerami ich indeksow */ for (i = 0; i < numer; i++) { printf("\n %d %s ", i+1, baza[i].Nazwisko); printf(" %s ", baza[i].Imie); /* Zatrzymaj program po zapelnieniu ekranu */ if ((i + 1)%10 == 0) { potwierdzenie(); clrscr; } } printf("\n Koniec danych \n"); potwierdzenie(); return EXIT_SUCCESS;} int dane_osoby(void){char wpis[INPUT]; /* Tekst wpisany przez uzytkownika */int index; /* Wpis do prezentacji */ printf("\n PREZENTOWANIE DANYCH \n"); printf("\n Wprowadz indeks osoby: "); index = atoi(gets(wpis)); /* Konwersja typu danych */ if (index < 1 || index > numer) /* Nie ma takiego indeksu! */ { printf("\n Indeks nie jest poprawny! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Drukuj dane na ekranie */ printf("\n Nazwisko : %s", baza[index - 1].Nazwisko); printf("\n Imie: %s", baza[index - 1].Imie); printf("\n Miejscowosc: %s", baza[index - 1].adres); printf("\n Telefon: %s", baza[index - 1].telefon); potwierdzenie(); return EXIT_SUCCESS;} int szukaj_wpisu(void){char szukana[30]; /* Szukane nazwisko lub miejscowosc */int index, k = 0; /* Zmienne pomocnicze */ printf("\n WYSZUKIWANIE INFORMACJI W BAZIE \n"); printf("\n Wprowadz nazwisko lub miejscowosc do wyszukania: "); gets(szukana); clrscr(); for (index = 0; index < numer; index++) { /* Wyswietlanie informacji o wyszukanych wpisach */ if (strstr(baza[index].Nazwisko, szukana) || strstr(baza[index].adres, szukana)) { printf("\n Nazwisko i imie: %s", baza[index].Nazwisko); printf("\n Nazwisko i imie: %s", baza[index].Imie); printf("\n Miejscowosc: %s", baza[index].adres); printf("\n Telefon: %s", baza[index].telefon); printf("\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); k++; /* Zatrzymaj program po zapelnieniu ekranu */ if (k%3 == 0) { potwierdzenie(); clrscr(); } } } if (k == 0) /* Brak rezultatow! */ { printf("\n Nie znaleziono zadnego wpisu! \n"); potwierdzenie(); return EXIT_FAILURE; } printf("\n To wszystkie wpisy jakie znaleziono! \n"); potwierdzenie(); return EXIT_SUCCESS;}int dodaj_wpis(void){ printf("\n DODAWANIE WPISU DO BAZY DANYCH \n"); if (numer >= MAX) /* Baza danych jest pelna! */ { printf("\n Baza danych jest pelna! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Pobierz od uzytkownika wszystkie informacje o osobie */ /* Sprawdz czy wpisy nie sa za dlugie */ do { printf("\n Nazwisko: "); gets(baza[numer].Nazwisko); if (strlen(baza[numer].Nazwisko) > 48) printf("\n Mozna wpisac maksymalnie 48 znakow! \n"); } while (strlen(baza[numer].Nazwisko) > 48); do { printf("\n Imie: "); gets(baza[numer].Imie); if (strlen(baza[numer].Imie) > 48) printf("\n Mozna wpisac maksymalnie 48 znakow! \n"); } while (strlen(baza[numer].Imie) > 48); do { printf("\n Miejscowosc: "); gets(baza[numer].adres); if (strlen(baza[numer].adres) > 48) printf("\n Mozna wpisac maksymalnie 48 znakow! \n"); } while (strlen(baza[numer].adres) > 48); do { printf("\n Telefon: "); gets(baza[numer].telefon); if (strlen(baza[numer].telefon) > 18) printf("\n Mozna wpisac maksymalnie 18 znakow! \n"); } while (strlen(baza[numer].telefon) > 18); /* Nic nie wpisano w polu Nazwisko i imie lub Telefon */ if ((strlen(baza[numer].telefon) == 0) || (strlen(baza[numer].Nazwisko) == 0)) { printf("\n Wpis nie zostal dodany do bazy danych!" "\n Musi zostac podane nazwisko i numer telefonu! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Do kazdego pola dodaj znacznik konca lini */ strcat(baza[numer].Nazwisko, "\n"); strcat(baza[numer].Imie, "\n"); strcat(baza[numer].adres, "\n"); strcat(baza[numer].telefon, "\n"); numer++; /* Zwieksz liczbe wpisow o jeden */ printf("\n Wpis zostal dodany do bazy danych! \n"); potwierdzenie(); return EXIT_SUCCESS;} int usun_wpis(void){char wpis[INPUT]; /* Tekst wpisany przez uzytkownika */int kasuj_nr; /* Wpis do usuniecia */ printf("\n USUWANIE WPISU Z BAZY \n"); printf("\n Podaj indeks wpisu do usuniecia: "); kasuj_nr = atoi(gets(wpis)); /* Konwersja typu danych */ /* Nie ma takiego wpisu! */ if ((kasuj_nr < 1) || (kasuj_nr > numer)) { printf("\n Nie ma w bazie wpisu o takim indeksie! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Usuwanie - przeindeksowanie bazy */ while ((kasuj_nr - 1) < numer) { baza[kasuj_nr - 1] = baza[kasuj_nr]; kasuj_nr++; } numer--; printf("\n Wpis zostal usuniety \n"); potwierdzenie(); return EXIT_SUCCESS;} int zachowaj_baze(void){FILE *PlikBazy; /* Wskaznik do pliku bazy */int i; /* Zmienna pomocnicza */char znak; printf("\n ZAPISYWANIE DANYCH DO PLIKU telefony.dbs \n"); printf("\n Jestes pewien? [T]ak/[N]ie "); znak = getchar(); fflush(stdin); if (toupper(znak) != 'T') { printf("\n Baza danych nie zostala zapisana \n"); potwierdzenie(); return EXIT_FAILURE; } PlikBazy = fopen("telefony.dbs", "w" ); /* Otworz do pisania */ /* Nie mozna otworzyc pliku telefony.dbs! */ if (PlikBazy == NULL) { printf("\n Nie mozna otworzyc pliku bazy danych! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Zapisz aktualna liczbe osob w bazie */ fprintf(PlikBazy, "%d\n", numer); /* Zachowaj reszte danych */ for (i = 0; i < numer; i++) { fputs(baza[i].Nazwisko, PlikBazy); fputs(baza[i].Imie, PlikBazy); fputs(baza[i].adres, PlikBazy); fputs(baza[i].telefon, PlikBazy); } printf("\n Baza danych zostala zachowana! \n"); potwierdzenie(); return EXIT_SUCCESS;} int wczytaj_baze(void){FILE *PlikBazy; /* Wskaznik do pliku bazy */int i; /* Zmienna pomocnicza */ printf("\n WCZYTYWANIE DANYCH Z PLIKU telefony.dbs \n"); /* Otworz plik tylko do odczytu */ PlikBazy = fopen("telefony.dbs", "r"); /* Nie mozna otworzyc pliku telefony.dbs!*/ if (PlikBazy == NULL) { printf("\n Nie mozna otworzy pliku bazy danych! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Czytaj z pliku aktualna liczbe wpisow w bazie */ fscanf(PlikBazy, "%d\n", &numer); if (numer > MAX) { printf("\n W bazie danych jest za duzo wpisow! \n"); potwierdzenie(); return EXIT_FAILURE; } /* Czytaj reszte danych z pliku */ for (i = 0; i < numer; i++) { fgets(baza[i].Nazwisko, 50, PlikBazy); fgets(baza[i].Imie, 50, PlikBazy); fgets(baza[i].adres, 50, PlikBazy); fgets(baza[i].telefon, 20, PlikBazy); } printf("\n Baza danych zostala zaladowana! \n"); potwierdzenie(); return EXIT_SUCCESS;} void sortuj_baze(void){ char tab[20];int j,temp1,temp2,temp,i,wybor; printf("\n SORTOWANIE BAZY DANYCH \n"); printf(" [1]-sortowanie sekwencyjne [2]-sortowanie babelkowe\n"); printf(" twoj wybor.."); scanf("%d", &wybor); switch (wybor) { case 1: { for (i=0; i<numer-1; i++) { for (j=0; j<numer-2; j++) { } }} void info(void){ printf("\n INFORMACJE O PROGRAMIE \n"); printf("\n Nazwa: Ksiazka telefoniczna wersja ANSI-C 0.8d" "\n Autor: Grzegorz Szydlo szydlak18@interia.pl" "\n Opis: Program umozliwia wprowadzanie, usuwanie," "\n wyszukiwanie, sortowanie oraz przechowywanie" "\n w pliku danych o numerach telefonicznych" "\n" "\n Licencja: public domain \n"); potwierdzenie();} Edytowane 13 Stycznia 2006 przez szydlak Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Haquim Opublikowano 13 Stycznia 2006 Zgłoś Opublikowano 13 Stycznia 2006 (edytowane) algorytmy: bąbelkowe opis przez wybieranie przez wstawianie Sortowanie_przez_wstawianie przez wstawianie z binarnym wyszukiwaniem przez scalanie(mergesort) Mergesort kopcowanie(heapsort) szybkie (quicksort) Sortowanie_szybkie uzyj googla z tymi hasłami Edytowane 13 Stycznia 2006 przez Haquim Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
jkotor Opublikowano 13 Stycznia 2006 Zgłoś Opublikowano 13 Stycznia 2006 algorytmy: bąbelkowe opis przez wybieranie przez wstawianie Sortowanie_przez_wstawianie przez wstawianie z binarnym wyszukiwaniem przez scalanie(mergesort) Mergesort kopcowanie(heapsort) szybkie (quicksort) Sortowanie_szybkie uzyj googla z tymi hasłami A ja się wtrącę z pytaniem ;) Czy 'string' to jest typ z porzadkiem liniowym? Tzn. czy da się powiedzieć że np. "ola" > "ala"? Wydaje mi się że tak ale dobrze jakby mnie ktoś w tym przekonaniu utwierdził ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 13 Stycznia 2006 Zgłoś Opublikowano 13 Stycznia 2006 (edytowane) Tzn. czy da się powiedzieć że np. "ola" > "ala"? Wydaje mi się że tak ale dobrze jakby mnie ktoś w tym przekonaniu utwierdził ;)Tak.. stringi sortuje sie leksykograficznie.. czyli wg kolejnosci liter w danym alfabecie. PS. ha! bylem szybszy ;] Edytowane 13 Stycznia 2006 przez FiDO Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ragnor Opublikowano 13 Stycznia 2006 Zgłoś Opublikowano 13 Stycznia 2006 A ja się wtrącę z pytaniem ;) Czy 'string' to jest typ z porzadkiem liniowym? Tzn. czy da się powiedzieć że np. "ola" > "ala"? Wydaje mi się że tak ale dobrze jakby mnie ktoś w tym przekonaniu utwierdził ;) porządek wprowadzany na stringach nazywa się porządkiem leksykograficzny wyglada to min tak: "a" < "aa" < "al" < "ala" < "ola" < "z" itd, porównywanie rozpoczyna się od pierwszego znaku i kończy gdy któraś para nie jest sobie równa np. "domek" ?" domeczek": d = d o = o m = m e = e k > c więc "domek" > "domeczek" Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...