Cześć mam taki problem do rozwiązania otóż jak wczytuje dany plik,txt z zawartością imie,nazwisko,NIP i kwota zawsze wywala błąd że numer NIP jest nie prawidłowy z jak chce odczytać plik rozliczenia.txt to jaką bym kwote nie podał czy na + czy na - daną liczbę to nadal jest błąd proszę o pomoc i wytłumaczenie problemu z góry dziękuje a oto treść zadania
Napisać pomocnicze biblioteki oraz program główny dla następującego zadania:
Centralna Policja Podatkowa raz w roku kontroluje zeznania podatkowe obywateli Fiskustanu. Lista
podatników nazywa się "podatnicy.txt" i zawiera ich dane uporządkowane rosnąco wg nazwiska
i dalej imienia w formacie (kolejne linie):
NIP (10-cyfrowy numer identyfikacji podatkowej)
Nazwisko Imię (oddzielone odstępem)
<pusta linia>
Plik z rozliczeniami podatników nazywa się "rozliczenia.txt" i zawiera liczbę linii zgodną z liczbą
podatników. Każda linia zawiera kwotę rozliczenia odpowiadającego jej podatnika zapisaną
z dokładnością do 2 miejsc dziesiętnych, np.:
195.67
0.00
-312.50
Kwoty rozliczeń mogą być liczbami dodatnimi (niedopłaty podatku), ujemnymi (nadpłaty) lub
zerami (podatek rozliczony). Należy wydrukować do pliku "wyniki.txt" listę zawierającą dane
podatników wraz z odpowiadającymi im kwotami rozliczenia, uporządkowaną malejąco wg
nazwiska i dalej imienia podatnika, w następującym formacie (kolejne linie):
Nazwisko
Imię
NIP (numer identyfikacji podatkowej)
Kwota rozliczenia (zaokrąglona do liczby całkowitej)
<pusta linia>
Wymagania formalne:
Program powinien być zapisany w trzech plikach: kontener.h, dane.h i glowny.cpp (wolno rozbić
kontener na kontener.h i kontener.cpp, podobnie z dane.h i dane.cpp).
W pliku dane.h należy umieścić strukturę implementującą dane przetwarzane w programie,
przechowywane w kontenerze, wraz z odpowiednimi metodami. Tu powinny znaleźć się też
wszystkie pomocnicze funkcje, sprawdzające poprawność danych (na przykład poprawność numeru
NIP). Nie należy umieszczać w tym pliku funkcji formatujących dane do wydruku, ani żadnych
innych funkcji używających operacji wejścia-wyjścia.
W pliku kontener.h należy umieścić strukturę odpowiadającą użytemu abstrakcyjnemu typowi
danych. Można użyć szablonu lub konkretnej struktury z typem elementu odpowiadającym
strukturze zbudowanej w pliku dane.h. Należy umieścić w kontenerze i implementować tylko te
metody, które będą używane w programie głównym. Implementacja nie może zależeć od typu
elementu, powinna działać tak samo po zmianie tego typu na jakikolwiek inny. Nie może też być tu
żadnych operacji wejścia wyjścia ani formatowania wydruku kontenera.
W pliku glowny.cpp umieszczamy program główny korzystający z plików kontener.h i dane.h oraz
funkcje formatujące wydruk i inne funkcje korzystające z operacji wejścia-wyjścia.
Niedozwolone jest korzystanie z kontenerów i algorytmów z biblioteki standardowej C++.
Zapisu do pliku wynikowego nie wolno rozpocząć przed odczytaniem całości plików
wejściowych.
Dodatkowe punkty:
Za obsługę wejścia odporną na błędy użytkownika i za poprawne komentarze, w tym w
bibliotekach pomocniczych: cel funkcji, warunki wstępne, warunki końcowe, sytuacje wyjątkowe
i ewentualnie zwracany wynik, przyznawane będą dodatkowe punkty. Obsługa wejścia odporna na
błędy użytkownika powinna wyglądać następująco:
• w przypadku gdy niepoprawne są dane podatnika (czyli nieprawidłowość wystąpiła w pliku
podatnicy.txt), podatnik ten nie jest wpisywany do plik wynikowego, a odpowiadająca mu
linia w pliku rozliczenia.txt jest pomijana,
• w przypadku gdy dane podatnika są poprawne, a niepoprawna jest kwota rozliczenia (czyli
nieprawidłowość wystąpiła w pliku rozliczenia.txt), podatnik jest wpisywany do pliku
wynikowego, przy czym zamiast kwoty rozliczenia pojawia się adnotacja „
DOWERYFIKACJI”.
Kolejne punkty podwyższające ocenę można uzyskać zapewniając w programie obsługę
nieograniczonej liczby podatników zapisanych w plikach wejściowych oraz obsługę wielu imion
podatników podanych z odstępami w linii za nazwiskiem.
Dodatkowe punkty będą również przyznane za weryfikację poprawności numeru NIP. Ostatnia,
dziesiąta cyfra NIP jest cyfrą kontrolną obliczaną według poniższego algorytmu:
1. Pomnożyć każdą z pierwszych dziewięciu cyfr odpowiednio przez wagi: 6, 5, 7, 2, 3, 4, 5, 6, 7.
2. Zsumować wyniki mnożenia.
3. Obliczyć resztę z dzielenia przez 11 – powinna być ona zgodna z cyfrą kontrolną.
NIP jest tak generowany, aby nigdy w wyniku tego dzielenia nie wyszła liczba 10.
a to moje rozwiązanie
nip.h
#ifndef NIP_H_INCLUDED
#define NIP_H_INCLUDED
#include<iostream>
#include<fstream>
#include<sstream>
#include<cstdlib>
#include<exception>
#include<stdexcept>
using namespace std;
struct Podatnik
{
private:
string nazwisko;
string imie;
string NIP;
string kwota;
public:
Podatnik(string naz=" ",string im=" ",string p=" ",string k="0.0")
{
nazwisko=naz;
imie=im;
NIP=p;
kwota=k;
}
void wstawPodatnika(string a,string b,string c,string d)
{
nazwisko=a;
imie=b;
NIP=c;
kwota=d;
}
void wypiszPodatnika()
{
cout<<imie<<" "<<nazwisko<<" "<<NIP<<" "<<kwota<<" ";
}
void zapisDoPliku()
{
bool czyPoprawne=false;
for(int i=0;i<2;i++)
{
if(czyPoprawne==true)
{
string a="podatnicy.txt";
fstream plik;
plik.open(a.c_str(),ios::out|ios::app);
plik<<imie<<" "<<nazwisko<<" "<<NIP<<endl;
plik.close();
}
if(kwota[i]<0)
{
string a="rozliczenia.txt";
fstream plik;
plik.open(a.c_str(),ios::out|ios::app);
plik<<"Do weryfikacji: "<<kwota<<endl;
plik.close();
}
}
}
};
struct Lista{
private:
struct Node{
Podatnik dane;
Node*nast;
Node(Podatnik d,Node*N=nullptr)
{
dane=d;
nast=N;
}
};
Node*pocz;
int ileJest;
public:
Lista()
{
pocz=nullptr;
ileJest=0;
}
~Lista()
{
Node*nowy=pocz;
while(nowy!=nullptr)
{
Node*szuk;
szuk=nowy->nast;
delete nowy;
nowy=szuk;
}
}
void wypisz()
{
Node*nowy=pocz;
while(nowy!=nullptr)
{
nowy->dane.wypiszPodatnika();
nowy=nowy->nast;
}
}
void wstaw(Podatnik p)
{
Node*nowy;
nowy=new Node(p);
if(pocz==nullptr)
{
pocz=nowy;
return;
}
else
{
Node*szuk=pocz;
while(szuk->nast!=nullptr)
{
szuk=szuk->nast;
}
szuk->nast=nowy;
}
ileJest++;
}
void zapisz()
{
Node*nowy=pocz;
while(nowy!=nullptr)
{
nowy->dane.zapisDoPliku();
nowy=nowy->nast;
}
}
};
#endif // NIP_H_INCLUDED
main.cpp
#include"nip.h"
#include<iostream>
#include<fstream>
#include<sstream>
#include<cstdlib>
#include<exception>
#include<stdexcept>
#include<string>
using namespace std;
bool sumaKontrolna(string nip)
{
int pomoc=0,suma=0;
int pomocnicza[9]={6, 5, 7, 2, 3, 4, 5, 6, 7};
for(int i=0;i<=9;i++)
{
pomoc=nip[i]*pomocnicza[i];
suma+=pomoc;
pomoc=0;
}
if(suma%11!=10)
{
return true;
}
else
{
return false;
}
}
class Error{
public: string co;
};
class ErrorNIP{
public:string co;
};
class ErrorNaz{
public: string co;
};
class ErrorIm{
public: string co;
};
class Errorkwota
{
public:string co;
};
int main()
{
string nazwa;
cout<<"Podaj nazwe pliku: "<<endl;
cin>>nazwa;
Podatnik p;
Lista l;
try{
ifstream plik;
plik.open(nazwa.c_str(), ios::in);
if(!plik.good())
{
throw logic_error("Plik nie dziala");
}
string linia;
while(getline(plik,linia))
{
try{
int wartosc;
if(linia.length()<=11)
{
Error e;
e.co=linia;
throw e;
}
while((wartosc = linia.find('-'))!=-1)
{
linia.erase(wartosc,1);
}
string a = linia.substr(11,linia.length());
string b = linia.substr(5,linia.length());
string c = linia.substr(0,10);
string d = linia.substr(linia.length());
if(c.length()<10 || c.length()>10)
{
ErrorNIP e;
e.co = linia;
throw e;
}
for(int i=0;i<=9;i++)
{
if(c[i]<'0' || c[i]>'9')
{
ErrorNIP e;
e.co = linia;
throw e;
}
}
if(sumaKontrolna(c)==false)
{
ErrorNIP e;
e.co = linia;
throw e;
}
if(d.length()<-1)
{
Errorkwota e;
e.co = linia;
throw e;
}
p.wstawPodatnika(a,b,c,d);
l.wstaw(p);
}
catch(Error const &e)
{
cout<<"Blad"<<e.co<<endl;
}
catch(ErrorNaz const &e)
{
cout<<"Nazwisko sie nie zgadza"<<e.co<<endl;
}
catch(ErrorIm const &e)
{
cout<<"imie sie nie zgadza"<<e.co<<endl;
}
catch(ErrorNIP const &e)
{
cout<<"NIP jest niepoprawny "<<e.co<<endl;
}
catch(Errorkwota const &e)
{
cout<<"Do weryfikacji "<<e.co<<endl;
}
}
l.wypisz();
l.zapisz();
plik.close();
}
catch(exception &e)
{
cout<< e.what()<<endl;
}
return 0;
}