Zadanie praktyczne ze zbioru CKE
Wstęp do zadania 58.1 – dla jednego z plików w systemie czwórkowym liczy minimalną temperaturę.
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 | //Autor: Marcin Przybył #include <iostream> #include <fstream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; int main(int argc, char** argv) { ifstream file; //plik wejsciowy ofstream fileOut; //plik wynikowy do zapisu char* endptr; // to jest wskaźnik na miejsce, gdzie przy konwersji z systemu czworkowego wystąpi błąd - nieużywana zmienna long liczba, min; //liczba dziesietna, minimum z pliku string liczba1, liczba2; //dwie liczby w systemie czworkowym wczytujemy jako "string" bo mogą być dłuższe od long long file.open("dane_systemy2.txt"); //otworz plik liczb fileOut.open("wyjscie.txt"); //otworz plik do wynikow bool pierwszy = true; //do algorytmu MINIMUM - zakładamy, że pierwsza liczba jest najmniejsza z dotychczas przeczytanych if(file.good()) //sprawdzenie czy plik istnieje while(!file.eof()) //petla wykonuje sie az program dojedzie do konca pliku { file>>liczba1 >> liczba2; // wczyta dwie liczby z pliku (w wierszu) do 2 stringów liczba = strtol(liczba2.c_str(), &endptr, 4); //^konwersja z systemu czworkowego do dziesietnego, string (C++) trzeba zamienić na char * (C) funkcja .c_str() //zmienna endptr wskazuje na znak w stringu, który nie pasuje do systemu czwórkowego - tu niesprawdzone, bo zakładamy, że dane są poprawne! if(pierwszy) //jeśli to pierwsza liczba z pliku - będzie nowym MINIMUM { min = liczba; pierwszy = false; } else //jeśli to kolejna liczba z pliku... if(liczba < min) //... i jest mniejsza od dotychczasowego minimum... min = liczba; // ... to nadpisz min }//eof() koniec pliku fileOut<< "58.1: " << min <<endl; //zapisanie najmniejszej liczby z pliku czworkowego do pliku wynikowego file.close(); fileOut.close(); return 0; } |
Kolejny krok
W kolejnym kroku należy napisać funkcję
1 2 3 4 5 6 7 8 | long minimumZPliku(string nazwaPliku, int system) { long minimum; //otwórz plik źródłowy do zmiennej ifstream //wyszukaj minimum w pętli wczytując jw. tylko zamiast w main() tutaj //zamknij plik źródłowy return minimum; } |
i w main użyć jej do trzech plików i trzech różnych systemów liczbowych
1 2 3 4 5 6 7 8 9 | int main() { //tu otwórz plik do zapisu ofstream plikOut; long min1 = minimumZPliku("nazwa_pliku.txt", 2); //z pliku o tej nazwie system dwójkowy odczyta i minimum policzy long min2 = minimumZPliku("druganazwa.txt",8);//system 8 plikOut << "Plik pierwszy min:" << min1 <<"\n"; //...itp. //zamknij plikOut na koniec. } |
Kolejny krok – zamiana na system binarny – bitset
C++ ma bibliotekę bitset, która radzi sobie dobrze z zamianą z systemu 10 na dwójkowy. Niestety ma jedną wadę – stałą liczbę cyfr (np. 8, 16) co oznacza, że liczba 1 zamieni na 0000001, trzeba z wyniku usunąć wiodące zera (string.erase(…))
Całe zadanie – wynik
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 | //Autor: Adam Czwordon #include <iostream> #include <fstream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <bitset> using namespace std; string dec2bin(int dziesietna) { //uwaga bitset nie zmienia znaku minus na minus tylko odwraca "bitowość" tzn. -101 zamieni na 010 int d; string znak; if(dziesietna > 0) { d = dziesietna; znak = ""; } else { d = dziesietna * -1; //jeśli ujemna zmieniamy znak na + i taką przetwarzamy na dwójkowy znak = "-"; } string binary = bitset<8>(d).to_string(); //to binary - ale 8 cyfr wyniku binary.erase(0, min(binary.find_first_not_of('0'), binary.size()-1)); //usunięcie pierwszych 0 binary = znak + binary; //dodanie znaku minus jeśli była ujemna return binary; } long minimumZPliku(string nazwaPliku, int system) { ifstream file; file.open(nazwaPliku); string liczba1, liczba2; bool pierwszy = true; long liczba, min; char* endptr; if(file.good()) { //sprawdzenie czy plik istnieje while(!file.eof()) //petla wykonuje sie az program dojedzie do konca pliku { file>>liczba1 >> liczba2; // wczyta dwie liczby z pliku (w wierszu) do 2 stringów liczba = strtol(liczba2.c_str(), &endptr, system); if(pierwszy) //jeśli to pierwsza liczba z pliku - będzie nowym MINIMUM { min = liczba; pierwszy = false; } else //jeśli to kolejna liczba z pliku... if(liczba < min) //... i jest mniejsza od dotychczasowego minimum... min = liczba; // ... to nadpisz min }//while eof }// if good return min; } int main(int argc, char** argv) { ofstream fileOut; fileOut.open("wyjscie.txt"); int min1 = minimumZPliku("dane_systemy1.txt", 2); int min2 = minimumZPliku("dane_systemy2.txt", 4); int min3 = minimumZPliku("dane_systemy3.txt", 8); string bin_min1 = dec2bin(min1); string bin_min2 = dec2bin(min2); string bin_min3 = dec2bin(min3); cout<<min1<<" " <<min2<<" " <<min3<<endl <<bin_min1<<" " <<bin_min2<<" " <<bin_min3<<endl; fileOut<< "Stacja 1: " << bin_min1 <<endl << "Stacja 2: "<<bin_min2<<endl <<"Stacja 3: "<<bin_min3<<endl; fileOut.close(); return 0; } |