Problema cicli for (C++)

di il
10 risposte

Problema cicli for (C++)

Salve sono nuovo del forum ho un problema con questo esercizio che mi chiede codesto:

Intro:
Dopo aver riordinato la sua estesa collezione di fumetti, Nemo si è accorto di possedere un enorme numero di doppioni. In svariati casi, alcuni numeri sono presenti in più di due copie. Lidia gli suggerisce quindi di fare un po' di ordine nella sua libreria e riporre tutti i doppioni in un grande scaffale. Nemo, prima di tutto, deve capire quanto grande dovrà essere questo scaffale in modo da contenere tutti i doppioni in suo possesso.

Si scriva un programma in C++ che sia in grado di calcolare l’esatto numero di doppioni in possesso di Nemo.
Il file di input contiene 100 task, uno per ogni riga.
Ogni riga del file di input contiene N+1 valori. Il primo valore indica il numero N di fumetti che Nemo possiede. I successivi N valori rappresentano la lista (non ordinata) dei numeri dei fumetti in possesso di Nemo.
Il file di output conterrà 100 righe di testo, una per ogni task contenuto nel file di input. Ogni riga del file di output dovrà contenere un unico valore, ovvero il numero esatto dei doppioni che Nemo possiede in quello specifico task.

Note
Se il numero di un fumetto è presente M volte allora bisogna considerare M-1 doppioni di questo fumetto.
Il numero N è sempre minore o uguale a 2000
I numeri dei fumetti sono sempre valori compresi tra 1 e 1000

Esempio
Il seguente esempio presenta un file di input, contenente 3 task, ed il corrispondente file di output.

input.txt:
13 12 23 12 52 23 55 12 32 686 12 45 52 34
5 34 89 123 34 234
7 1 5 89 32 45 67 21

output.txt
5
1
0


Ho provato a risolvere con questo codice ma quando gli do in input il file (il file citato nell'esempio) mi da l'output sbagliato non riesco a capire dove sia l'errore:

#include <iostream>
#include <fstream>
using namespace std;
ifstream leggi("input.txt");
ofstream scrivi("output.txt");

int main ()
{
	int cont;
	int N;
	int x=0;
	
	for (int i=0; i<3; i++) //scorri le colonne
	{
		cont=0;
		leggi >> N;
		int *A=new int [N];
		
		for (int k=0; k<N; k++) //scorri le righe ma resta fisso l'indici fino all'incremento
		{
			leggi >> A[k];
			x=A[k];
			
			for (int j=0; j<N; j++) //scorri
			{
				leggi >> A[j];
				
				
				
				if(k==j)
				{
				cont=cont;
				
				}else if(x==A[j])
				{
					cont++;
				
				}
			
			}
		
		
		} 
		scrivi << cont << '\n';
		cout << " doppioni= "<< cont << "\n";
	
	}

}

10 Risposte

  • Re: Problema cicli for (C++)

    
    if(k==j)
    {
    	cont=cont;			
    }
  • Re: Problema cicli for (C++)

    Weierstrass ha scritto:


    
    if(k==j)
    {
    	cont=cont;			
    }

    lo scopo di quell'assegnazione è il seguente; nel caso in cui l'indice di k e di j sono uguali allora si ritrovano ad analizzare lo stesso elemento quindi in poche parole: devo comparare 12 a tutti gli altri elementi (che possono essere 12) ma non con se stesso di fatto nel caso avvenga, cont (che sarebbe il contenitore dei doppioni) rimane invariato, ossia cont=cont
  • Re: Problema cicli for (C++)

    if(k==j);
  • Re: Problema cicli for (C++)

    Scusami ho ricontrollato il codice ma non riesco a capire cosa intendi, scusami sono alle prime armi
  • Re: Problema cicli for (C++)

    Weierstrass ha scritto:


    if(k==j);
    Ricontrolando il codice mi sono reso conto di un problema se in un file di input (prendo quello dell'esempio) abbiamo
    13 12 23 12 52 23 55 12 32 686 12 45 52 34
    5 34 89 123 34 234
    7 1 5 89 32 45 67 21
    il codice prende N (13) e mi crea l'array, il problema e che non mi va a capo, nonostante il ciclo For, prende sempre in input il 13 quando in realtà dovrebbe essere sul 5 e via così.
  • Re: Problema cicli for (C++)

    1) la mia osservazione era sull'istruzione inutile, basta appunto mettere un punto e virgola dopo l'if
    2) non usare l'allocazione dinamica se sei alle prime armi: hai dei dati extra che ti servono appunto per usare l'allocazione statica
    3) con ifstream ti serve un while a monte di tutto per rilevare la fine del file, ci sono vari modi per farlo
    4) l'array deve essere ridimensionato a ogni riga, ma a pensarci bene non ti servono array oltre a quello del numero di copie per numero di fumetto.

    Prova a ripensare un attimo tutto il tuo impianto. Se ti diamo la soluzione non serve a nulla
  • Re: Problema cicli for (C++)

    Weierstrass ha scritto:


    1) la mia osservazione era sull'istruzione inutile, basta appunto mettere un punto e virgola dopo l'if
    2) non usare l'allocazione dinamica se sei alle prime armi: hai dei dati extra che ti servono appunto per usare l'allocazione statica
    3) con ifstream ti serve un while a monte di tutto per rilevare la fine del file, ci sono vari modi per farlo
    4) l'array deve essere ridimensionato a ogni riga, ma a pensarci bene non ti servono array oltre a quello del numero di copie per numero di fumetto.

    Prova a ripensare un attimo tutto il tuo impianto. Se ti diamo la soluzione non serve a nulla

    scusami ne approfitto per un'informazione quando il programma riceve in input un file txt li legge come stringa direttamente?

    faccio un esempio se in input ricevo 1234 lo leggo come stringa non come int?
  • Re: Problema cicli for (C++)

    Va bene leggere come int
  • Re: Problema cicli for (C++)

    È tutta la sera che ci provo a fare l'esercizio proposto dall'utente sono arrivato a questo:
    (mi baso sull'esempio, task di 3)
    
    #include <iostream>
    #include <fstream>
    using namespace std;
    ifstream read ("input.txt");
    ofstream print ("output.txt");
    
    int main (){
    
    int j=0;
    int i=0;
    int N;
    
    
    while (j<3){
    	Read >>N;
    	int A[N];
    	i=0;
    	while(i<N){
    		read>> A[i];
    		cout << A[i] << '\n';
    		i=i+1;
    	
    	
    	}
    
    	j=j+1
    
    
    
    
    }
    
    
    
    
    
    
    
    
    
    
    
    }
    


    ovviamente non risolvere l'esercizio volevo solo vedere se mi legge correttamente l'input e inefetti spunta:

    12
    23
    12
    52
    23
    55
    12
    32
    686
    12
    45
    52
    34
    (seconda riga)
    34
    89
    123
    34
    234
    (terza e ultima riga)
    1
    5
    89
    32
    45
    67
    21


    Dove il 13,5,7 non sono scritti in quanto vengono solamente presi per creare l'array.
    Mi chiedevo se mi trovavo nella buona strada per la risoluzione.
  • Re: Problema cicli for (C++)

    Si può provare ad iniziare così:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(void){
        ifstream read("input.txt");
        int X;
        unsigned int valori_da_leggere = 0;
        while(read >> X){
            if(!valori_da_leggere){
                if(X < 0 || X > 2000){
                  cout << "file malformato!" << endl; 
                  return -1;      
                }
                valori_da_leggere = X;
                cout << "linea da " << X << " valori:" << endl;
            }
            else{
                if(X < 1 || X > 1000){
                  cout << "file malformato!" << endl; 
                  return -1;      
                }      
                if(--valori_da_leggere)
                    cout << X << " ";
                else
                    cout << X << endl;                   
            }
        }
        return 0;
    }
Devi accedere o registrarti per scrivere nel forum
10 risposte