Non viene visualizzato il risultato

di il
15 risposte

Non viene visualizzato il risultato

Devo creare un codice che inserisca N numeri inseriti dall'utente (il numero inserito non deve essere maggiore di 20) e di questi numeri vengano stampati in output solo i numeri non ripetuti.
Il problema che sto avendo, motivo per cui non riesco a testare se il codice finale è giusto, è che in output non mi viene visualizzato il risultato ma bensi questo numero: -858993460, che penso abbia a che fare con l'indirizzo di memoria, dall'alto della mai ignoranza, e non capisco cosa possa aver sbagliato, perché vedendo i compiti dei miei colleghi li vedo molto simili. Dove sto sbagliando?
#include <stdio.h>


int main() {
	int N = 0, i, b = 0, j=0, k=0;
	int vett[20]; int n[20];
	while (N >= 0)
	{
		printf("Quanti numeri vuoi visualizzare?\n");
		scanf_s("%d", &N);
		if (N > 20) {
			printf("inserire un numero inferiore a 20\n");
			printf("\n");
			continue;
		}
		if (N < 0) {
			printf("devi inserire un numero positivo, riavvia il programma");			
		}
		else {
			break;
		}

	}
	for (i = 0; i < N; i++) { //inserisce i numeri nell'array
		printf("inserire numero %d: \n", (i + 1)); 
		scanf_s("%d", &vett[i]);
		for (j = 1; j < N; j++) { //scarta i numeri ripetuti
			if (n[j] == vett[i]) {
				continue;
			}
			else {
				vett[i] = n[k];
				k++;
			}
		}
	}
	for (j = 0; j < N; j++) { //stampo tutti i numeri inseriti non ripetuti
		printf("%d: \n", n[k]);
	}
}

15 Risposte

  • Re: Non viene visualizzato il risultato

    Alla fine usi k nel ciclo con j ?
  • Re: Non viene visualizzato il risultato

    Non mi è molto chiaro se funzioni, da come 'ho pensato dovrebbe servire per stampare i valori non ripetuti. L'ho visto fare anche ad alcuni miei colleghi
  • Re: Non viene visualizzato il risultato

    No, non in quel modo ... k è un indice che ha un certo valore ovvero l'ultimo utilizzato in precedenza. Se usi sempre k all'interno del ciclo non avrai altro che un solo valore in output.

    Ragiona un po' da solo e lascia stare i colleghi
  • Re: Non viene visualizzato il risultato

    Avevo pensato di creare un quarto ciclo for per inizializzare il k ma non sono sicuro che funzioni e sopratutto renderebbe il codice troppo complicato per una cosa così semplice, quindi ho modificato if levando il k e semplicemente mettendo un break nel caso j sia diverso da i, e comunque da errore
  • Re: Non viene visualizzato il risultato

    1) Riscrivi il while. Ma veramente break e continue per controllare che il numero immesso sia tra 1 e 20? È pienissimo di esempi nei vecchi thread
    2) Acquisisci esattamente N elementi in vett[ i ] senza condizioni, come ti dice la traccia
    3) ciclo per i che va da 0 a N, all'interno flag azzerata e ciclo per j che va da 0 a i-1 che alza la flag se vett[ i ] == ...
  • Re: Non viene visualizzato il risultato

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #define N 20
    
    int main() {
    	int v[N];
    	int var;
    	int i;
    	int n = 0;
    	int flag= 0;
    	int z = 0;
    	int k = 0;
    	while (n >= 0)
    	{
    		printf("numero da inserire: ");
    		scanf("%d", &n);
    		if (n > 20) {
    			printf("numero inferiore di 20\n");
    			continue;
    		}
    		else {
    			break;
    		}
    	}
    	for (i = 0; i < n; i++) {
    		flag = 0;
    		printf("inserisci un numero: ");
    		scanf("%d", &var);
    		for (k = 0; k < n; k++) {
    			if (var == v[k]) {
    				flag = 1;
    			}
    		}
    		if (flag == 0) {
    			v[z] = var;
    			z++;
    		}
    	}
    	for (i = 0; i < z; i++) {
    		printf("%d ", v[i]);
    	}
    }

    Alla fine sono uscito con questo codice che risulta, anche se non mi è stato chiaro perché mi desse lo stesso errore se non inizializzavo di nuovo il flag = 0 subito dopo aver dichiarato il for. Ammetto che non è tutto frutto della mia mente ma grazie a ciò ho imparato molte cose sul codice che mi erano vaghe
  • Re: Non viene visualizzato il risultato

    Consiglio: dichiara le variabili quando ti servono e con nomi sensati; non è C89. Se hai un ciclo for il contatore può essere dichiarato e inizializzato lì.
    È più facile capire il codice e prevenire bug.

    Oltre al fatto che per flag potresti usare _Bool (o bool includendo stdbool.h), true e false.
  • Re: Non viene visualizzato il risultato

    Pingo ha scritto:


    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #define N 20
    
    int main() {
    	int v[N];
    	int var;
    	int i;
    	int n = 0;
    	int flag= 0;
    	int z = 0;
    	int k = 0;
    	while (n >= 0)
    	{
    		printf("numero da inserire: ");
    		scanf("%d", &n);
    		if (n > 20) {
    			printf("numero inferiore di 20\n");
    			continue;
    		}
    		else {
    			break;
    		}
    	}
    	for (i = 0; i < n; i++) {
    		flag = 0;
    		printf("inserisci un numero: ");
    		scanf("%d", &var);
    		for (k = 0; k < n; k++) {
    			if (var == v[k]) {
    				flag = 1;
    			}
    		}
    		if (flag == 0) {
    			v[z] = var;
    			z++;
    		}
    	}
    	for (i = 0; i < z; i++) {
    		printf("%d ", v[i]);
    	}
    }

    Alla fine sono uscito con questo codice che risulta, anche se non mi è stato chiaro perché mi desse lo stesso errore se non inizializzavo di nuovo il flag = 0 subito dopo aver dichiarato il for. Ammetto che non è tutto frutto della mia mente ma grazie a ciò ho imparato molte cose sul codice che mi erano vaghe
    Il tuo codice è sbagliato
    
    int v[N];
    
    Valori casuali di v dato che non lo hai inizializzato, ma supponiamo che siano tutti zero che è la cosa più probabile.

    L'utente mette n = 1 e poi var = 0 come primo numero. Cosa succede?
    
    for (k = 0; k < n; k++) {
    			if (var == v[k]) {
    				flag = 1;
    			}
    }
    
    La flag viene alzata e zero ti viene rifiutato anche se è il primo numero.

    Il secondo ciclo dovresti scriverlo
    
    for (k = 0; k < z; k++) {
    
  • Re: Non viene visualizzato il risultato

    Si lo so infatti dovrei mettere if(var == v[k] || var == 0)
  • Re: Non viene visualizzato il risultato

    Pingo ha scritto:


    Si lo so infatti dovrei mettere if(var == v[k] || var == 0)
    No, non funzionerebbe.

    Visto che non sei il primo, ti faccio io una domanda: perché rifiutare una soluzione corretta e insistere con una scorretta? Eppure avresti dovuto cambiare solo una lettera. Non ti piace z?
  • Re: Non viene visualizzato il risultato

    Ma guarda hai sbagliato persona io ho scritto per fretta e per ignoranza, non sto perseverando una soluzione scorretta quando l'ignoranza non mi permette di farlo
  • Re: Non viene visualizzato il risultato

    Weierstrass ha scritto:


    3) ciclo per i che va da 0 a N, all'interno flag azzerata e ciclo per j che va da 0 a i-1 che alza la flag se vett[ i ] == ...
    Sì e no:
    perchè così non stamperebbe le istanze "successive" alla prima, invece il testo sembra significare "non stampare proprio nessuna istanza dei valori ripetuti"
  • Re: Non viene visualizzato il risultato

    Penso che fosse il solito esercizio per estrarre l'insieme, comunque sì, può provare a risolverlo nell'altra accezione
  • Re: Non viene visualizzato il risultato

    Ho testato il programma, solo per curiosità e il caso che esponi tu non sussiste, neanche cambiando la variabile n con z
    L'utente mette n = 1 e poi var = 0 come primo numero. Cosa succede?
    
    for (k = 0; k < n; k++) {
    			if (var == v[k]) {
    				flag = 1;
    			}
    }
    
    La flag viene alzata e zero ti viene rifiutato anche se è il primo numero.
Devi accedere o registrarti per scrivere nel forum
15 risposte