![Forum ::BIOTECHNOLOGIA:: Strona Główna](http://picsrv.fora.pl/subSilver/images/logo_phpBB.gif) |
::BIOTECHNOLOGIA:: Forum studentów kierunku biotechnologia Politechniki Śląskiej
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Kreskuffka
Dołączył: 11 Lis 2005
Posty: 139
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: Gliwice BioCh/2
|
Wysłany: Sob 21:31, 06 Sty 2007 Temat postu: Informatyka - zadania z plików |
|
|
mam pytanie i prośbe do ludzi madrzejszych ode mnie z programowania: czy ktoś z was zrobił może zadanie 6 z listy dotyczacej plików (zadanie z histogramem), a jesli tak to czy mógłby się podzielic z resztą tą cenna wiedzą umieszczajac kod programu i jakis objasniający komentarz? z góry dziekuje w imienu wszystkich mniej obeznanych w c
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Michele
Dołączył: 15 Sty 2006
Posty: 1041
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: BioAut, Gleiwitz-Petersdorf
|
Wysłany: Sob 23:56, 06 Sty 2007 Temat postu: |
|
|
Tutaj jest sporo błędów. Ostateczna wersja została na PC na polsl. Za błędy przepraszam. Aha wersja rozszeżona o wykreślanie histogramów...
Co się stanie jak damy jeden przedział? A może dwa i jedną daną. To chyba właśnie były te błędy, chodź mogą być inne - nie pamiętam.
Ale mam nadzieję, że sama zrobisz wzorując się: Kod: | #include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int main()
{
FILE *we;
we=fopen("dane.txt","rt");
int tablica[10]={0,0,0,0,0,0,0,0,0,0},N,il_max=0;
float max,min,skok,read;
printf("Podaj liczbę N<10: ");
scanf("%d",&N);
fscanf(we,"%f", &max); //aby mieć zakres histogramu...
min=max;
for (int k=0;k<2;k++)
{fseek (we,0,SEEK_SET); //komenda przesuwa na początek pliku nasz "kursor",aby czytać od początku
while (!feof(we)) //zliczenie zadania
{fscanf(we,"%f", &read);
if (k==0)
{ if (read>max) max=read;
if (read<min) min=read;
if (N>1) skok=float(max-min)/float(N-1);
else skok=2*(max-min);}
if (k==1)
for (int i=0;i<N;i++)
if ((read>=min+i*skok-skok*0.5)&&(read<min+i*skok+skok*0.5))
{tablica[i]++;
if ((i==0)||(tablica[i]>il_max)) il_max=tablica[i];}
}
}
for (int i=0;i<N;i++)
printf("W przedziale <%4.2f;%4.2f> czestosc wynosi %d\n",min+i*skok-skok*0.5,min+i*skok+skok*0.5,tablica[i]++);
int wys_max=14;
if (il_max<wys_max) wys_max=il_max;
float kostka=il_max/float(wys_max);
printf("\n\nHistogram: gdzie # zawiera do %f zliczen opartym na przedziale %f\n\n",kostka,skok);
for (int wys=wys_max;wys>0;wys--)
{ for (int i=0;i<N;i++)
if ((float(tablica[i]/kostka))>wys)
printf("#");
else
printf(" ");
printf("\n");}
fclose(we);
system("PAUSE");
return 0;
} |
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
adalgrim
Starosta grupy AU (2rok)
Dołączył: 05 Lis 2005
Posty: 380
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: RAu
|
Wysłany: Nie 17:54, 07 Sty 2007 Temat postu: |
|
|
moja wersja też została na polibudzie, ale ja nie miałem błędów z histogramem. Wystarczy trochę zakombinować
Otóz zrobić tablice dla przedziałów chyba 10 elementow jak sie nie myle. Nastepnie ostatnie przypisanie puscic w forze. Wystarczy tablica jednowymiarowa
float tab[10];
jak mowilem
for(){
}
a wewnatrz fora zrobic 10 ifow gdzie sprawdzmy czy dana liczba nalezy do przedzialu zadanego (nie pamietam regulki) ale to recznie bylo czyli w pierwszym ifie od PRZEDZIAL do 2*PRZEDZIAL w drugim od 2*PRZEDZIAL do 3*PRZEDZIAL itd az do 10. Przedzialy powinny byc prawostronnie zamkniete. Na pewno byl to skrypt duzo prostszy i bardziej czytelny niz Michala, ale no.. z lenistwa nie chce mi sie pisac Mozecie pokombinowac.. piszcze jak najbardziej czytelnie. Prosto. Dublujcie wartosci zmiennych, powtarzajcie petle. Nie oto chodzi, aby bylo optymalnie i z wykorzystaniem raz otwartej rzeczy, ale zeby dzialalo O optymalizacje pomartwicie sie w pracy ;]
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Michele
Dołączył: 15 Sty 2006
Posty: 1041
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: BioAut, Gleiwitz-Petersdorf
|
Wysłany: Nie 18:55, 07 Sty 2007 Temat postu: |
|
|
wiem, ale tak to jest, jak się już w tym siedzi, to się myśli o tym, aby jak najprościej zrobić w sensie optymalizacji.
Pozdrawiam serdecznie. Aha jak chcesz to wrzuć tutaj swój kod Kreskuffko.
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Kreskuffka
Dołączył: 11 Lis 2005
Posty: 139
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: Gliwice BioCh/2
|
Wysłany: Nie 22:43, 07 Sty 2007 Temat postu: |
|
|
dzieki za pomoc, jak tylko sie wygrzebie z paipu i zmobilizuje to tez wrzuce tu to co stworze
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
kot-niepłot
Dołączył: 29 Lis 2005
Posty: 324
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: Gliwice BioAut
|
Wysłany: Nie 22:51, 07 Sty 2007 Temat postu: |
|
|
10 ifów można streścić do jednego: czy większe równe od i*przedział i mniejsze równe od (i+1)*przedział. Jeśli tak, to coś zrób i break;
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
kot-niepłot
Dołączył: 29 Lis 2005
Posty: 324
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: Gliwice BioAut
|
Wysłany: Pon 23:00, 08 Sty 2007 Temat postu: |
|
|
Kod: | #include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *in;
float max, min, szer, x;
int i=0;
int N;
int przedzial[10] = {0};
printf("Podaj liczbe przedzialow: ");
scanf("%d", &N);
printf("\n\n");
/* Histogram */ /* Komentarz 0 */
/* Krok 1 - trzeba wyznaczyć min i max */
in = fopen("dane.txt", "r");
fscanf(in, "%f", &x); /* Komentarz 1 */
max = min = x;
while(fscanf(in, "%f", &x)==1) /* Komentarz 1.5 */
{ if(x<min) min = x;
if(x>max) max = x;
}
fclose(in);
/* Krok 2 - trzeba podzielić na N przedziałów */
szer = N>1 ? (max-min)/(N-1) : max-min+0.5*(max+min); /* żeby było szeroko :P */
/* Krok 3 - przydzielić obserwacje do przedziałów */
in = fopen("dane.txt", "r");
while(fscanf(in, "%f", &x)==1)
for(i=0; i<N; i++)
if(x>=min+(i-0.5)*szer && x<=min+(i+0.5)*szer) /* Komentarz 2 */
{ przedzial[i]++;
break;
}
fclose(in);
/* Krok 4 - zamiatanie */
for(i=0; i<N; i++)
printf("Przedzial %d:\t%d obserwacji\n", i+1, przedzial[i]); /* Komentarz 3 */
printf("\n");
system("PAUSE");
return 0;
}
/*
Komentarz 0:
Jak się robi histogram - to nie powinno wymagać komentarza - wiemy
to z bibu :P
Komentarz 1:
Trzeba wczytać pierwszy raz i mieć jakieś początkowe min i max - nie
możemy np. z góry przyporządkowywać 0, bo a nuż w danych nic mniejszego
niż 0 się nie trafi a my będziemy mieli min==0. Dlatego trzeba to odnieść
np. do pierwszej danej - jest gwarancja że min będzie min (lub max jest max)
Komentarz 1.5:
Na laborkach było mówione że fscanf(), scanf, printf, fprintf zwracają
liczbę wczytanych/wypisanych zmiennych. Jeśli będzie inna niż 1 (bo wczytujemy
jedną zmienną; inna niż 1 tylko wtedy gdy plik się skończył),
while skończy się wykonywać.
W sumie tu jest najlepsza do...while, ale ja nigdy o niej nie pamiętam
że w ogóle jest :P
Komentarz 2:
Sprawdzenie czy obserwacja jest w tym przedziale. Świadomie jest >= a
potem <= - sprawdź sobie działanie dla wartości na przełomie przedziałów
- pójdzie do tego niższego przedziału (tak jak nas
na bibie uczyli), a break jest po to, żeby nie poszło dodatkowo do wyższego.
Komentarz 3:
i+1 żeby nie liczyć tych przedziałów od 0 tylko po "ludzku", czyli od 1 ;)
*/
|
Uwagi: Zauważyłem na czym ludzie najczęściej wpadają - tzn błędy które ciężko znaleźć:
brak przecinków w printfach, scanfach
brak & w scanfie
typ w łańcuchu w printf/scanf niezgodny z typem zmiennej (np %f jest tylko do float)
spacja w nazwie pliku - np. " dane.txt" - nie odczyta pliku, bo jest spacja przed nazwą!
dzielenie typu całkowitego gdzie wynik powinien być ułamkiem
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
![](http://picsrv.fora.pl/subSilver/images/spacer.gif) |
|
|
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|