C - výpis sekvencie zo súboru

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

Zamčeno
izzy1995
Level 3
Level 3
Příspěvky: 569
Registrován: 08 pro 2012 19:15

C - výpis sekvencie zo súboru

Příspěvek 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
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)
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7415
Registrován: 23 pro 2010 09:23

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

Příspěvek 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!
   }
"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: 08 pro 2012 19:15

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

Příspěvek od izzy1995 »

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: 08 pro 2012 19:15

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

Příspěvek 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");


	}
}
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)
Zamčeno

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