Witaj szanowny Gościu na forum Odjechani,com.pl. Serdecznie zachęcamy do rejestracji. Tylko u nas tak przyjazna atmosfera.

Strona Odjechani.com.pl wykorzystuje pliki cookies, pozostając na stronie wyrażasz zgodę na ich zapis lub wykorzystanie. Więcej informacji w naszej polityce prywatności.

Moje niewielkie kody.
#1
W związku z tym, że na tym forum często pojawiały się wątki o programowaniu w C/C++, często na poziomie początkującym (nie tylko ode mnie) pomyślałem, że będę mniejsze swoje programy/funkcje wrzucał tutaj(w tym wątku), które nie nadają się do nazwania jakimś projektem ale mogą się komuś przydać w większych programach lub do lepszego zrozumienia programowania. Dziś napisałem funkcję, która wylicza wartość dla danego wielomianu. W pierwszym argumencie należy podać wskaźnik do tablicy ze współczynnikami wielomianu(indeks #0 to współczynnik a, indeks #1 to b, itp.), w drugim argumencie trzeba podać ilość współczynników(dla funkcji kwadratowej to będzie liczba 3), trzecim argumentem funkcji jest liczba, na podstawie której funkcja ma obliczyć wartość, czyli jest to po prostu znany z matematyk x. Kod jest napisany w C, aby został go skompilować należy użyć kompilatora ze wsparciem dla standardu C99 lub nowszego albo użyć kompilatora do C++. Wiem, że kod jest banalny, ale tak jak mówiłem, może ktoś kto jest początkujący skorzysta, zresztą sam mam zamiar go użyć już w pewnym bardziej rozbudowanym programie.
Kod:
#include <stdio.h>
#include <math.h>
double f(const double* data, int size, double value)
{
   double ToReturn=0;
   for(int i=size-1, j=0; i>=0; --i, j++)
   {
       ToReturn+=pow(value, i)*data[j];
   }
   return ToReturn;
}
int main(void)
{
   double tab[]={123, 456, 789};
   printf("%f", f(tab, 3, 11));
   return 0;
}

  Odpowiedz
#2
Tym razem będzie to cały program, również w języku C. Niewielki ale już raz mi się przydał do czegoś konkretnego. Służy do porównania szybkości dwóch programów, które przetwarzają dane z jakiegoś pliku. Programy do testowania powinny te dane tylko odczytywać, bo gdyby coś zapisywały do pliku, to każdy program dostałby inny plik i wyniki testu byłyby zafałszowane. Należy umieścić oba programy razem z programem testującym w tym samym folderze oraz plik, na którym te programy coś będą robić. Programy powinny się nazywać odpowiednio program1 i program2 a plik do sprawdzenia test_file. Program wywoła oba programy, gdzie pierwszym argumentem jest nazwa pliku(test_file) oraz zmierzy czas wykonania obu programów. Na koniec wyświetli czasy oraz informacje o tym ile razy ten szybszy program był szybszy od drugiego. Należy pamiętać, że nie powinno się nic robić na komputerze podczas testów oraz nie powinno działać za dużo programów w tle, bo to może zafałszować wynik.
Kod:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
   double program1, program2;
   clock_t start, stop;
   start=clock();
   system("program1 test_file");
   stop=clock();
   program1=(double)(stop-start)/CLOCKS_PER_SEC;
   start=clock();
   system("program2 test_file");
   stop=clock();
   program2=(double)(stop-start)/CLOCKS_PER_SEC;
   printf("\nProgram #1 execution time: %f seconds.\nProgram #2 execution time: %f seconds.\n", program1, program2);
   if(program2>program1) printf("Program #1 is %f times faster than program #2.\n",program2/program1);
   if(program2<program1) printf("Program #2 is %f times faster than program #1.\n",program1/program2);
   if(program1==program2) printf("Program #1 is as fast as program #2.\n");
   getchar();
   return 0;
}

  Odpowiedz
#3
Teraz wrzuciłem trochę zmienioną wersję funkcji z pierwszego postu. Pierwsza funkcja również oblicza wartość dla danego wielomianu ale zmieniłem sposób jej działania. Np. dla funkcji kwadratowej, pierwszy element tablicy z numerem 0 to współczynnik c, drugi element to współczynnik b, trzeci to a. Ostatnim argumentem jest ilość elementów w tablicy. Zakładam, że dzięki tej zmianie funkcja będzie szybciej działać ze względu na mniejszą ilość operacji(chodzi o mniejszą ilość liczników w pętli). Druga funkcja o nazwie "derivative" oblicza określoną wartość dla pochodnej podanego wielomianu.

Kod:
#include <stdio.h>
#include <math.h>
double func(const double* data, const double value, int elements)
{
   double ToReturn=0;
   for(int i=0; i<elements; ++i)
       ToReturn+=pow(value, i)*data[i];
   return ToReturn;
}
double derivative(const double* data, const double value, int elements)
{
   double ToReturn=0;
   for(int i=1; i<elements; ++i)
       ToReturn+=pow(value, i-1)*data[i]*i;
   return ToReturn;
}
int main(void)
{
   double tab[]={2, -3, 4, -5};
   for(int i=-3;i<=3;++i)
       printf("f(%d) = %f\n", i, func(tab, i, 4));
   printf("\n");
   for(int i=-3;i<=3;++i)
       printf("f'(%d) = %f\n", i, derivative(tab, i, 4));
   return 0;
}

  Odpowiedz
#4
Funkcja wykonana w C++ w ramach zajęć w technikum z tworzenia i administrowania bazami danych sprawdzająca czy podano poprawny numer NIP. Głównym założeniem zadania było zaprojektowanie algorytmu, który sprawdzi czy podany NIP do formularza jest prawidłowy. Każda grupa 2-osobowa miała się zająć innym numerem np. PESEL. Choć byłem z kimś, to cały algorytm i jego implementacje sam zrobiłem od początku do końca. Potrzebne to potem będzie do naszych baz danych. Choć mamy używać w bazach Visual Basica dla Accessa, to nauczyciel zaproponował też implementacje tego w innym języku programowania, sam zaproponował C++, pewnie dlatego, że mamy ten język na rozszerzonej informatyce, choć też ktoś wykonał coś takiego w Javascript. Uznał, że jak to się zrobi w innym języku, to łatwiej będzie przenieść taką funkcję do tego VB, którym potem się zajmiemy. Oczywiście implementacja tego podwyższa ocenę za zadanie. Funkcja przyjmuje łańcuch znakowy oraz zwraca odpowiednią wartość w zależności od tego czy podany NIP jest dobry lub czy jest z nim coś nie tak.
Kod:
#include <iostream>
#include <stdlib.h>
using namespace std;

unsigned short CheckNIP(string nip)
{
    int ControlNumber=0, tab[]={6, 5, 7, 2, 3, 4, 5, 6, 7};
    if(nip.length()<10) return 1;
    if(nip.length()>10) return 2;
    for(int i=0;i<10;++i) if(!(nip[i]>=48&&nip[i]<=57)) return 3;
    for(int i=0;i<9;++i) ControlNumber+=(*(nip.c_str()+i)-'0')*tab[i];
    ControlNumber%=11;
    if(ControlNumber==10) return 4;
    if(ControlNumber==(nip[9]-'0')) return 0;
    return 5;
}
int main()
{
    cout << CheckNIP("7251801126") << endl;
    return 0;
}
Wykaz zwracanych wartości:
0-Poprawny NIP.
1-Za krótki.
2-Za długi.
3-Uzyto niedozwolonych znaków.
4-Cyfra kontrolna(zmienna ControlNumber) jest równa 10. Czyli zły NIP.
5-Zły NIP. Cyfra kontrolna nie zgadza się z ostatnią cyfrą NIPu.

  Odpowiedz
#5
Oto funkcja, której zadanie jest znalezienie hashtagów z podanego tekstu. Ta funkcja będzie elementem mojego pewnego większego programu. Hashtagi są wyłapywane według następujących kryteriów:
Cytat:Jako hasztag uznany jest fragment tekstu, który:
-Poprzedza znak #, który jeszcze jest poprzedzony znakiem, który nie jest alfanumeryczny.
-Składa się przynajmniej z jednego wymaganego znaku(alfanumerycznego).
-Składa się tylko z znaków alfanumerycznych. Inny znak już nie jest uznany za część hasztagu, tylko za koleją część tekstu.
Kod:
#include <iostream>
#include <list>
#include <cctype>
using namespace std;
list<string> FindHashtags(string text)
{
    bool IsHashtag = false;
    list<string>Result;
    auto ResultPtr=Result.begin();
    if(text[0]=='#' && isalnum(text[1]))
    {
        Result.push_back(string());
        ++ResultPtr;
        IsHashtag = true;
    }
    for(unsigned int i=1; i<text.length(); ++i)
    {
        if(IsHashtag)
        {
            if(isalnum(text[i])) *ResultPtr+=text[i];
            else IsHashtag = false;
        }
        if(text[i]=='#' && !isalnum(text[i-1]) && isalnum(text[i+1]))
        {
            Result.push_back(string());
            ++ResultPtr;
            IsHashtag = true;
        }
    }
    return Result;
}
int main()
{
    int j=0;
    list<string>test=FindHashtags("#Lorem ipsum dolor sit #amet, consectetur\
                                  adipiscing elit. Curabitur#blandit posuere convallis. Sed #non orci sit amet neque eleifend luctus");
    cout<<"Number of elements: "<<test.size()<<"\n";
    for(auto i=test.begin(); i!=test.end(); ++i, ++j)
    {
        cout<<j<<": "<<*i<<"\n";
    }
    return 0;
}

  Odpowiedz
#6
Program do symulacji gry w Lotto, który sam wszystko losuje i sprawdza po ilu próbach się wygrało.
Kod:
#include <iostream>
#include <random>
using namespace std;

int main()
{
    default_random_engine generator;
    uniform_int_distribution<int> distribution(1,49);
    int input[6], randomization[6];
    long double games=0, TheSame=0;
    for(int i=0; i<6; ++i) input[i] = distribution(generator);
    while(TheSame<6)
    {
        TheSame=0;
        ++games;
        for(int i=0; i<6; ++i) randomization[i] = distribution(generator);
        for(int i=0; i<6; ++i) if(input[i] == randomization[i]) ++TheSame;
    }
    cout<<"Win after "<<games<<" games.\n";
    return 0;
}

  Odpowiedz
#7
Oto program, o którym pisałem w tym wątku: https://odjechani.com.pl/Thread-Problem-...pid=152021
Zleceniodawca go nie zechciał, więc może komuś z Was się przyda. Program był pisany na szybko, miałem mało czasu aby go zrobić. Oto treść zadania, pod które napisałem program:
Cytat:Wiedza wymagana do realizacji zadań częściowo została zawarta w wytycznych umieszczonych na platformie, dlatego powinniście Państwo najpierw zapoznać się z nimi oraz ze źródłami literaturowymi. Następnie należy przeanalizować, zaprojektować i zaimplementować program rozwiązujący wymyślone przez siebie zadanie operujące na jednej strukturze, strumieniach plikowych, argumentach pobieranych z linii uruchomienia programu (nazwy plików) oraz przedstawiające opis pewnego fragmentu rzeczywistości. Wybrany fragment rzeczywistości i struktury nie mogą powtarzać się pomiędzy Państwem. W związku z tym na forum utworzony zostanie jeden wątek, w którym każdy musi poinformować pozostałych uczestników kursu o wybranym zagadnieniu. W przypadku powtórzonych prac wszystkie zostaną ocenione na 0 pkt.

Na zaliczenie modułu należy przesłać do oceny tylko plik źródłowy *.cpp, nazwany zgodnie z zasadami podanymi w opisie kursu. Wewnątrz pliku źródłowego w komentarzach należy opisać działanie każdej funkcji. Funkcja main() musi zawierać informacje dla użytkownika o sposobie korzystania z programu.
Kod:
#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>//Potrzebne dla funckji zamieniających łańcuch znakowy na liczby.
#include <conio.h>//Potrzebne dla funckji getch()
using namespace std;
struct pracownik
{
   string imie;
   string nazwisko;
   int rok;
   string pesel;
   float pensja;
   int staz;
};
bool OdtworzBaze(vector<pracownik>&dane, fstream& plik, string nazwa);
bool PokazBaze(const vector<pracownik>&dane);
bool ZapisZmiany(const vector<pracownik>&dane, fstream& plik, string nazwa);
bool ZmodyfikujRekord(vector<pracownik>&dane);
bool UsunRekord(vector<pracownik>&dane);
bool DodajRekord(vector<pracownik>&dane);

int main(int argc, char** argv)
{
   if(argv[1]==NULL)//Sprawdzenie czy podano nazwe pliku.
   {
       cout<<"Nie podales nazwy pliku.\n";
       return 1;//Zwrócenie informacji o nieprawidłowym wykonaniu
   }
   char opcja=0;
   fstream plik;
   vector<pracownik>rekordy;//Przechowuje bazę, na której działają poszczególne funckje.
   string tmp=argv[1];
   OdtworzBaze(rekordy, plik, tmp.c_str());//Otworzenie pliku z bazą o nazwie podanej w linii poleceń.
   cout<<"Dostepne opcje:\n0-Zamkniecie programu.\n1-Pokazanie bazy.\n2-Zapisanie zmian.\n3-Zmodyfikowanie rekordu.\n4-Usuniecie rekordu.\n5-Dodanie rekordu.\n";
   do
   {
       cout<<"Wybierz opcje: ";
       opcja=getch();//Pobranie znaku identyfikującego opcję.
       cout<<"\n";
       switch(opcja)
       {
       case '0': return 0;
       case '1':
           PokazBaze(rekordy);
           break;
       case '2':
           ZapisZmiany(rekordy, plik, tmp);
           break;
       case '3':
           ZmodyfikujRekord(rekordy);
           break;
       case '4':
           UsunRekord(rekordy);
           break;
       case '5':
           DodajRekord(rekordy);
           break;
       default:
           cout<<"Nie ma takiej opcji w menu.\n";
       }

   }while(opcja!=0);//Działanie do momentu wybrania zera na klawiaturze.
   return 0;
}

bool OdtworzBaze(vector<pracownik>&dane, fstream& plik, string nazwa)
{
   dane.clear();
   string tmp;
   plik.open(nazwa.c_str(), ios::in|ios::out);//Otworzenie pliku z opcjami do zapisu i odczytu.
   if(!plik.is_open()) return 0;//Zakończenie pracy funckji, jeśli plik nie jest otwarty.
   for(int i=0;getline(plik, tmp);++i)//Wykonywanie dopóki program będzie mógł pobrać kolejene wiersze z pliku.
   {//Wczytywanie danych z pliku do dyncamicznej tablicy.
       switch(i%6)//Wybiera do jakiego pola wpisać zawartość pobranej linii.
       {
       case 0:
           dane.push_back(pracownik());
           dane[dane.size()-1].imie=tmp;
           break;
       case 1:
           dane[dane.size()-1].nazwisko=tmp;
           break;
       case 2:
           dane[dane.size()-1].rok=atoi(tmp.c_str());//atoi zmienia łańcuch znakowy na liczbę całkowitą.
           break;
       case 3:
           dane[dane.size()-1].pesel=tmp;
           break;
       case 4:
           dane[dane.size()-1].pensja=atof(tmp.c_str());//atof zmienia łańcuch znakowy na liczbę zmiennoprzecinkową.
           break;
       case 5:
           dane[dane.size()-1].staz=atoi(tmp.c_str());
           break;
       }
   }
   return 1;
}
bool PokazBaze(const vector<pracownik>&dane)
{
   for(size_t i=0;i<dane.size();++i)//Wyświetlenie zawartości wszystkich komórek dynamicznej tablicy, która przechowuje w pamięci ram bazę.
   {
       cout<<"Rekord nr. "<<i<<":\n";
       cout<<"Imie: "<<dane[i].imie<<"\n";
       cout<<"Nazwisko: "<<dane[i].nazwisko<<"\n";
       cout<<"Rok: "<<dane[i].rok<<"\n";
       cout<<"Pesel: "<<dane[i].pesel<<"\n";
       cout<<"Pensja: "<<dane[i].pensja<<"\n";
       cout<<"Staz: "<<dane[i].staz<<"\n\n";
   }
   return 1;
}
bool ZmodyfikujRekord(vector<pracownik>&dane)
{
   unsigned int rekord=0;
   char wiersz=0;
   string tmp;
   cout<<"Wybierz numer rekordu: ";
   cin>>rekord;
   if(rekord>=dane.size())//Sprawdzenie czy użyto poprawnego indexu tablicy.
   {
       cout<<"Nie ma takiego rekordu.\n";
       return 0;//Zwrócenie fałszu w przypadku złego indexu.
   }
   cout<<"Wybierz wiersz do modyfikacji(0-imie, 1-nazwisko, 2-rok, 3-pesel, 4-pensja, 5-staz: ";
   wiersz=getch();//Pobranie jednego znaku bez konieczności zatwierdzania enterem.
   cout<<"Wpisz zawartosc wiersza: ";
   cin>>tmp;
   switch(wiersz)//Wybranie pola jakie chce zmienić użytkownik.
   {
   case '0':
       dane[rekord].imie=tmp;
       break;
   case '1':
       dane[rekord].nazwisko=tmp;
       break;
   case '2':
       dane[rekord].rok=atoi(tmp.c_str());
       break;
   case '3':
       dane[rekord].pesel=tmp;
       break;
   case '4':
       dane[rekord].pensja=atof(tmp.c_str());
       break;
   case '5':
       dane[rekord].staz=atoi(tmp.c_str());
       break;
   }
   return 1;
}
bool ZapisZmiany(const vector<pracownik>&dane, fstream& plik, string nazwa)
{
   plik.close();
   plik.open(nazwa.c_str(), ios::in|ios::out|ios::trunc);//Zamknięcie i otwrcie pliku z dodatkową falgą ios::trunc w celu wyczyszczenia jego zawartpści.
   for(size_t i=0;i<dane.size();++i)//Pętla działa na wszystkich elementach tablicy.
   {
       plik<<dane[i].imie<<"\n";//Zapis zawartości komórek dynamicznej tablicy do pliku.
       plik<<dane[i].nazwisko<<"\n";
       plik<<dane[i].rok<<"\n";
       plik<<dane[i].pesel<<"\n";
       plik<<dane[i].pensja<<"\n";
       if(i==dane.size()-1) plik<<dane[i].staz;//Zapobiegnięcie zapisania pustej linii do pliku.
       else plik<<dane[i].staz<<"\n";
   }
   plik.close();
   cout<<"Zapisano.\n";
   return 1;
}
bool UsunRekord(vector<pracownik>&dane)
{
   unsigned int rekord=0;
   cout<<"Wpisz rekord do skasowania: ";
   cin>>rekord;
   if(rekord>=dane.size())//Sprawdzenie czy użyto poprawnego indeksu tablicy.
   {
       cout<<"Nie ma takiego rekordu\n";
       return 0;
   }
   dane.erase(dane.begin()+rekord);//Usunięcie danego elementu z tablicy.
   return 1;
}
bool DodajRekord(vector<pracownik>&dane)
{
   dane.push_back(pracownik());//Utowrzenie nowego elementu w tablicy.
   cout<<"Podaj imie: ";//Pobranie danych od użytkownika do nowego rekordu.
   cin>>dane[dane.size()-1].imie;
   cout<<"Podaj nazwisko: ";
   cin>>dane[dane.size()-1].nazwisko;
   cout<<"Podaj rok: ";
   cin>>dane[dane.size()-1].rok;
   cout<<"Podaj pesel: ";
   cin>>dane[dane.size()-1].pesel;
   cout<<"Podaj pensje: ";
   cin>>dane[dane.size()-1].pensja;
   cout<<"Podaj staz: ";
   cin>>dane[dane.size()-1].staz;
   return 1;
}

  Odpowiedz
#8
Proste zadanie, które przedstawia wydajny sposób zamiany liczby dziesiętnej na binarną.
Kod:
#include <iostream>
#include <list>

using namespace std;
/*Napisz funkcje bitpalindrom(int n) sprawdzajaca czy dana liczba na podstawie bitów jest palindromem*/
void bitpalindrom(int n)
{
    list<bool>liczba, odwrocona;
    bool bit;
    cout<<"Odwrocona liczba binarna: ";
    while(n>0)
    {
        bit = n%2;
        n/=2;
        liczba.push_back(bit);
        cout<<bit;
    }
    list<bool>::iterator i=liczba.end();
    --i;
    cout<<"\nLiczba binarna: ";
    for(;; --i)
    {
        odwrocona.push_back(*i);
        cout<<*i;
        if(i == liczba.begin()) break;
    }
    for(list<bool>::iterator j=liczba.begin(), k = odwrocona.begin(); j!=liczba.end(); ++j, ++k)
    {
        if(*k != *j)
        {
            cout<<"\nLiczba nie jest palindromem.\n\n";
            return;
        }
    }
    cout<<"\nLiczba jest palindromem.\n\n";
}
int main()
{
    int liczba = 0;
    do
    {
        cout<<"Podaj liczbe: ";
        cin>>liczba;
        bitpalindrom(liczba);
    }while(liczba != 0);
    return 0;
}

  Odpowiedz
#9
Oto implementacja prostej, relacyjnej bazy danych. Dane z zapisywanych plików można łatwo zaimportować do tabel w bazach takich jak Access czy MySQL. Aby skompilować kod, kompilator musi obsługiwać standard C++11 lub nowszy.
Kod:
#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>

using namespace std;

struct Osoba
{
    int IdOsoby;
    string Nazwisko;
    Osoba(){}
    Osoba(int Id, string Naz):IdOsoby(Id), Nazwisko(Naz){}
};
struct Przedmiot
{
    int IdPrzedmiotu;
    string Nazwa;
    Przedmiot(){}
    Przedmiot(int Id, string Naz):IdPrzedmiotu(Id), Nazwa(Naz){}
};
struct Przydzial
{
    int IdOsoby, IdPrzedmiotu, IdPrzydzialu;
    Przydzial(){}
    Przydzial(int Osoba, int Przedmiot, int Przydzial):IdOsoby(Osoba), IdPrzedmiotu(Przedmiot), IdPrzydzialu(Przydzial){}
};
fstream Osoby, Przedmioty, Przydzialy;
vector<Osoba>TOsoby;
vector<Przedmiot>TPrzedmioty;
vector<Przydzial>TPrzydzialy;
void OtworzOsoby()
{
    Osoby.open("Osoby.txt", ios::in);
    string Linia, Tmp;
    while(getline(Osoby, Linia))
    {
        TOsoby.push_back(Osoba());
        for(unsigned i=0;i<Linia.size();++i)
        {
            if(Linia[i] == ';')
            {
                TOsoby[TOsoby.size()-1].IdOsoby = atoi(Tmp.c_str());
                Tmp.clear();
            }
            else Tmp+=Linia[i];
        }
        TOsoby[TOsoby.size()-1].Nazwisko = Tmp;
        Tmp.clear();
    }
    Osoby.close();
}
void OtworzPrzedmioty()
{
    Przedmioty.open("Przedmioty.txt", ios::in);
    string Linia, Tmp;
    while(getline(Przedmioty, Linia))
    {
        TPrzedmioty.push_back(Przedmiot());
        for(unsigned i=0; i<Linia.size(); ++i)
        {
            if(Linia[i] == ';')
            {
                TPrzedmioty[TPrzedmioty.size()-1].IdPrzedmiotu = atoi(Tmp.c_str());
                Tmp.clear();
            }
            else Tmp+=Linia[i];
        }
        TPrzedmioty[TPrzedmioty.size()-1].Nazwa = Tmp;
        Tmp.clear();
    }
    Przedmioty.close();
}
void DodajOsobe()
{
    int Id;
    string Nazwisko;
    cout<<"Podaj id: ";
    cin>>Id;
    cout<<"Podaj nazwisko: ";
    cin>>Nazwisko;
    TOsoby.push_back(Osoba(Id, Nazwisko));
}
void DodajPrzedmiot()
{
    int Id;
    string Nazwa;
    cout<<"Podaj id: ";
    cin>>Id;
    cout<<"Podaj nazwe: ";
    cin>>Nazwa;
    TPrzedmioty.push_back(Przedmiot(Id, Nazwa));
}
void DodajPrzydzial()
{
    int IdOsoby, IdPrzedmiotu, IdPrzydzialu;
    cout<<"Podaj id osoby: ";
    cin>>IdOsoby;
    cout<<"Podaj id przedmiotu: ";
    cin>>IdPrzedmiotu;
    cout<<"Podaj id przydzialu: ";
    cin>>IdPrzydzialu;
    TPrzydzialy.push_back(Przydzial(IdOsoby, IdPrzedmiotu, IdPrzydzialu));
}
void OtworzPrzydzialy()
{
    Przydzialy.open("Przydzialy.txt", ios::in);
    string Linia, Tmp;
    char nr = 0;
    while(getline(Przydzialy, Linia))
    {
        TPrzydzialy.push_back(Przydzial());
        for(unsigned i=0; i<Linia.size(); ++i)
        {
            if(Linia[i] == ';')
            {
                ++nr;
                switch(nr)
                {
                case 1:
                    TPrzydzialy[TPrzydzialy.size()-1].IdOsoby = atoi(Tmp.c_str());
                    break;
                case 2:
                    TPrzydzialy[TPrzydzialy.size()-1].IdPrzedmiotu = atoi(Tmp.c_str());
                    break;
                default:
                    cout<<"Blad.\n";
                    break;
                }
                Tmp.clear();
            }
            else Tmp+=Linia[i];
        }
        TPrzydzialy[TPrzydzialy.size()-1].IdPrzydzialu = atoi(Tmp.c_str());
        Tmp.clear();
        nr = 0;
    }
    Przydzialy.close();
}
void ZapiszOsoby()
{
    Osoby.open("Osoby.txt", ios::out|ios::trunc);
    for(const auto i:TOsoby)
        Osoby<<i.IdOsoby<<";"<<i.Nazwisko<<"\n";
    Osoby.close();
}
void ZapiszPrzydzialy()
{
    Przydzialy.open("Przydzialy.txt", ios::out|ios::trunc);
    for(const auto i:TPrzydzialy)
        Przydzialy<<i.IdOsoby<<";"<<i.IdPrzedmiotu<<";"<<i.IdPrzydzialu<<"\n";
    Przydzialy.close();
}
void ZapiszPrzedmioty()
{
    Przedmioty.open("Przedmioty.txt", ios::out|ios::trunc);
    for(const auto i:TPrzedmioty)
        Przedmioty<<i.IdPrzedmiotu<<";"<<i.Nazwa<<"\n";
    Przedmioty.close();
}
void UsunOsobe()
{
    int nr = 0, j =  0;
    cout<<"Podaj numer osoby do usuniecia: ";
    cin>>nr;
    for(auto i:TOsoby)
    {
        if(i.IdOsoby == nr)
        {
            TOsoby.erase(TOsoby.begin()+j);
            cout<<"Usunieto.\n";
            return;
        }
        ++j;
    }
    cout<<"Nie znaleziono osoby o podanym id.\n";
}
void UsunPrzedmiot()
{
    int nr = 0, j =  0;
    cout<<"Podaj numer przedmiotu do usuniecia: ";
    cin>>nr;
    for(auto i:TPrzedmioty)
    {
        if(i.IdPrzedmiotu == nr)
        {
            TPrzedmioty.erase(TPrzedmioty.begin()+j);
            cout<<"Usunieto.\n";
            return;
        }
        ++j;
    }
    cout<<"Nie znaleziono przedmiotu o podanym id.\n";
}
void UsunPrzydzial()
{
    int nr = 0, j =  0;
    cout<<"Podaj numer przydzialu do usuniecia: ";
    cin>>nr;
    for(auto i:TPrzydzialy)
    {
        if(i.IdPrzydzialu == nr)
        {
            TPrzydzialy.erase(TPrzydzialy.begin()+j);
            cout<<"Usunieto.\n";
            return;
        }
        ++j;
    }
    cout<<"Nie znaleziono przydzialu o podanym id.\n";
}
void PokazOsobyZDanymPrzedmiotem()
{
    bool Znaleziono = false;
    int Id = 0;
    cout<<"Podaj id przedmiotu: ";
    cin>>Id;
    for(auto i:TPrzedmioty)
    {
        if(i.IdPrzedmiotu == Id)
        {
            Znaleziono = true;
            break;
        }
    }
    if(!Znaleziono)
    {
        cout<<"Nie ma przedmiotu o podanym id.\n";
        return;
    }
    for(auto i:TPrzydzialy)
    {
        if(Id == i.IdPrzedmiotu)
        {
            for(auto j:TOsoby)
            {
                if(j.IdOsoby == i.IdOsoby) cout<<j.Nazwisko<<"\n";
            }
        }
    }
    cout<<"\n";
}
void PokazPrzedmiotyDanejOsoby()
{
    bool Znaleziono = false;
    int Id = 0;
    cout<<"Podaj id osoby: ";
    cin>>Id;
    for(auto i:TOsoby)
    {
        if(i.IdOsoby == Id)
        {
            Znaleziono = true;
            break;
        }
    }
    if(!Znaleziono)
    {
        cout<<"Nie ma osoby o podanym id.\n";
        return;
    }
    for(auto i:TPrzydzialy)
    {
        if(Id == i.IdOsoby)
        {
            for(auto j:TPrzedmioty)
            {
                if(j.IdPrzedmiotu == i.IdPrzedmiotu) cout<<j.Nazwa<<"\n";
            }
        }
    }
    cout<<"\n";
}
void PokazOsoby()
{
    for(const auto i:TOsoby)
        cout<<"Id: "<<i.IdOsoby<<"\nNazwisko: "<<i.Nazwisko<<"\n";
    cout<<"\n";
}
void PokazPrzydzialy()
{
    for(const auto i:TPrzydzialy)
        cout<<"Id osoby: "<<i.IdOsoby<<"\nId przedmiotu: "<<i.IdPrzedmiotu<<"\nId przydzialu: "<<i.IdPrzydzialu<<"\n";
    cout<<"\n";
}
void PokazPrzedmioty()
{
    for(const auto i:TPrzedmioty)
        cout<<"Id: "<<i.IdPrzedmiotu<<"\nNazwa: "<<i.Nazwa<<"\n";
    cout<<"\n";
}
void PokazMenu()
{
    cout<<"0-Pokaz Osoby.\n1-Pokaz przedmioty.\n2-Pokaz Przydzialy.\n3-Usun osobe.\n4-Usun przedmiot.\n5-Usun przydzial.\n";
    cout<<"6-Dodaj osobe.\n7-Dodaj przedmiot.\n8-Dodaj przydzial.\n9-Pokaz przedmioty danej osoby.\na-Pokaz osoby posiadajace dany przedmiot.";
    cout<<"\nb-Pokaz menu.\nc-Wyjscie z zapisaniem danych.\nd-Wyjscie bez zapisania danych.\n";
}
void ZapiszZmiany()
{
    ZapiszOsoby();
    ZapiszPrzedmioty();
    ZapiszPrzydzialy();
}
int main()
{
    PokazMenu();
    char opcja = 0, wybor = 0;
    OtworzOsoby();
    OtworzPrzedmioty();
    OtworzPrzydzialy();
    for(;;)
    {
        cout<<"Wybierz opcje: ";
        cin>>opcja;
        switch(opcja)
        {
        case '0':
            PokazOsoby();
            break;
        case '1':
            PokazPrzedmioty();
            break;
        case '2':
            PokazPrzydzialy();
            break;
        case '3':
            UsunOsobe();
            break;
        case '4':
            UsunPrzedmiot();
            break;
        case '5':
            UsunPrzydzial();
            break;
        case '6':
            DodajOsobe();
            break;
        case '7':
            DodajPrzedmiot();
            break;
        case '8':
            DodajPrzydzial();
            break;
        case '9':
            PokazPrzedmiotyDanejOsoby();
            break;
        case 'a':
            PokazOsobyZDanymPrzedmiotem();
            break;
        case 'b':
            PokazMenu();
            break;
        case 'c':
            ZapiszZmiany();
            return 0;
        case 'd':
            cout<<"Czy na pewno porzucic zmiany(t-tak)?";
            cin>>wybor;
            if(wybor == 't') return 0;
            break;
        default:
            cout<<"Nie ma takiej opcji.\n";
            break;
        }
    }
    return 0;
}

  Odpowiedz


Podobne wątki
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Arduino - moje początki Dominik 2 173 02.03.2017, 18:35
Ostatni post: Dominik
  Początki z językiem C (kody, sugestie) Suicider 35 845 10.11.2016, 19:07
Ostatni post: amb00

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości