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

    [C] domanda banale sul ordinamento

    Qual è l'algoritmo per ordinare una matrice in ordine crescente?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Lo stesso che scrivi per ordinare un array...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Originariamente inviato da Scara95
    Lo stesso che scrivi per ordinare un array...
    Un array si ordina così:
    codice:
    for(j=0;j<n-1; j++)
      for(i=0; i<n-1; i++)
        if(a[i]<a[i+1])
          {aux=a[i]; a[i]=a[i+1]; a[i+1]=aux;}
    Tuttavia una matrice non la riesco a ordinare nello stesso modo, ovvero:

    codice:
      for(k=0; k<righe-1; k++)
      for(i=0; i<righe-1; i++)
      for(j=0;j<colonne-1; j++)
        if(a[i][j]<a[i+1][j])
          {aux=a[i][j]; a[i][j]=a[i+1][j]; a[+1][j]=aux;}

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    int array[N][M] è equivalente a int array[N*M]

    array[i][k] è equivalente a array[i*M+k]

    Sfruttando ciò potresti scrivere una cosa del tipo

    int *indexer = (int *)array;

    E usarlo come un array di N*M
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Originariamente inviato da Scara95
    int array[N][M] è equivalente a int array[N*M]

    array[i][k] è equivalente a array[i*M+k]

    Sfruttando ciò potresti scrivere una cosa del tipo

    int *indexer = (int *)array;

    E usarlo come un array di N*M
    L'idea è ottima e mi torna anche in teoria. Ora ho qualche problema con l'ordinamento. Me li ordina tutti tranne uno a caso che mi sostituisce con un numero incomprensibile. Ecco il codice dell'ordinamento. Ho già verificato con una printf e il trasferimento matrice-array è stato compiuto perfettamente.
    codice:
    n= r*c;
         
    do {
      k = 0;
      for(i=0; i<n-1; i++)
        if(b[i]>b[i+1])
          {aux=b[i]; b[i]=b[i+1]; b[i+1]=aux; k=1;}
    }
    while(k==1);
        
      for(i=0; i<n; i++)
         printf("Valore %d: %d\n", i, b[i]);
    Da notare inoltre che, se il numero di righe è uno ovvero un array semplice funziona senza problemi.

  6. #6
    Originariamente inviato da Scara95
    int array[N][M] è equivalente a int array[N*M]

    array[i][k] è equivalente a array[i*M+k]

    Sfruttando ciò potresti scrivere una cosa del tipo

    int *indexer = (int *)array;

    E usarlo come un array di N*M
    A controllarla ora non mi torna. Potresti mettermi il codice?

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Scusami, ma ero impegnato e non ti ho potuto rispondere prima di adesso. Eccoti del codice di esempio, puoi studiarlo e modificarlo per capire meglio:
    codice:
    #include <stdio.h>
    #include <stdbool.h>
    
    #define N 5
    #define M 3
    
    int main(int argc, char **argv) {
    	int j, k;
    	int mat[N][M];
    	int *p_mat = (int *)mat;
    	int tmp;
    	bool change;
    	//inserimento dati
    	printf("Inserire una matrice di %ux%u elementi:\n", N, M);
    	for(j = 0; j < N; j++) {
    		for(k = 0; k < M; k++) {
    			scanf("%d", &mat[j][k]);
    		}
    	}
    	while(getchar() != '\n'); //pulisce il buffer dopo la lettura con scanf
    	//stampa dati
    	printf("\n\n");
    	for(j = 0; j < N; j++) {
    		for(k = 0; k < M; k++) {
    			printf("%d ", mat[j][k]);
    		}
    		printf("\n");
    	}
    	//ordinamento dati
    	for(j = N*M - 1, change = false; j > 0; j--) {
    		for(k = 0; k < j; k++) {
    			if(p_mat[k] > p_mat[k+1]) {
    				tmp = p_mat[k];
    				p_mat[k] = p_mat[k+1];
    				p_mat[k+1] = tmp;
    				change = true;
    			}
    		}
    		if(!change) break;
    	}
    	//stampa dati
    	printf("\n\n");
    	for(j = 0; j < N; j++) {
    		for(k = 0; k < M; k++) {
    			printf("%d ", mat[j][k]);
    		}
    		printf("\n");
    	}
    	
    	//alternativa di inserimento puramente dimostrativa
    	printf("\n\n");
    	printf("Inserire una matrice di %ux%u elementi:\n", N, M);
    	for(j = 0; j < N; j++) {
    		for(k = 0; k < M; k++) {
    			scanf("%d", &p_mat[j*M+k]);
    		}
    	}
    	while(getchar() != '\n');
    	printf("\n\n");
    	for(j = 0; j < N; j++) {
    		for(k = 0; k < M; k++) {
    			printf("%d ", mat[j][k]);
    		}
    		printf("\n");
    	}
    	for(j = N*M - 1, change = false; j > 0; j--) {
    		for(k = 0; k < j; k++) {
    			if(p_mat[k] > p_mat[k+1]) {
    				tmp = p_mat[k];
    				p_mat[k] = p_mat[k+1];
    				p_mat[k+1] = tmp;
    				change = true;
    			}
    		}
    		if(!change) break;
    	}
    	printf("\n\n");
    	for(j = 0; j < N; j++) {
    		for(k = 0; k < M; k++) {
    			printf("%d ", mat[j][k]);
    		}
    		printf("\n");
    	}
    	getchar();
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    ERRATA CORRIGE
    codice:
    for(j = N*M - 1, change = false; j > 0; j--) {
    		for(k = 0; k < j; k++) {
    			if(p_mat[k] > p_mat[k+1]) {
    				tmp = p_mat[k];
    				p_mat[k] = p_mat[k+1];
    				p_mat[k+1] = tmp;
    				change = true;
    			}
    		}
    		if(!change) break;
    	}
    codice:
    for(j = N*M - 1, change = false; j > 0; j--) {
    		change = false;
    		for(k = 0; k < j; k++) {
    			if(p_mat[k] > p_mat[k+1]) {
    				tmp = p_mat[k];
    				p_mat[k] = p_mat[k+1];
    				p_mat[k+1] = tmp;
    				change = true;
    			}
    		}
    		if(!change) break;
    	}
    "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 © 2024 vBulletin Solutions, Inc. All rights reserved.