Newsgroup: it.comp.lang.c
Titolo: Aiuto programma

Ciao a tutti, allora dovrei creare un programma in C ke mi permetta di 
ordinare in senso crescente una matrice data da tastiera prendendo in 
considerazione l'ultimo elemento di ogni colonna, scambiando cosě le colonne 
in modo tale ke gli ultimi elementi delle colonne sono ordinati in senso 
crescente.
es.
21 43 93 13                  21 93 43 13
22 99 23 76      -->       22 23 99 76
12 83 11 56                  12 11 83 56
23 78 32 93                  23 32 78 93
poi inoltre vorrei sapere, qual'č la differenza tra le istruzioni
scanf("%s",&parola);
e
gets(parola);
quando si inserisce in imput una stringa, so ke il gets permette di leggere 
anke gli spazi biachi, mentre lo scanf come si comporta? 

 ha scritto nel messaggio 
news:440c25f0$0$36926$4faf...@reader3.news.tin.it...


 crescente.
*Esattamente* cosa e' che non riesci a fare?
(Mica ti si possono fare noi gli esercizi per casa...)
Considerando che la matrice e' piccola (viene data da tastiera!)
e quindi e' inutile pensare a soluzioni piu' sofisticate,
fai un semplice bubblesort in cui confronti l'ultimo
elemento delle  colonne e in cui lo swap e' lo swap
delle due colonne considerate.
Se la matrice fosse di grandi dimensioni, naturalmente
andrebbe impiegato un algoritmo lievemente piu' furbo...
ciao,
g.

Non riesco a scambiare l'intera colonna, come faccio a scambiare tutti gli 
elementi di una colonna cn un'altra?
"vanvera" <vanve...@CUTgmail.com> ha scritto nel messaggio 
news:440c2978$0$18284$4faf...@reader1.news.tin.it...


 elementi di una colonna cn un'altra?
Mah, non capisco onestamente dove sta il problema!!
Se indichi con c1 e c2 le colonne da scambiare,
e se nella matrice M[][] usi il primo indice per
denotare le righe e il secondo per denotare le colonne,
e se il numero di righe e' nR, e usi, come si fa di solito,
gli indici da 0 in poi, allora  devi solo fare un ciclo
for (i=0; i<nR; i++)
{
 t=M[i][c1];
 M[i][c1]=M[i][c2];
 M[i][c2]=t;
}
dove t e' una variabile ausiliaria dello stesso tipo degli elementi di M.
ciao,
g.

Ecco il programma ke ho scritto, solo ke mi scambia solo gli ultimi elementi 
delle colonne, come faccio a scambiare ogni volta l'intera colonna?
#include <stdio.h>
#include <stdlib.h>
void leggi(int M[][100], int *r, int *c);
void stampa(int M[][100], int r, int c);
int main(int argc, char *argv[])
{ int M[100][100],i,j,temp,pass,r,c;
  leggi(M,&r,&c);
  stampa(M,r,c);
  printf("\n\n");
  for(pass=1; pass<c; pass++)   //Metodo del bubble short
    for(j=0; j<c; j++)
     if(M[r-j-1][i]>M[r-j-1][j+1])
      { temp=M[r-j-1][j];
      M[r-j-1][j]=M[r-j-1][j+1];
      M[r-j-1][j+1]=temp;
      }
      stampa(M,r,c);
  system("PAUSE");
  return 0;
}
void leggi(int M[][100], int *r, int *c)
{ int i,j;
  do
  { printf("Dammi il numero di colonne\n");
    scanf("%d",c);
  }
  while(*c>100);
  do
  { printf("Dammi il numero delle righe\n");
    scanf("%d",r);
  }
  while(*r>100);
  for(i=0; i<*r; i++)
   for(j=0; j<*c; j++)
    {printf("Dammi l'elemento in posizione [%d][%d]\n",i+1,j+1);
     scanf("%d",&M[i][j]);
    }
}
void stampa(int M[][100], int r, int c)
{ int i,j;
for(i=0; i<r; i++)
 {printf("\n");
 for(j=0; j<c; j++)
   printf("%d",M[i][j]);
} }
"Giovanni Resta" <g.res...@CUTiit.cnr.CUTit> ha scritto nel messaggio 
news:duhfia$qg3$1...@news.cineca.it...


 delle colonne, come faccio a scambiare ogni volta l'intera colonna?
Il programma che hai scritto dovrebbe proprio piantarsi, piuttosto
che non funzionare e il compilatore, se compili con l'opzione per
visualizzare tutti i warnings, dovrebbe anche lamentarsi di alcune
cosette.
Prima di tutto: nel programma ci sono solo 2 for.
Il bubblesort di suo richiede due for.
poi ce ne deve essere un terzo per scambiare tutti gli
elementi della colonna.
Nel punto in cui l'algoritmo del bubble sort farebbe uno
scambio ci deve essere un for che scambia, riga per riga,
le coppie di elementi nelle due colonne selezionate.
Se la cosa ti puo' aiutare, definisciti a parte una funzione
ScambiaColonne(int c1, int c2, int nRighe, int M[][100])
che scambia la colonna c1 con la colonna c2 di una matrice M con nRighe righe.
Comunque mi sembra che tu  debba anche andare a rivederti
il metodo del bubble sort, perche' il numero di iterazioni
nel ciclo interno del bubble sort deve dipendere dal
valore dell'indice esterno, cosa che qui non vedo.
poi questa istruzione e' completamente sbagliata:
if(M[r-j-1][i]>M[r-j-1][j+1])
1) stai usando la variabile i, che non e' neanche inizializzata
da nessuna parte....
2) stai mischiando la variabile j, che scandisce presumibilmente le
colonne, visto che fai un for(j=0;j<c;j++) con le righe in modo
incomprensibile, visto che scrivi M[r-j-1][i].
Se per caso le colonne sono piu' delle righe ottieni facilmente un
indice negativo, e questo dovrebbe gia' farti capire che
qualcosa non va bene...
3) quando j arriva a c-1, l'indice j+1 in M[r-j-1][j+1] varra'
c-1+1=c che e' fuori dal range degli indici per la matrice,
visto che partono da 0 e arrivano a c-1.
In questi casi, e' molto utile farsi un esempio 3x3 ed eseguire passo-passo
l'algoritmo "sulla carta", facendo un foglio in cui
scrivere delle caselline in cui andare a copiare i valori delle variabili
aggiornandole via via che si segue il flusso del programma.
In questo modo ti accorgi degli errori, concettuali e non, che commetti e ti
rendi anche conto di come invece dovresti scrivere il programma,
se hai una idea abbastanza chiara dell'algoritmo che avresti voluto
implementare.
Tu mi dirai: nel tempo che hai impiegato a scrivere tutte queste palle
potevi anche scrivermi l'algoritmo completo.  Avresti anche ragione, ma
1) sono bastardo
2) non faccio compiti altrui, a meno che non siano intellettualmente
interessanti. (e questo non lo e'...)
3) capire da solo cosa sbagli e' faticoso, ma ti sara' enormemente di aiuto
per i prossimi programmi.
ciao, :-)
g.