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.
}

Pliki do pobrania

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;
}