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

    [C] Problema esercizio su array bidimensionale

    Salve a tutti, sono alle prese con questo esercizio:


    Ho realizzato l'algoritmo in C, tenendo conto che restituisce 1 al posto di TRUE e 0 invece che FALSE:
    codice:
    #include <stdio.h>
    
    main(){
    	int m, n, i, j;
    	int a[50][50];
    	int diverse, trovate;
    	/* inizializzazione e riempimento vettore*/
    	printf("m?\n");
    	scanf("%d", &m);
    	printf("n?\n");
    	scanf("%d", &n);
    	
    	for(i = 0; i < m; i++){
    		for(j = 0; j < n; j++){
    			printf("Valore in %d%c%d\n", i, ',', j);
    			scanf("%d", &a[i][j]);
    		}
    	}
    	for(i = 0; i < m; i++){
    		for(j = 0; j < n; j++){
    			printf(" %d", a[i][j]);
    		}
    		printf("\n");
    	}
    	i = 0;
    	j = 0;
    	diverse = 0;
    	trovate = 0;
    	/*controllo colonne*/
    	while(trovate == 0 && j < n-1){
    		while(i < m && diverse == 0){
    			diverse = 0;
    			if(a[i][j] != a[i][j+1]){
    				diverse = 1;
    			}
    			i++;
    		}
    		if(i == m){
    			trovate = 1;
    		}
    		j++;
    		i = 0;
    	}
    	if(trovate == 1){
    		/*controllo righe*/
    		i = 0;
    		j = 0;
    		diverse = 0;
    		trovate = 0;
    		while(trovate == 0 && i < m-1){
    			while(j < n && diverse == 0){
    				diverse = 0;
    				if(a[i][j] != a[i+1][j]){
    					diverse = 1;
    				}
    				j++;
    			}
    			if(j == n){
    				trovate = 1;
    			}
    			i++;
    			j = 0;
    		}
    	}
    	/*se trovate = 1 allora esistono 2 righe e 2 colonne uguali*/
    	printf("%d\n", trovate);
    }
    ll problema è che mi restituisce in ogni caso 0, e nn riesco ad individuarne il motivo. Qualcuno può aiutarmi?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    L'errore è che, alla fine del ciclo interno, se le righe/colonne sono uguali i/j non varrà m/n ma m+1/n+1!

    Comunque ti consiglio di riorganizzarlo un po', ad esempio potresti scrivere la stessa cosa così e risulterebbe più breve e più facile da seguire e comprendere:

    codice:
    #include <stdio.h>
    #include <stdbool.h>
    
    #define MAX 50
    
    int main(int argc, char **argv){
    	int m, n, i, j;
    	int a[MAX][MAX];
    	bool colonne = false, righe = false;
    	/* inizializzazione e riempimento vettore*/
    	do {
    		printf("m: ");
    		scanf("%d", &m);
    	} while((m > MAX) || (m < 0));
    	
    	do {
    		printf("n: ");
    		scanf("%d", &n);
    	} while((n > MAX) || (n < 0));
    	
    	for(i = 0; i < m; i++){
    		for(j = 0; j < n; j++){
    			printf("Valore in (%d,%d): ", i, j);
    			scanf("%d", &a[i][j]);
    		}
    	}
    	for(i = 0; i < m; i++){
    		for(j = 0; j < n; j++){
    			printf(" %5d", a[i][j]);
    		}
    		printf("\n");
    	}
    	/* controllo righe */
    	for(i = 0; i < m - 1; i++) {
    		righe = true;
    		for(j = 0; j < n; j++) {
    			if(a[i][j] != a[i + 1][j]) {
    				righe = false;
    				break;
    			}
    		}
    		if(righe) {
    			break;
    		}
    	}
    	/* controllo colonne */
    	if(righe) {
    		for(j = 0; j < n - 1; j++) {
    			colonne = true;
    			for(i = 0; i < m; i++) {
    				if(a[i][j] != a[i][j + 1]) {
    					colonne = false;
    					break;
    				}
    			}
    			if(colonne) {
    				break;
    			}
    		}
    	}
    	printf("%s\n", (colonne && righe) ? "True" : "False");
    	return 0;
    }
    Ci sono parentesi in eccesso messe solo per chiarezza ed ho aggiunto un controllo sulle dimensioni della matrice che tu non avevi considerato...
    Un alternativa è allocarla dinamicamente, ciò toglie ogni vincolo sulle dimensioni:
    codice:
    #include <stdlib.h>
    //...
    int **a;
    //...
    a = (int **)malloc(sizeof(int *) * m);
    for(i = 0; i < m; i++) {
      a[i] = (int *)malloc(sizeof(int) * n);
    }
    //...
    for(i = 0; i < m; i++) {
      free(a[i]);
    }
    free(a);
    //...
    Infine non trascurare che l'esercizio chiedeva una funzione che restituisse true o false, mentre tu hai fatto un programma che stampa a video il risultato!
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    scusa se ti rispondo solo ora, ma comunque avevo risolto! Grazie comunque! Ho preso un bel 28 per la cronaca

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Sono felice per te, ma è sempre buona norma dare uno sguardo ai consigli che ci vengono dati, anche se poi decidiamo di non seguirli è meglio considerarli, di sicuro ci si guadagna :sisi:
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.