[C++] FUnkcje i pliki nagłówkowe h

herfoo
Użytkownik
Użytkownik
Posty: 103
Rejestracja: 10 paź 2006, o 21:36
Płeć: Mężczyzna
Lokalizacja: Iłża
Podziękował: 4 razy
Pomógł: 21 razy

[C++] FUnkcje i pliki nagłówkowe h

Post autor: herfoo »

Witam. Moim zadaniem było wykonanie programu analizującego tekst no i ten program miał wg zaleceń przedmiotu zostać podzielony na moduły dla czytelności. Moje pytanie brzmi po co sa pliki nagłówkowe h czy byłby mi ktoś w stanie wyjaśnić to łopatologicznie

TO jest plik h odnoszący się do funkcji

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;

struct Salfa
{ 
       char litera;
       int ile;
       Salfa *nast;
};     

void fglowna();
void sprawdzaj(string &dane);
void wczytaj(Salfa *&pierwszy);
void ile_lit(Salfa *pierwszy, string dane);
void drukuj (Salfa *pierwszy);
void zapisz (Salfa *pierwszy);
void usuwanie (Salfa *pierwszy);
A to plik cpp odnoszący się do funkjci

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string.h>
#include <ctype.h>
using namespace std;

#include "funkcje.h"

void fglowna()
{
     
     
    string dane;
    sprawdzaj(dane);
    Salfa *pierwszy;

     
    wczytaj(pierwszy);
    ile_lit(pierwszy, dane);
    drukuj(pierwszy);
    zapisz(pierwszy);
    usuwanie(pierwszy);

    cout<<endl;
    

 }
//-------------------------------------------------------------------
//funkcja wczytujaca po kolei litery z pliku(az do konca pliku)
// alfabet i tworzaca z nich liste jednokierunkowa 
void sprawdzaj(string &dane){

     ifstream plik;
     do {
     
       cout << "Podaj nazwe istniejacego pliku z danymi: " ;
       cin >> dane; 
      
       plik.open(dane.c_str() );
       if (!plik. is_open() ) 
          plik. clear(); 
    } while (!plik.is_open());
}
    
void wczytaj(Salfa *&pierwszy)
{
     
     ifstream plik("alfabet.txt");
     Salfa *ost,*akt;
     ost=akt=NULL;
     //wczytuje plik z literami ktorych ma szukac
  
     while(!plik.eof())
     {
                       ost=akt;
                       akt = new Salfa;
                       plik>>akt->litera;
                       akt->ile = 0;
                       akt->nast=NULL;
                                if(ost==NULL){
                                              pierwszy=akt;
                                              }
                                else ost->nast=akt;
     }
     plik.close();
}
//funkcja wczytujace po kolei litery z pliku wejsciowego i zliczajca przy 
//uzyciu listy stworzonej przez funkcje "wczytaj" czestotliwosc wystepowania 
//danych liter
void ile_lit(Salfa *pierwszy, string dane)
{
     Salfa *akt;
     string wiersz;
     ifstream plik;
 
     plik.open(dane.c_str() );
       
     akt=pierwszy;
     while(!plik.eof())
     {
            getline (plik,wiersz);
            
            for (int i=0;i<wiersz.length(); i++)
            {
           
               akt=pierwszy;
               while(akt!=NULL)
               {     
                         if(wiersz[i]==akt->litera)
                             {
                             akt->ile++;
                             }
                         akt=akt->nast;
               }
            }
     }

}
        

void drukuj (Salfa *pierwszy)
{
     cout<<"Litera"<<" "<<"ile"<<endl;
     while (pierwszy!=NULL)
     {
           cout<<pierwszy->litera<<"	"<<pierwszy->ile<<" "<<endl;
           pierwszy=pierwszy->nast;
     }
}  
//funckja zapisujaca liste do pliku wynikowego
void zapisz (Salfa *pierwszy)
{
     Salfa *akt;
     akt=pierwszy;
     string nazwazapisu;
     cout<<"podaj nazwę pliku do zapisu

";
     cin>>nazwazapisu;
     ofstream plik(nazwazapisu.c_str());
     plik<<"litera:	"<<"ile:
";
     while(akt!=NULL)
                     {
                     plik<<akt->litera<<"	"<<akt->ile<<"
";
                     akt=akt->nast;
                     }
};             
//----------------------------------------------------------------
void usuwanie (Salfa *pierwszy)
{
     Salfa *akt;
     while(pierwszy!=NULL)
     {
     akt=pierwszy;
     pierwszy=pierwszy->nast;
     delete akt;
     }
};
więc tak naprawde całą deklaracje funkcji mam w pliku cpp. Również parametry są zadeklarowane w pliku cpp po co jest więc plik h? Nie rozumiem jego zastosowania proszę o wytłumaczenie łopatologiczne ponieważ wiem, że musi być a tak naprade nie wiem po co:)

-- 5 czerwca 2011, 19:05 --

dorzucam jeszcze jedno pytanie w funkcji sprawdzaj mam coś takiego zwanego referencją

void(string &dane) moje pytanie brzmi dlaczego ten parametr musi być zapisany właśnie w ten sposób?
Ostatnio zmieniony 5 cze 2011, o 20:46 przez Afish, łącznie zmieniany 1 raz.
Powód: A znaczniki [code] kto doda?
void_t
Użytkownik
Użytkownik
Posty: 103
Rejestracja: 14 maja 2011, o 18:25
Płeć: Mężczyzna
Pomógł: 26 razy

[C++] FUnkcje i pliki nagłówkowe h

Post autor: void_t »

Nie jest Ci potrzebny plik nagłówkowy - nie w każdym przypadku. Zauważ jednak, że w pierwszej funkcji masz wywołanie

Kod: Zaznacz cały

sprawdzaj(dane);
a wcześniej deklaracji funkcji sprawdzaj() nie byłoby, gdyby nie Twoj plik nagłówkowy.

Program nie skompilowałby się, bowiem kompilator nie znałby takiej funkcji (pomimo, że ona tkwi kilkanaście linijek niżej). Dołączając jednak nagłówek, kompilator wie, że deklaracja funkcji implikuje jej późniejszą definicje, więc posłusznie kompiluje program. (oczywiście równie dobrze mógłbyś deklaracje funkcji umieścić na początku w pliku cpp).

Odnośnie drugiego pytania: .
Dokładniej nawiązując do Twojego przykładu: dzięki tej referencji, instrukcje wewnątrz funkcji mogą zapisywać do obiektu klasy string informacje.

Swoją drogą piszesz, że program miał być podzielony na moduły dla czytelności? W tej chwili jednak jej brakuje. Niepotrzebnie dołączasz 2 razy to samo w nagłówku i pliku cpp.

PS. Umieszczaj kody źródłowe w tagach [ code ]
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] FUnkcje i pliki nagłówkowe h

Post autor: Afish »

Nagłówki po pierwsze zwiększają czytelność kodu, umożliwiają oddzielenie definicji od deklaracji (dzięki czemu możesz komuś dać swoją klasę do użytku, a nie dawać kodu, chociażby ze względów bezpieczeństwa), ułatwiają zarządzanie kodem (brak konieczności wielokrotnego deklarowania klas, funkcji itp).
ODPOWIEDZ