Witam,
Dostałem ponizsze zadanie do wykonania, niestety mam problem z zaimplementowaniem w kodzie Listy, przy wykorzystaniu biblioteki STL będę wdzieczny za wszelką pomoc.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *p1=NULL; //wskoaźnik/tabela 1
char *p2=NULL; //wskaźnik 2
char *p3=NULL; //itd.
//----------Zliczanie ile jest liczb i sprawdzanie czy to tylko liczby
int zliczanie(char* nazwa){ //funkcja zliczająca ilość cyfr w pliku
FILE *plik=NULL;
if((plik=fopen(nazwa,"rb"))==NULL){ //otwieranie sprawdzanie czy taki plik istnieje
printf("Brak pliku wejsciowego o podanej nazwie");
return -1;
}
unsigned char buffor[1]; //buffor do chwilowego przechwytywania liczb
int licznik=0;
while((fread(buffor,sizeof(unsigned char),1 ,plik))==1){
licznik+= 1;
if(*buffor<'0'||*buffor>'9'){ //sprawdzaine czy plik zawiera tylko liczby
printf("Dzialanie nie zostanie wykonane, plik nie zawiera liczby");
return -1; //jesli jest cos zle to zwraca -1
}
}
return licznik;
}
//-----tworzenie tabeli do przechwytywania z pliku, cyfry zapisuja sie od konca----------
void tworzenie_tabeli(char* nazwa,int x,int a){
FILE *plik=NULL;
if((plik=fopen(nazwa,"rt"))==NULL){ //znowu otwieranie pliku ze sprawdzeniem
printf("Brak pliku wejsciowego o podanej nazwie");
}
char tab[x]; //tabela d przechwytywania
p1=(char*)malloc(x*sizeof(char)); //alokowanie pamieci dla tabeli
int i;
for(i=0;i<a;i++){
fseek(plik, -(i+1), 2); //cyfry pobieraie od konca
*(tab+i)=fgetc(plik); //przechwytywanie do tabeli
*(tab+i)-=48; //pobranie liczby s w kodzie ASCII wiec trzeba odjac 48 (zero to 48)
}
for(i=a;i<x;i++){ //reszta jest wypełniania zerami
*(tab+i)=0;
}
for(i=0;i<x;i++){ //funkcja pomocnicza do srawdzenie poprawnego zapisu
printf("tab+%d=%d\n",i,*(tab+i));
}
strcpy(p1,tab); //przepisywanie z tablei do tabeli...inaczej wywala bład
}
//-----To jest stos, algorytm pierwotnie zadany do zrobienia----
int stos(int x,char* p3,char* p2, char* nazwa){
int i=0;
int stos[x]; //tabela - stos
int przenies=0;
for(i=0;i<x;i++){
printf("%d ",p3[i]);//pomocniczo wyswietla
printf("%d\n",p2[i]);//pomocniczo wyswietla czy wszystko okey
//printf("%d\n",przenies);
stos[i]=p3[i]+p2[i]+przenies; //suma cyfr z dwóch tabel i ewentualnego przenienienia
if(stos[i]>=10){ //jesli byloby przeniesienie, czyli suma cyfr >=10
stos[i]-=10;//aby zostały same jednostki
przenies=1;// czy dodawaniu dwóch cyf maksymalni przeniesienie wynosi 1
}
else
przenies=0;//jesli suma cyfr nie jest >=10
}
//-------Wyswietlanie: POP (usuwanie elementówod ostatnio dodanego) ze Stosu------------------
FILE *plik=NULL;
if((plik=fopen(nazwa,"wt"))==NULL){ //otwieranie pliku do ktorego jest zapisywany wynik
printf("Brak pliku wejsciowego o podanej nazwie");
return 0;
}
for(i=(x-1);i>=0;i--){ //zapisywanie o tyłu tabeli,
fprintf(plik,"%d",stos[i]);
printf("%d",stos[i]);
}
return 0;
}
int main() { //stos= last in, first out
char *nazwa1="D://WE1.txt";
char *nazwa2="D://WE2.txt";
char *nazwa3="D://WY1.txt";
//--------------TABLICA-----------------------
int a=zliczanie(nazwa1);//zliczanie WE1
if(a==-1)
return -1;
int b=zliczanie(nazwa2); //zlizanie WE2
if(b==-1)
return -1;
int z=(a>b)?a:b; //jezeli a>b to z=a w przeciwnym prypadku z=b
z+=1; //bo rzad dodawania moze byc o jeden wiekszy niz najdłuższa liczba
tworzenie_tabeli(nazwa1,z, a); //tworzenie tabeli1
p3=(char*)malloc(z*sizeof(char));
strcpy(p3,p1);
tworzenie_tabeli(nazwa2,z,b); //tworzenie tabeli2
p2=(char*)malloc(z*sizeof(char));
strcpy(p2,p1);
int c=(a>b)? (p2[(z-1)])=0: (p3[(z-1)]=0); //to musiała zrobic zeby byly wszyskie zera na końcu
int p=stos(z,p3,p2,nazwa3);
if(p==-1)
return -1;
return 0;
}
Zaprojektuj algorytm i napisz program, który umożliwia dodawanie dowolnie dużych liczb przy wykorzystaniu struktury stosu.
Stos zaimplementuj jako Tablice
Stos zaimplementuj jako Liste (biblioteka STL)
Dane wejściowe:
Plik nazwie WE1.TXT zawierający pierwszy składnik.
Plik nazwieWE2.TXT zawierający drugi składnik.