Witam.
Mój program zczytuje z pliku liczby.txt pojedyncze linijki, a potem rozpoznaje czy jest to zwykły tekst, liczba dziesiętna (dziesiętna w notacji naukowej), dwójkowa, ósemkowa, szesnastkowa.Następnie drukuje je z odpowiednio wraz z tą informacją. Potem zamienia wszystko na system dziesiętny, segreguje te wg wartości w systemie dziesiętnym i drukuje. Program działa, ale mam 1 problem. Jak napisać funkcję (pewnie trzeba użyć jakieś wskaźniki) i jak taką funkcję wywołać, aby wywołać funkcję w 1 linijce, bo teraz to wywołuję funkcję dla każdej komórki struktury pojedynczo, a chciałbym ją wywyłać dla całej tablicy (zresztą widać to w mainie). Chyba wiadomo o co chodzi :)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Liczba {
char tekst[20];
char bity;
int wartosc;
} l[100],a;
int linie=0;
void sortuj(struct Liczba *l){
int i,j,min;
for (i=0; i<linie-1; i++){
min=i;
for (j=i; j<linie; j++)
if (l[j].wartosc<=l[min].wartosc) min=j;
a=l[min];
l[min]=l[i];
l[i]=a;
}
}
// zamiana liczb na system dziesiętny
void dec(struct Liczba *l){
int i=0,r=0,j;
for (j=0; j<=linie; j++){
l[j].wartosc=0;
if(l[j].bity >4){
int podstawa,prefix;
if(l[j].bity == 5) {podstawa=16; prefix=2;}
else if(l[j].bity == 9) {podstawa=8; prefix=1;}
else if(l[j].bity == 17) {podstawa=2; prefix=2;}
int dlugosc = strlen(l[j].tekst);
for (i=dlugosc-1;i>=prefix;i--){
if(l[j].tekst[i]>='a' && l[j].tekst[i]<='f') r+=(l[j].tekst[i] - 'a' + 10) * (pow(podstawa,dlugosc-1-i)); // dla a-f
else if(l[j].tekst[i]>='A' && l[j].tekst[i]<='F') r+=(l[j].tekst[i] - 'A' + 10) * (pow(podstawa,dlugosc-1-i)); // dla "A-F"
else if(l[j].tekst[i]>='0' && l[j].tekst[i]<='9') r+=(l[j].tekst[i] - '0')*(pow(podstawa,dlugosc-1-i)); // dla cyfr
l[j].wartosc=r;
}
}
else if(l[j].bity==3){
int dlugosc = strlen(l[j].tekst);
for (i=0;i<dlugosc;i++){
if(!(l[j].tekst[i]>='0' && l[j].tekst[i]<='9')) {l[j].wartosc=0; r=0; break;}
r+=pow(10,dlugosc-1-i)*(l[j].tekst[i] - '0');
}
if(dlugosc==3) l[j].wartosc=r+1;
else l[j].wartosc=r;
}
else if(l[j].bity==0) l[j].wartosc=0;
}
}
void ZapiszdoPlikuTekstowego(struct Liczba l){
FILE *plik = fopen ("liczby.txt","a");
fprintf (plik, "%s\n",l.tekst);
fclose (plik);
puts ("Tekst zostal zapisany do pliku zapis.txt");
}
void OdczytajzPlikuTekstowego(struct Liczba *l){
int i=0,j=0;
FILE *plik = fopen ("liczby.txt", "r");
char linia [100];
char temp [100];
while(fgets(linia, 100, plik)){
strcpy(temp,linia);
linie++;
int dlugosc = strlen(temp);
for(j=0;j<dlugosc;j++){
if(temp[j]==10) temp[j]=0;
}
strcpy(l[i].tekst,temp);
i++;
}
fclose(plik);
}
void WyswietlLiczbe(struct Liczba *l){
if(l->bity==0) printf("Tekst \"%s\" nie jest liczba.\n",l->tekst);
else if(l->bity==3) printf("%s\tsystem dziesietny\n",l->tekst);
else if(l->bity==5) printf("%s\tsystem szesnastkowy\n",l->tekst);
else if(l->bity==9) printf("%s\tsystem osemkowym\n",l->tekst);
else if(l->bity==17) printf("%s\tsystem dwojkowy\n",l->tekst);
}
void PobierzLiczbe(struct Liczba *l){
int i,spacje=1,dziesietna=1,szesnastkowa=1,osemkowa=1,dwojkowa=1;
l->bity = 0;
int dlugosc = strlen(l->tekst);
// szukanie spacji i Tab //
for (i=0; i<dlugosc; i++)
if(l->tekst[i]==32 || l->tekst[i]==9) spacje = 1;
spacje = 0;
// dziesietne //
int kropka=0,Ee=0,znak=0,pozkropka=0,pozEe=0,pozznak=0;
if((l->tekst[0]=='0' && l->tekst[1]=='0') || (l->tekst[0]=='0' && l->tekst[1]!=0) || l->tekst[0]==0) dziesietna = 0; // tekst musi mieć, jakiś znak i nie mogą to być 2 zera na poczatku
for (i=0; i<dlugosc; i++){
if(l->tekst[i]=='.'){ //liczenie ile kropek i zczytanie jej indeksu
kropka++;
if(kropka==2){// 1 kropka
dziesietna = 0;
break;
}
pozkropka=i;
}
if(l->tekst[i]=='e' || l->tekst[i]=='E'){ //liczenie ile liter "E" lub "e" i zczytanie ich indeksu
Ee++;
if(Ee==2){// 1 znak notacji
dziesietna = 0;
break;
}
pozEe=i;
}
if(l->tekst[i]=='+' || l->tekst[i]=='-'){ //liczenie ile znaków "+" lub "-" i zczytanie ich indeksu
znak++;
if(znak==2){ // 1 znak liczby
dziesietna = 0;
break;
}
pozznak=i;
}
}
if(kropka+Ee+znak==1) dziesietna = 0; // l->tekst ma w sobie 1 znak nie będą cy licbą
else if(Ee+znak==2 && kropka==0){
//może to być liczba z całkowitą podstawą np.: 35E-15
if(pozEe==0 || (pozznak-pozEe)!=1 || pozznak==dlugosc-1) dziesietna = 0;}
else if(kropka+Ee+znak==3){
// może to być liczba z niecałkowitą podstawą np.: 10.67e+2
if(pozkropka==0 || (pozznak-pozEe)!=1 || (pozEe-pozkropka)==1 || pozznak==dlugosc-1 || !((pozznak>pozEe)&&(pozEe>pozkropka))) dziesietna=0;
}
// . nie na początku +/- przed e/E po . jest liczba po +/- jest liczba najpierw . potem e/E oraz +/-
else if(kropka+Ee+znak==0){ //tekst może być zwykłą liczbą
for (i=0; i<dlugosc; i++)
if(!(isdigit(l->tekst[i]))) dziesietna = 0; // sprawdzenie czy występują tylko cyfry "0-9"
}
// szesnastkowe //
if(l->tekst[2]==0 || l->tekst[0]!='0' || !(l->tekst[1]=='X' || l->tekst[1]=='x') || (l->tekst[1]!='X' && l->tekst[1]!='x')) szesnastkowa = 0; //pierwszy znak to "0", drugi znak to "x" lub "X"
for (i=2; i<dlugosc; i++)
if(!isxdigit(l->tekst[i])){szesnastkowa = 0; break;} // pozostałe znaki to cyfry "0-9" lub litery "A-F" lub "a-f"
// ósemkowe //
if(l->tekst[0]!='0' || l->tekst[1]==0) osemkowa = 0; // pierwszy znak to "0", conajmniej 2 znaki
for (i=1; i<dlugosc; i++)
if(!(l->tekst[i]>47 && l->tekst[i]<56)){ // sprawdz czy znaki to cyfry "0-7"
osemkowa = 0;
break;
}
// dwójkowe //
if(l->tekst[0]!='0' || l->tekst[1]!='b' || l->tekst[2]==0) dwojkowa = 0; // pierwszy znak to "0" drugi znak to "b"
for (i=2; i<dlugosc; i++)
if(!(l->tekst[i]=='0' || l->tekst[i]=='1')){ // cyfry "0-1"
dwojkowa = 0;
break;
}
// przydzielanie bitów //
if(spacje==0){
if(dziesietna!=0) l->bity = 3;
else if(szesnastkowa!=0) l->bity = 5;
else if(osemkowa!=0) l->bity = 9;
else if(dwojkowa!=0) l->bity = 17;
}
}
int main(){
int i;
OdczytajzPlikuTekstowego(l);
for (i=0;i<linie;i++){
PobierzLiczbe(&l[i]);
WyswietlLiczbe(&l[i]);
dec(&l[i]);
}
puts("\n\nZapis dziesietny\tliczba\n");
sortuj(l);
for(i=0;i<linie;i++)
if(l[i].wartosc!=0) printf("%d\t\t\t%s\n",l[i].wartosc, l[i].tekst); // nie drukuje liczb w notacji naukowej
printf("\n\nWybierz 1, aby dodac tekst do bazy lub inny klawisz, aby zakonczyc program: ");
int x;
scanf("%d", &x);
if(x==1) {
printf("\nWprowadz dowolny tekst: ");
scanf("%s",l->tekst);
system("pause");
ZapiszdoPlikuTekstowego(l[linie+1]);
}
else system("pause");
return 0;
}