Stránka 1 z 1

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

Napsal: 18 lis 2014 16:00
od izzy1995
Č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

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

Napsal: 18 lis 2014 19:39
od faraon
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!
   }

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

Napsal: 18 lis 2014 23:42
od izzy1995
ok, dík za reakciu, idem na to

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

Napsal: 20 lis 2014 16:51
od izzy1995
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");


   }
}