Skocz do zawartości
wragler

Progr. W C -wczytywanie Danych Z Pliku Do Tablicy

Rekomendowane odpowiedzi

WItam

Mam problem z praca na zaliczenie i potrezbuje pomocy i to naprawde szybko:).

Musze napisac program wczytujacy dane z pliku(kilkaset pozycji) i sortowanie ich a nastepnie wyswietlenie pososrtowanych danych w pliku. Wiem ze trezba operowac na tablichac. TYlko jak wczytac dane z pliku do tablicy i na nich operowac??

Z gory dziekuje za pomoc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Napisałem kawałek program który ma za zadni czytac z plika zawierajacego 10 andych liczbowych ulozonych w kolumnie i ma za zadnie zapisaywac je do tablicy a;e kompletnie zle dziala.Prosze o porade jak to naprawic.

 

#include<stdio.h>

main()

{

FILE *plik_we;

int i;

double a[10];

plik_we=fopen("wyniki.txt","r");

i=0;

while(!feof(plik_we))

{

fscanf(plik_we,"%lf", &a);

printf("\n");

printf("%d \n",a);

i++;

}

fclose(plik_we);

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzieki , ale do konca nie jest jeszcze super. Liczbe 12 nie wczytuje mi poprawnie:( a jak mam zrobic aby wczytywac liczby zmiennoprzecinkowe? albo jak utorzyc tablce ktora bedzie tworzona dynamicznie pod ilosc danych w pliku. tzn np 320 danych liczbowych w pliku i tablica utpoworzy sie 320 elementowa?

Z tej stronki nie moge niestey korzystac poniewaz zle mi ja wyswietla i literki sa za male i zupelnie nieczytelne.

Wprowadzilem do jeszcze niezupelnei dobrego programu modol sortujacy aby elemty tej tablicy zostaly posortowane ale niestety nie dziala.

 

#include<stdio.h>

#include<conio.h>

void swap(int a[], int i, int j);

void Bubblesort(void)

{

int i,p,przestawienie,N=13;

p=N-1;

do

{

p--; przestawienie=0; /*wartość domyślna*/

for(i=0;i<=p;i++)

if(*(a+i)>*(a+i+1))

{

swap(a,i,i+1);

przestawienie=1;

}

}while(przestawienie);

}

 

void swap(int a[], int i, int j)

{

int t;

t=*(a+i);

*(a+i)=*(a+j);

*(a+j)=t;

}

main()

{

FILE *plik_we;

int i,k;

double a[13];

plik_we=fopen("wyniki.txt","r");

i=0;

while(!feof(plik_we))

{

fscanf(plik_we,"%ld", &a[k]);

i++;

k++;

}

Bubblesort();

for(k=0;k<=13;k++)

printf("%d ",a[k]);

fclose(plik_we);

getch();

}

Edytowane przez wragler

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

OMG :mur:

 

1. Mi wczytuje każdą liczbę całkowitą.

2. Aby mieć dynamiczną tablicę, musiałbyś 2 razy przelatywać przez plik: raz przy zliczaniu elementow, potem utworzenie tablicy, potem drugi raz, aby wczytać. Ewentualnie użyć tablicy tymczasowej.

3. Ze stroną to mogę Ci zasugerować:

- zmianę przeglądarki na FF

- zwiększenie rozmiaru czcionki (każda przeglądarka ma taką opcję)

- zmniejszenie rozdzielczości ekranu

4. Regulamin po raz drugi! Gdy podajesz kod, to w znacznikach PHP!

5. Z liczbami niecałkowitymi są 3 zmiany:

PHP
float a[10];

..

fscanf(plik_we,"%f", &a);

..

printf("%f \n",a);

 

6. Sortowanie:

PHP
void sortuj(int i_el, int *tab1)

{

int zmiana=0, temp, i;

do

{

zmiana=0;

for(i=1;i<i_el;i++)

if(*(tab1+i-1)>*(tab1+i))

{

temp=*(tab1+i);

*(tab1+i)=*(tab1+i-1);

*(tab1+i-1)=temp;

zmiana++;

}

}while(zmiana>0);

1 parametr to rozmiar tablicy

2 parametr to wskaźnik tablicy do sortowania

Edytowane przez ULLISSES

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Przepraszam za moja natarczywosc ale w jaki sposob moge zaadoptowac te sortowanie do moje programu . Przed wywolaniem funkcji main umieszczam przeslane przez Ciebie sortowanie w atkiej postacji jak zamiesciles w poscie? Juz w w funkcji main po wczytaniu i umieszczeniu danych z pliku w tablicy wywoluje funkcje sortowanie z parametrami 1- wielkosc tablicy, a drugi - tu za bardzo nie wiem o co chodzi:) - sorka za to ale w mojej szkole poziom nauczania nie jest za wysoki:).Z pomoc bede dozgonnie wdzieczny.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Są 3 sposoby:

1. Najlepszy - zmienić troche Twój program, aby działała tablica na wskaźnikach.

2. Najgorszy - wrzucic kod funkcji sortowania do main().

3. Najbardziej odpowiedni - zrobić tablicę globalną i zmienić odwołania przez wskaźniki na odwołania proste.

 

Wybierając sposób 3 mamy:

1. Po "inkludach" dodajesz:

PHP
float a[10];

Tablica staje się zmienną globalną (widzianą w całym programie).

 

2. Modyfikacja funkcji sortowania:

PHP
void sortuj(int i_el)

{

int zmiana=0, temp, i;

do

{

zmiana=0;

for(i=1;i<i_el;i++)

if(tab1[i-1]>tab1)

{

temp=tab1;

tab1=tab1[i-1];

tab1[i-1]=temp;

zmiana++;

}

}while(zmiana>0);

2 parametr jest nie potrzebny, gdyż funkcja "widzi" tablicę. Funkcje bubble() i swap() są w tym momencie zbędne - zastąp je przez tą opisaną wyżej.

 

@ayem:

Ano, masz rację.

Nie wyspałem się i myślę.. z przerwami :)

Edytowane przez ULLISSES

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Widze ze mam do czynienia z Forumowiczami naparwde znajocymi sie na rzeczy. Ja sie czuje jednak bardzo glupio bo nie rozumiem do konca tego co mi napisaliscie.Ja zrobilem to tak - wiem ze to jest zle ale nie umiem sobie z tym poradzic.A jest jzu blisko, tak mi sie zdaje przynajmniej:).Napewno gdybym mial wiecej czasu to sam bym wiecej zrobil nic obecnie.Ale mam dostep tylko przez dwa dni do komputera i musze to zrobic do jutra...Mysle ze mnie zrozumiecie. :unsure:

#include<stdio.h>#include<conio.h>float a[13];void sortuj(int i_el){int zmiana=0, temp, i;do{zmiana=0;for(i=1;i<i_el;i++)if(tab1[i-1]>tab1[i]){temp=tab1[i];tab1[i]=tab1[i-1];tab1[i-1]=temp;zmiana++;}}while(zmiana>0);main(){FILE *plik_we;int p;float a[13];plik_we=fopen("wyniki.txt","r");p=0;while(!feof(plik_we)){fscanf(plik_we,"%f", &a[p]);sortuj(13);printf("\n");printf("%f \n",a[p]);p++;}fclose(plik_we);getch();}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sorki... Zgubiłem coś - po:

PHP
}while(zmiana>0);

powinien być jeszcze 1 nawias zamykający (klamrowy): }

 

No i sortowanie trzeba wywołać po wczytaniu tablicy w main():

PHP
sortuj(x);

Gdzie x to liczba elementów tablicy.

A potem jeszcze raz samo wyświetlanie elementów tablicy w pętli.

 

BTW:

Gotowce to nie jest sposób na naukę...

Edytowane przez ULLISSES

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program juz prawie dziala tylko ze zle sortuje a praktycznie to wcale nie ortuje , poajwiaja sie jakies glopoty.Ale jeszcze jedna podpowiedz i mysle ze program bedzie smigac:)

Nie wiem czy dobrze zrobilem ale w funkcji sortowania byla niezadeklarowna zmienna tab1 i zamienialem ja na zmienna tablicy a[].Pozaatym nie wiem czy miejsce wstawienia funcji sortuj w mainie jest dobre>..

#include<stdio.h>#include<conio.h>float a[13];void sortuj(int i_el){int zmiana=0, temp, i;do{zmiana=0;for(i=1;i<i_el;i++)if(a[i-1]>a[i]){temp=a[i];a[i]=a[i-1];a[i-1]=temp;zmiana++;}}while(zmiana>0);}main(){FILE *plik_we;int p;plik_we=fopen("wyniki.txt","r");p=0;while(!feof(plik_we)){fscanf(plik_we,"%f", &a[p]);sortuj(13);printf("\n");printf("%f \n",a[p]);p++;}fclose(plik_we);getch();}
Edytowane przez wragler

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Moge ci dać kod jeżeli liczbymogą być zapisane w pliku binarnym (nie z rozszeżeniem *.txt tylko *.dat ) i pierwsza liczba to będzie ilość liczb w pliku.

1490628[/snapback]

Taki program tez by mi sie przydal, ale ten z ktorym pomaga mi ULLISSES tez skoncze.

Pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. Sortujesz liczby niecałkowite, a zmienna temp jest typu całkowitego.

2. Sortuj nie może sie wykonywać przed załadowaniem całej tablicy, a tym bardziej w pętli.

3. Powinno być:

#include<stdio.h>#include<conio.h>float a[13];void sortuj(int i_el){int zmiana=0, i;float temp;do{zmiana=0;for(i=1;i<i_el;i++)if(a[i-1]>a[i]){temp=a[i];a[i]=a[i-1];a[i-1]=temp;zmiana++;}}while(zmiana>0);}main(){FILE *plik_we;int p;plik_we=fopen("wyniki.txt","r");p=0;printf("Tablica załadowana:\n");while(!feof(plik_we)){fscanf(plik_we,"%f", &a[p]);printf("\n");printf("%f \n",a[p]);p++;}fclose(plik_we);sortuj(13);printf("Tablica posortowana:\n");for(p=0,p<13;p++)printf("%f \n",a[p]);getch();}

Lekka modyfikacja, która czyta z 1 wiersza ilość liczb wpisywanych do tablicy:

main(){FILE *plik_we;int p, n;plik_we=fopen("wyniki.txt","r");fscanf(plik_we,"%f", n);printf("Tablica załadowana:\n");for(p=0;p<n;p++){fscanf(plik_we,"%f", &a[p]);printf("\n");printf("%f \n",a[p]);}fclose(plik_we);sortuj(n);printf("Tablica posortowana:\n");for(p=0,p<n;p++)printf("%f \n",a[p]);getch();}

BTW:

Używam CODE, bo PHP i tak nie koloruje składni.. :|

Edytowane przez ULLISSES

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. Sortujesz liczby niecałkowite, a zmienna temp jest typu całkowitego.

2. Sortuj nie może sie wykonywać przed załadowaniem całej tablicy, a tym bardziej w pętli.

3. Powinno być:

#include<stdio.h>#include<conio.h>float a[13];void sortuj(int i_el){int zmiana=0, i;float temp;do{zmiana=0;for(i=1;i<i_el;i++)if(a[i-1]>a[i]){temp=a[i];a[i]=a[i-1];a[i-1]=temp;zmiana++;}}while(zmiana>0);}main(){FILE *plik_we;int p;plik_we=fopen("wyniki.txt","r");p=0;printf("Tablica załadowana:\n");while(!feof(plik_we)){fscanf(plik_we,"%f", &a[p]);printf("\n");printf("%f \n",a[p]);p++;}fclose(plik_we);sortuj(13);printf("Tablica posortowana:\n");for(p=0,p<13;p++)printf("%f \n",a[p]);getch();}

Lekka modyfikacja, która czyta z 1 wiersza ilość liczb wpisywanych do tablicy:

main(){FILE *plik_we;int p, n;plik_we=fopen("wyniki.txt","r");fscanf(plik_we,"%f", n);printf("Tablica załadowana:\n");for(p=0;p<n;p++){fscanf(plik_we,"%f", &a[p]);printf("\n");printf("%f \n",a[p]);}fclose(plik_we);sortuj(n);printf("Tablica posortowana:\n");for(p=0,p<n;p++)printf("%f \n",a[p]);getch();}

BTW:

Używam CODE, bo PHP i tak nie koloruje składni.. :|

1490808[/snapback]

Dziekuje bardzo program dziala!!! Jeszcze tylko wczytanie tych danych do pliku ale z tymn mysle ze sobie sam poradze. Naprawde jeste bardzo wdzieczny.

Jeszcze raz dziekuje za pomoc i pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program dziala, i po moich lekkich modyfikachach zapisuje do pliku. Ale zawiesza mi sie dla tablicy o 41 elementach. Tablica jest dosc dluga ale ja tutaj zamieszcze:

350,5736 0,700255810,9877 6,31389360,5878 0,726554 820,9903 7,11548370,6018 0,753653 830,9925 8,14437380,6157 0,781352 840,9945 9,5144 6390,6293 0,809851 850,9962 11,43015400,6428 0,839150860,9976 14,30074410,6561 0,869349 870,9986 19,08113420,6691 0,900448 880,9994 28,63632430,6820 0,932547 890,9998 57,29001440,6947 0,965746 901,0000 450,7071 1,000045
A oto program narzie w wersji bez odczytywania ilosci danych.:

#include<stdio.h>#include<conio.h>float a[41];void sortuj(int i_el){int zmiana=0, i;float temp;do{zmiana=0;for(i=1;i<i_el;i++)if(a[i-1]>a[i]){temp=a[i];a[i]=a[i-1];a[i-1]=temp;zmiana++;}}while(zmiana>0);}main(){FILE *plik_we;FILE *plik_wy;int p;plik_we=fopen("wyniki.txt","r");p=0;printf("Tablica załadowana:\n");while(!feof(plik_we)){fscanf(plik_we,"%f", &a[p]);printf("\n");printf("%f \n",a[p]);p++;}fclose(plik_we);plik_wy=fopen("wynikipos.txt","w");sortuj(41);printf("Tablica posortowana i zapisana do pliku \n");for(p=0;p<41;p++)fprintf(plik_wy,"%f \n",a[p]);fclose(plik_wy);getch();}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...