Forum ::BIOTECHNOLOGIA:: Strona Główna ::BIOTECHNOLOGIA::
Forum studentów kierunku biotechnologia Politechniki Śląskiej
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Informatyka - zadania z plików

 
To forum jest zablokowane, nie możesz pisać dodawać ani zmieniać na nim czegokolwiek   Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi    Forum ::BIOTECHNOLOGIA:: Strona Główna -> Archiwum
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

PostWysł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
Zobacz profil autora
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

PostWysł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
Zobacz profil autora
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

PostWysł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 Razz 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 Smile O optymalizacje pomartwicie sie w pracy ;]


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
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

PostWysł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
Zobacz profil autora
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

PostWysł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
Zobacz profil autora
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

PostWysł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
Zobacz profil autora
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

PostWysł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
Zobacz profil autora
Wyświetl posty z ostatnich:   
To forum jest zablokowane, nie możesz pisać dodawać ani zmieniać na nim czegokolwiek   Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi    Forum ::BIOTECHNOLOGIA:: Strona Główna -> Archiwum Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
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
Regulamin