C - výpis sekvencie zo súboru Vyřešeno

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

izzy1995
Level 3
Level 3
Příspěvky: 569
Registrován: prosinec 12
Pohlaví: Muž
Stav:
Offline

C - výpis sekvencie zo súboru  Vyřešeno

Příspěvekod izzy1995 » 18 lis 2014 16:00

Čaute, robím momentálne na projekte a narazil som na problém...potrebujem nejak spojazdniť výpis znakov zo súboru... po aktivovaní voľby sa zadá
celé číslo p (1 ≤ p ≤ 20) predstavujúce počet písmen (nukleotidov), ktoré sa vypíšu na
riadok. Potom program otvorí súbor a vypíše celý fragment DNA na obrazovku tak, že na
riadok vypíše p písmen. Napr. pre sekvenciu AACGTGCC a p = 3 by bol výstup nasledovný:
AAC
GTG
CC
V prípade ak sa súbor nepodarí otvoriť, vypíše správu Neotvoreny subor nasledovanú
znakom konca riadku. V prípade zadania hodnoty p z mimo určeného intervalu, vypíše
program správu Nespravny pocet nukleotidov na riadok nasledovanú znakom
konca riadku.

poradíte, ako to opraviť tak, aby tie znaky vypísalo? chybná časť je funkcia V_sekvencia

tu je môj zdroják

Kód: Vybrat vše

#include <stdio.h>
#include <ctype.h>
#define n ('Z' - 'A' + 1)

char volba;
int V_sekvencia(){
   int i,p;
   char c;
   FILE *fr;
   

   if ((fr = fopen("DNAsekvencia.dat", "r")) == NULL){
      printf("Neotvoreny subor");
      
   scanf("%d\n", &p);
   if ((p <= 1) || (p >= 20))
   {
      printf("Nespravny pocet nukleotidov na riadok");         
   }
   while (c = getc(fr) != EOF)
   {
      
      for (i = 0; i < p; i++)
      {
         
         printf("%c", getc(fr));
      }
      printf("\n");
      }
   }

   return getc(fr);

   }

int H_sekvencia(){
int c, i, hist[n];
FILE *fr;

if((fr = fopen("DNAsekvencia.dat", "r")) == NULL)
{
   printf("Neotvoreny subor.\n");
   return 0;
}

for (i=0; i<n; i++)
   hist[i] = 0;

while ((c = toupper(getc(fr))) != EOF)
{
   if(c >= 'A' && c <= 'Z')
      hist[c - 'A']++;
}

for (i = 0; i < n; i++)
{
   if (hist[i] != 0)
      printf("%c: %d\n", 'A' + i, hist[i]);
}   

if (fclose(fr) == EOF)
{
   printf("Subor DNAsekvencia.dat sa nepodarilo zatvorit.\n");
   return 1;
}

return 0;
}






int main(){
   char pole[1000];
   char volba;
   int i,p;

   for (i = 0; i < 1000; i++)
   {
      pole[i] = '0';
   }

   
   scanf("%c", &volba);


   while (volba != 'K')
   {
      if (volba == 'V' || volba =='v')
      {
         
         scanf("%d", &p);
         V_sekvencia();
      }
      if (volba == 'H' || volba == 'h')
      {
         H_sekvencia();
      }
      if (volba == 'N' || volba == 'n')
      {
         V_sekvencia();
      }
      if (volba == 'P' || volba == 'p')
      {
         V_sekvencia();
      }
      if (volba == 'C' || volba == 'c')
      {
         V_sekvencia();
      }
      if (volba == 'D' || volba == 'd')
      {
         V_sekvencia();
      }
      scanf("%c", &volba);
   }
      return 0;

   
}



súbor DNAsekvencia.dat:

Kód: Vybrat vše

aCgAGAtCTCaTgcACGGGGtTCaTGCtgc
Intel Core i7-4710HQ 3,5Ghz, Intel HM86 Chipset, 8GB DDR3 1600Mhz, SATA HDD 1TB(7200rpm) + 2TB samsung HDD,IPS LED 15,6" 1920x1080px,Intel Graphics 4600, Nvidia GeForce GTX860M 4GB GDDR5,Wi-fi 802.11 a/g/n, Bluetooth
ASUS N551JM-DM157H

Born to be FIIT (STU)

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7359
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: C - výpis sekvencie zo súboru

Příspěvekod faraon » 18 lis 2014 19:39

Tak především by bylo dobré před čtením vstupu napsat co v tu chvíli program vlastně očekává, jestli písmeno nebo číslo a případně rozsah, ať uživatel víc co má udělat. Ono je bez toho těžké poznat kde se ve kterém okamžiku vlastně nacházím...

Tu funkci V_sekvencia() by asi bylo lepší zahodit a napsat úplně znovu, protože to bude méně práce než dát tohle dohromady! A udělal bych to tímhle stylem:

Kód: Vybrat vše

int V_sekvencia(void)
    {
    int i,p;
    char c;
    FILE *fr;
 
   if ((fr = fopen("DNAsekvencia.dat", "r"))
      {

      /* tady proběhne zobrazování */

      fclose(fr);
      /* nikdy nenechávej soubor otevřený déle než je nutné! */
      }
   else
      {
      /* nastala chyba */
      printf("Neotvoreny subor\n");
      }
     
   return ??? Co se tu má vlastně vracet? Určitě ne znak načtený až za koncem souboru!
   }
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

izzy1995
Level 3
Level 3
Příspěvky: 569
Registrován: prosinec 12
Pohlaví: Muž
Stav:
Offline

Re: C - výpis sekvencie zo súboru

Příspěvekod izzy1995 » 18 lis 2014 23:42

ok, dík za reakciu, idem na to
Intel Core i7-4710HQ 3,5Ghz, Intel HM86 Chipset, 8GB DDR3 1600Mhz, SATA HDD 1TB(7200rpm) + 2TB samsung HDD,IPS LED 15,6" 1920x1080px,Intel Graphics 4600, Nvidia GeForce GTX860M 4GB GDDR5,Wi-fi 802.11 a/g/n, Bluetooth
ASUS N551JM-DM157H

Born to be FIIT (STU)

izzy1995
Level 3
Level 3
Příspěvky: 569
Registrován: prosinec 12
Pohlaví: Muž
Stav:
Offline

Re: C - výpis sekvencie zo súboru

Příspěvekod izzy1995 » 20 lis 2014 16:51

tak tu je nakoniec moje riešenie, spravil som to nanovo

Kód: Vybrat vše

void V_sekvencia(){
   int i = 0, p;
   char c;
   FILE *fr;


   if ((fr = fopen("DNAsekvencia.dat", "r")) == NULL){
      printf("Neotvoreny subor.\n");
   }

   scanf("%d", &p);
   if ((p <= 1) || (p >= 20))
      printf("Nespravny pocet nukleotidov na riadok.\n");
   else{

      while ((c = getc(fr)) != EOF)
      {
         i++;

         if (c <= 'z' && c >= 'a')
            c = c - 32;
         printf("%c", c);
         if (i % p == 0)
            putchar('\n');

      }

      if (fclose(fr) == EOF)
         printf("Subor DNAsekvencia.dat sa nepodarilo zatvorit.\n");


   }
}
Intel Core i7-4710HQ 3,5Ghz, Intel HM86 Chipset, 8GB DDR3 1600Mhz, SATA HDD 1TB(7200rpm) + 2TB samsung HDD,IPS LED 15,6" 1920x1080px,Intel Graphics 4600, Nvidia GeForce GTX860M 4GB GDDR5,Wi-fi 802.11 a/g/n, Bluetooth
ASUS N551JM-DM157H

Born to be FIIT (STU)


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti