PDA

Visualizza la versione completa : [C] Contare le occorrenze di un numero all'interno di diverse righe


Mik_mo84
07-05-2012, 01:53
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???

Who am I
07-05-2012, 09:03
Devi provare te a farlo, in C.

MItaly
07-05-2012, 09:13
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.

oregon
07-05-2012, 09:33
Originariamente inviato da Mik_mo84

Come posso risolvere???

Tu come vorresti/sapresti risolvere?

goatboy
07-05-2012, 09:34
Per leggere i numeri ti bastano due cicli for. Il resto dovresti saperlo fare.

Mik_mo84
07-05-2012, 10:20
#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???

torn24
07-05-2012, 15:23
Ciao , ho voluto provare a risolvere il problema , pensavo di riuscirci velocemente , invece
ci ho impiegato 1 ora e 20 :dh:

ho usato quello che conosco del linguaggio c , quindi sicuramente ci sono metodi di risolvere il problema , migliori pi pratici , ma che non conosco :bh:
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








#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;

}



}

Loading