Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    C - contare occorrenze e righe

    Salve a tutti sono giorni che sto buttando il tempo su questa cosa, spero non sia banale.

    Ho un file con dentro:

    25 6 3 8 1
    3 4 2 12 9
    2 9 21 2 2
    7 93 10 1 2

    Devo scorrere questo file, come si può vedere dalle righe devo trovare il numero ripetuto per tre volte, in questo caso è il 2 e dire in quali righe è contenuto.

    Es: eseguo a terminale conta 2 100

    ripete 100 volte, e mi dice che il 2 è contenuto alla riga numero 3. Ovviamente se fosse contenuto anche alla righa 1, il programma mi deve dire che il 2 è contenuto alla riga 1,3

    Spero di essere stato chiaro.

    Come posso risolvere???

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Devi provare te a farlo, in C.

  3. #3
    Originariamente inviato da Who am I
    Devi provare te a farlo, in C.
    Dovrebbe prima provare a farlo con carta e penna, per poi tradurre l'algoritmo in C.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: C - contare occorrenze e righe

    Originariamente inviato da Mik_mo84

    Come posso risolvere???
    Tu come vorresti/sapresti risolvere?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Per leggere i numeri ti bastano due cicli for. Il resto dovresti saperlo fare.

  6. #6
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        FILE *f;
        int num_linea = 0;
        int carat;
        int search;
        int occorrenze = 0;
        int count = 0;
        int ciclo,i=0;
        f = fopen("testo.txt","r");
        
        printf("\ninserisci numero da trovare:\n");
        scanf("%d",&search);
        printf("\nQuante volte provare:\n");
        scanf("%d",&ciclo);
        while((fscanf(f,"%d",&carat)>0) && (0!=ciclo))
        {
        ciclo--;
         if(carat == 0)
         {
         num_linea++;
         }
         
         if((carat == search) && (count < 3))
         {
         occorrenze++;
         count++;
         }
         
         if(count == 3)
         {
         i++;
         count = 0;
         }
        
         
        }
        
        fclose(f);
        
        printf("\nIl numero delle linee: %d\n", num_linea);
        printf("\nIl numero delle occorrenze: %d\n", occorrenze);
        printf("\nRighe che contengono il valore richiesto: %d\n", i);
        
        //system("PAUSE");
    }
    Questa è la mia soluzione, il problema che nel file ho dovuto mettere ad ogni riga uno 0 per contare il fine riga (come posso controllare il \n? nel caso di un intero?), inoltre devo farmi stampare i numeri di riga.

    Questo è il mio file:

    2 6 3 2 2 0
    2 4 2 12 2 0
    2 2 21 2 3 0
    2 93 2 1 2 0
    2 2 7 8 23 38 12 0

    In output mi stampa
    numero linee: 5
    occorrenze trovate: 13
    righe che contengono il valore righiesto: 4

    Quest'ultimo mi deve dire valore contenuto nelle righe 1,2,3,4

    Idee???

  7. #7
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Ciao , ho voluto provare a risolvere il problema , pensavo di riuscirci velocemente , invece
    ci ho impiegato 1 ora e 20

    ho usato quello che conosco del linguaggio c , quindi sicuramente ci sono metodi di risolvere il problema , migliori più pratici , ma che non conosco
    se non ti offende , vorrei postarti le modifiche che ho fatto al tuo programma e sapere
    cosa ne pensi .
    potrebbero esserci delle imprecisioni o errori , e il codice non è tanto chiaro , ma SEMBRA FUNZIONARE




    codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    int estrai_numeri(char *x,int *posizione);
    int main()
    {
        FILE *f;
        int num_linea = 0;
        int carat;
        int search;
        int occorrenze = 0;
        int count = 0;
        int ciclo,i=0;
        char buffer[200];
        
        int righe_cont_numero[30]={0};
         int pos_stringa=0;
        f = fopen("testo.txt","r");
        
        printf("\ninserisci numero da trovare:\n");
        scanf("%d",&search);
        printf("\nQuante volte provare:\n");
        scanf("%d",&ciclo);
       
        while(!feof(f))
        {
            if( fgets(buffer,200,f)==NULL)
                break;
            num_linea++;
            pos_stringa=0;
            while(pos_stringa<strlen(buffer))
            {
         
                 carat=estrai_numeri(buffer,&pos_stringa);
                  printf(" --- %d\n",carat);
         
                 if(carat == search) 
                 {
                 occorrenze++;
                 righe_cont_numero[i]=num_linea;
                 i++;
                 
                 }
                 
         
        
         
        }
       }   
       fclose(f);
        
        printf("\nIl numero delle linee: %d\n", num_linea);
        printf("\nIl numero delle occorrenze: %d\n", occorrenze);
        printf("\nRighe che contengono il valore richiesto:  ");
        for(i=0;righe_cont_numero[i]!=0;i++)
             printf(" %d ",righe_cont_numero[i]);
        printf("\n");    
        
        system("PAUSE");
    }
    
    int estrai_numeri(char *x,int *posizione)
    {
        
        char numero[8];
        
         int k=0;
         
         
         while(x[*posizione]!=0)//limita a lunghezza stringa
         {
            if ( x[*posizione]>='0'&& x[*posizione]<='9')
            {
             numero[k]=x[*posizione];
             k++;
             *posizione+=1;
             }    
             else if((x[*posizione]<'0'|| x[*posizione] >'9')&&(numero[0]!=0))
             {
                *posizione+=1;
                 return atoi(numero); 
                 
                 }
                 
              else
               *posizione+=1;  
             
             }
        
        
        
        }
    Tecnologia

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.