Trovare posizione di un elemento di un array e memorizzarlo in un altro.

di il
8 risposte

Trovare posizione di un elemento di un array e memorizzarlo in un altro.

Salve,
, mi serve un aiutino con un programma.
Ho un array di tipo char chiamato dnadi lunghezza LMAX riempito con 4 lettere diverse: C, G, T, A. Mi serve memorizzare la posizione di ogni G di questo array in un altro array chiamato taglio.
Ci ho provato ma viene male.
void Cut (char dna[], int N, int taglio[])
{

  int i, j=0 ;

  for(i=0;i<LMAX;i++)
    {
       if(dna[i] == 'G')
	{
	  taglio[j]=i;
	  j++;
	 }
  
Il problema è che oltre a stamparmi la posizione, mi stampa degli zeri alla fine. Come faccio?

EDIT: scusate, avevo scritto male.

8 Risposte

  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    Quel codice è incompleto. Mostra tutto quello che serve per replicare il tuo problema.

    Come visualizzi il contenuto dell'array taglio?
  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define LMAX 10000
    
    void DesignDNA ( char dna[], int N );
    void Cut ( char dna[], int N, int taglio[]);
    
    int main ()
    
    {
    
      FILE *f;
      
      srand48(time(NULL));
      
      int N, controllo, i;
      
      
      //Messaggio iniziale
      fprintf(stdout,"Questo programma simula l'effetto di un enzima che effettua...\n");
      fprintf(stdout,"un taglio nella sequenza di DNA ogni volta che si trova la guanina.\n");
    
      fprintf(stdout,"Inserire il numero di tagli compresi tra 2000 e 5000.\n");
    
      //Controllo inserimento input da tastiera
      do
        {
          controllo=fscanf(stdin, "%d", &N);
          if((controllo==0) || N<2000 || N>5000)
    	{
    	  fscanf(stdin, "%*[^\n]");
    	  fprintf(stdout,"Attenzione, N deve essere un intero e compreso fra 2000 e 5000.\n");
    	}
        }
      while((controllo==0) || N<2000 || N>5000);
    
      
      char dna[LMAX];
      int taglio[N];
    
      for(i=0;i<N;i++)
        {
          taglio[i]=0;
        }
      
      DesignDNA( dna, N);
    
      f=fopen("taglio", "w");
      
      for(i=0;i<LMAX;i++)
        {
          fprintf(stdout, " %c\n", dna[i]);
          fprintf(f, "%c\n", dna[i]);
        }
      
      Cut( dna, N, taglio);
    
      
      for(i=0;i<N;i++)
        {
          fprintf(stdout, "%d\n", taglio[i]);
          fprintf(f, "%d\n", taglio[i]);
        }
      fclose(f);
    
    
      
      return 0;
    
    }
    
    
    void DesignDNA ( char dna[], int N )
    {
    
      int n, i;
    
     
    
      
    
      for(i=0;i<LMAX;i++)
        {
          n= rand() % 3;
          
          if(n==0)
    	{
    	  dna[i]='A';
    	}
          
          if(n==1)
    	{
    	  dna[i]='C';
    	}
          
          if(n==2)
    	{
    	  dna[i]='T';
    	}
          
        }
    
      for(i=0;i<N;i++)
        {
    
          n = rand() % LMAX;
    
          if((n!= 0 && n!= LMAX) && dna[n] != 'G')
    	{
    
    	  dna[n] = 'G';
    	  
    	 }
          
         }
    }
    
    
    
    	  
    
    void Cut (char dna[], int N, int taglio[])
    {
    
      int i, j=0 ;
    
      for(i=0;i<LMAX;i++)
        {
           if(dna[i] == 'G')
    	{
    	  taglio[j]=i;
    	  j++;
    	 }
        }
      
    }
    QUesto è quello completo. Ha ancora qualche problema ma dovrebbe essere più o meno giusto.
  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    Ma cosa è N che passi alla Cut? All'interno di Cut non la usi ma poi la utilizzi fuori per visualizzare gli elementi di taglio??? Non ha alcun senso.

    Gli elementi validi sono j e li devi restituire dalla funzione Cut al chiamante. La Cut non deve essere void ma int e devi eseguire una return j;
  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    EDIT: Ok, grazie. Ho capito il problema. Ho fatto return j e messo il ciclo da fino a j per farlo stampare ed ora viene. Grazie.
    Ora però non riesco a capire perchè lui mi genera la stessa sequenza di G, C, T, A nelle stesse posizioni. Ora cerco di vedere che ho combinato.
  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    
    for(i=0;i<LMAX && j<N;i++)
    
  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    Non EDITare i messaggi precedenti ma rispondi con nuovi messaggi altrimenti il flusso della discussione non ha senso...
  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    Mi serve di nuovo una mano.
    Recito l'ultimo punto del programma:
    "definisca una funzione chiamata AnalisiL che calcoli l’istogramma H(l) delle lunghezze l dei
    frammenti di DNA stampando le due colonne l H(l) nel file Histo.dat con una larghezza
    minima di quattro caratteri ciascuna. La lunghezza dei segmenti si può calcolare una volta
    noti i punti della sequenza dove sono stati effettuati i tagli (e che sono stati memorizzati
    nell’array taglio). Infatti la differenza tra le posizioni di due tagli consecutivi i e i - 1
    (ad esempio taglio[1]-taglio[0]=6) corrisponde alla lunghezza del frammento creatosi
    da quei due tagli (un frammento di 6 nucleotidi in questo caso). Si faccia attenzione a
    considerare il frammento iniziale e finale della sequenza. Per maggior chiarezza si osservi
    la figura nel compito."

    Sono riuscito parzialmente a risolverlo. Per quanto riguarda le larghezze, le ho salvate in un array chiamato l. Non riesco però a considerare anche l'ultima sequenza. Inoltre non saprei come ottenere le varie frequenza dell'array l. Avevo pensato di ordinarlo e poi contare quante volte ho l[k] == l[k+1].
  • Re: Trovare posizione di un elemento di un array e memorizzarlo in un altro.

    Mostra sempre il codice che hai realizzato (tra tag CODE) e spiega le parti che hai fatto e quello che non riesci ad ottenere.
Devi accedere o registrarti per scrivere nel forum
8 risposte