|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
|
[C] Invertire un array...??
Detto sinceramente pensavo che fosse un argomento già affrontato, quindi ho usato la funzione cerca con scarsi risultati.. se come immagino non sono stato capace di usarla decentemente chiedo scusa a mod e admin (so quanto irriti vedere più volte uno stesso Topic
Quello che vorrei chiedervi è questo: è possibile invertire un array ordinato a[i] senza usare nessun array di supporto?? per invertire intendo che da a {1, 2, 3, 4} voglio a {4, 3, 2, 1}.. posso farlo senza introdurre un eventuale b[i]? Grazie P.S. l'ho scritto nel titolo del topic, ma per sicurezza ribadisco che programmo in C |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Certo, si tratta di un'inversione in place/in loco. È un'operazione ricorsivamente banale:
Codice:
void exchange(int *array, int i, int j)
{
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
Ora, siccome mi pare sia vietato dal regolamento dare le soluzioni agli esercizi, ti dico che manca solo un pezzetto di codice. Immagina di avere due indici, uno che rappresenta l'elemento iniziale ed uno che rappresenta l'elemento finale dell'array, e pensa a cosa puoi fare con una funzione che scambia due elementi alla volta: penso che la soluzione sarà immediata.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
|
Prima di tutto ti ringrazio per avermi risposto!
Seconda cosa... importantissima... voglio precisare che questo è il mio primo anno alla facoltà di informatica (l'anno scorso ero a psicologia... BLEEEAH!! XD).. e ho cominciato a studiare programmazione da un mesetto (perchè non prima? perchè sono un idiota e mi sono lasciato gli arretrati dicendo ok sì poi studio... ora provo a riportarti il codice del programma che ho scritto... Codice:
#include <stdio.h>
#include <stdlib.h>
int inverti (int *a, int i, int n);
main ()
{
int *a, n, i, j;
printf ("Quante locazioni deve contenere il tuo array?\n");
scanf ("%d", &n);
a= (int*) malloc (n*sizeof(int));
for (i=0; i<=n; i++) {
printf ("Inserisci il valore n.%d\n", i);
scanf ("%d", &a[i]); }
printf ("Gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=0; i<=n; i++) {
printf ("%d) %d\n", i, a[i]); }
inverti (a, i, n);
printf ("Ora gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=0; i<=n; i++) {
printf ("%d) %d\n", i, a[i]); }
system ("pause");
}
int inverti (int *a, int i, int n) {
int *ptemp, j;
for (i=0; i<(n/2); i++) {
*ptemp = a[j];
a[j] = a[i];
a[i] = *ptemp;
}
return *a;
}
però poi alla fine la classica frase fatta "e che mi so imparato?" ritorna sempre... il 16 ho una prova di intercorso e se mi aiuti a capire ti sarei moooolto grato!!! grazie milleeee! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Innanzitutto, devi stare attento agli indici quando fai un loop: nel tuo caso hai usato:
Codice:
for (i=0; i<=n; i++) Attenzione poi alle chiamate di funzioni: Codice:
inverti (a, i, n); Arriviamo al punto dolente... Codice:
int inverti (int *a, int i, int n) {
int *ptemp, j;
for (i=0; i<(n/2); i++) {
*ptemp = a[j];
a[j] = a[i];
a[i] = *ptemp;
}
return *a;
}
La variabile ptemp deve essere un semplice intero, non ha bisogno di puntare a niente (ed eventualmente puoi usare la funzione che ti ho scritto prima per effettuare degli scambi senza usare variabili aggiuntive). In più, se avete già studiato la ricorsione ti dirò che la funzione inverti() può anche essere lunga esattamente due righe e funzionare correttamente. ciao P.S.: Dev-C++? Ommadonna, quello è la fonte di molti problemi! Prova Code::Blocks... e ricorda sempre (almeno mentre studi) di compilare con tutti i warning del compilatore attivati (per GCC le opzioni sono -W -Wall, se l'IDE te lo chiedesse).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 09-12-2008 alle 20:51. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Aspetta, mi era sfuggito anche che la memoria che allochi per il vettore poi non la liberi alla fine del main() con una free() corrispondente.
In definitiva, ti direi di ripassare:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
|
ho risolto così:
Codice:
#include <stdio.h>
#include <stdlib.h>
int inverti (int *a, int n);
main ()
{
int *a, n, i;
printf ("Quante locazioni deve contenere il tuo array?\n");
scanf ("%d", &n);
a= (int*)malloc(n*sizeof(int));
for (i=1; i<=n; i++) {
printf ("Inserisci il valore n.%d\n", i);
scanf ("%d", &a[i]); }
printf ("Gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=1; i<=n; i++) {
printf ("%d) %d\n", i, a[i]); }
inverti (a, n);
printf ("Ora gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=1; i<=n; i++) {
printf ("%d) %d\n", i, a[i]); }
system ("pause");
}
int inverti (int *a, int n) {
int temp, i;
for (i=1; i<(n/2); i++) {
temp = a[i];
a[i] = a[n-i+1];
a[n-i+1] = temp;
}
}
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 2516
|
Se usi malloc() devi verificare che la memoria ti sia effettivamente restituita, cosa che non avviene sempre causa possibili memory leak (ancor piu' possibili nel tuo caso
|
|
|
|
|
|
#8 | |
|
Junior Member
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
|
Quote:
che casotto |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 2516
|
![]() Comunque attento che il programma non funziona , io ho immesso il vettore {1,2,3,4,5} ed il risultato e' {5,2,3,4,1} PS: l'indice dei vettori in c parte da 0 |
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
|
|
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
|
Ho provato a cambiare qualcosina:
Codice:
#include <stdio.h>
#include <stdlib.h>
int inverti (int *a, int n);
main ()
{
int n, i;
printf ("Quante locazioni deve contenere il tuo array?\n");
scanf ("%d", &n);
int a[n];
for (i=0; i<=n; i++) {
printf ("Inserisci il valore n.%d\n", i);
scanf ("%d", &a[i]); }
printf ("Gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=0; i<=n; i++) {
printf ("%d) %d\n", i, a[i]); }
inverti (a, n);
printf ("Ora gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=0; i<=n; i++) {
printf ("%d) %d\n", i, a[i]); }
system ("pause");
}
int inverti (int *a, int n) {
int temp, i;
for (i=0; i<=n; i++) {
temp = a[i];
a[i] = a[n-i+1];
a[n-i+1] = temp;
}
}
se inserisco {1, 2, 3, 4, 5} mi ritorna {5, 4, 3, 2, 92837482736} perchè fa così? lo odio |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
scusate l'intromissione ... così funziona ? a me sembra di si
Codice:
#include <stdio.h>
#include <stdlib.h>
int inverti (int *a, int n);
int main ()
{
int *a, n, i;
printf ("Quante locazioni deve contenere il tuo array?\n");
scanf ("%d", &n);
a= (int*)malloc(n*sizeof(int));
for (i=0; i<n; i++) {
printf ("Inserisci il valore n.%d\n", i+1);
scanf ("%d", &a[i]); }
printf ("Gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=0; i<n; i++) {
printf ("%d) %d\n", i+1, a[i]); }
inverti (a, n);
printf ("Ora gli elementi del tuo array sono inseriti in questo ordine:\n");
for (i=0; i<n; i++) {
printf ("%d) %d\n", i+1, a[i]); }
system ("pause");
return 0;
}
int inverti (int *a, int n)
{
int temp, i;
for (i=0; i<(n/2); i++)
{
temp = a[i];
a[i] = a[n-1 -i];
a[n-1 -i] = temp;
}
return 0;
}
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Pensa alla soluzione più semplice! Usa due indici ed hai risolto.
Pseudocodice: Codice:
inverti(array, inizio, fine)
if inizio < fine:
scambia(array, inizio, fine)
inverti(array, inizio+1, fine-1)
Codice:
inverti(array, lunghezza)
i = 0
j = lunghezza-1
while i < j:
scambia(array, i, j)
i = i+1
j = j-1
ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]() Cos'è, un quiz? Chi vuol essere milionario?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
|
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
|
siete dei maledettissimi geni
non avete idea di quanto vi sono grato grazie ancora!! a presto |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:22.






















