PDA

View Full Version : [C] Scambio di sottointervalli


Manugal
16-11-2005, 13:31
Ciao. :)

Devo scrivere un programma che dato un vettore t[0,...,n-1] di interi di dimensione n ed una posizione 0<=m<=n-1, devo considerarlo diviso in due sotto intervalli t[0,...,m-1][m,...,n-1]. Mi deve restituire il vettore t con questi due sottointervalli intercambiati.
Cioè il vettore t in output deve essere t[m,...,n|0,...m-1].

Esempio
Input : t: =[1,2,3,4,5,6,7,8] e m:= 4
Output deve essere =[5,6,7,8,1,2,3,4]

Il codice l'ho scritto però ho notato che non stampa la parte "dopo lo scambio":



#include <stdio.h>
#include <stdlib.h>

int *interscambio(int [], int, int);

int main(void){

int i,n,m, *risultato;

printf("Inserisci la lunghezza del vettore: ");
scanf("%d", &n);

int *t=(int*) malloc(sizeof(int)*n);

for(i=0; i<n; ++i)
scanf("%d", &t[i]);

printf("Inserisci il punto in cui interscambiare: ");
scanf("%d", &m);

printf("Prima dello scambio: \n");
for(i=0; i<n; ++i)
printf("%d", t[i]);

risultato=interscambio(t,n,m);

printf("\nDopo lo scambio: \n%s");
for(i=0; i<n; ++i)
printf("%d", risultato[i]);

return 0;
}

int *interscambio(int t[], int n, int m){

int *aux=(int *) malloc(sizeof(int)*n);
int i,k=0;

for(i=m; i<n; ++i)
aux[k++]=t[i];

for(i=0; i<m; ++i)
aux[k++]=t[i];

return aux;
}



Chi mi può aiutare? Grazie.

andbin
16-11-2005, 16:37
Ciao, a parte il fatto che il tuo programma non è C ma C++, io l'ho provato e ti posso dire che stampa i dati dopo lo scambio.

Manugal
16-11-2005, 16:55
Come in C++?? :mbe:

Veramente è in ANSI C. E poi lo compilo tramite gcc e mi riesce a stampare fino a "Prima dello scambio".

andbin
16-11-2005, 17:07
Come in C++?? :mbe:

Veramente è in ANSI C. E poi lo compilo tramite gcc e mi riesce a stampare fino a "Prima dello scambio".
In "C" non si può dichiarare una variabile dopo aver eseguito delle istruzioni (il C++ permette questa cosa).

scanf("%d", &n);

int *t=(int*) malloc(sizeof(int)*n);
Il sorgente come l'hai chiamato come estensione? .c, o altro??
Io l'ho provato con gcc su linux. Ho dovuto chiamarlo prova.cpp perché altrimenti se lo chiami prova.c il compilatore ti dice:

prova.c: In function `main':
prova.c:13: parse error before `int'
prova.c:16: `t' undeclared (first use in this function)
prova.c:16: (Each undeclared identifier is reported only once
prova.c:16: for each function it appears in.)

Manugal
16-11-2005, 17:13
Non mi dire che è questo il problema :eek: :eek: . Ora provo e ti faccio sapere grazie. :)

Manugal
16-11-2005, 17:18
Ho provato a togliere la dichiarazione della variabile dopo lo scanf, ma non cambia niente. :(

andbin
16-11-2005, 19:26
Ho provato a togliere la dichiarazione della variabile dopo lo scanf, ma non cambia niente. :(
Ciao, intanto, giusto per sapere, il tuo sorgente ha estensione .c? E se è .c non ti da errori in compilazione?? Usi il gcc in ambiente linux oppure in Windows (so che esiste un porting, anche se non l'ho mai usato)?
Fammi sapere ... a me funziona (in linux).

AnonimoVeneziano
16-11-2005, 20:11
Alcune estensioni del C (supportate da GCC) supportano la dichiarazione dopo la prima istruzione nel blocco corrente.

Ciao

Manugal
16-11-2005, 20:16
Il compilatore in ogni caso non mi dava errori né prima né adesso che ho cambiato la dichiarazione delle variabili. Come estensione uso sempre .c. E uso Codeblocks come IDE (il quale usa gcc per compilare) sotto Windows.

andbin
16-11-2005, 20:26
Alcune estensioni del C (supportate da GCC) supportano la dichiarazione dopo la prima istruzione nel blocco corrente.

Ciao
Sì, questo è vero. Come anche il fatto, ad esempio, che ormai la maggior parte dei compilatori "digerisce" bene il commento // anche nei sorgenti "C", nonostante non sia affatto valido nell'ANSI C.
Io ho provato il sorgente con il gcc 2.91.66 (molto vecchio :( ) e ho dovuto compilarlo come c++ altrimenti dava errore.
Personalmente uso (e consiglio di usare) sempre i parametri -ansi e -pedantic del gcc, in modo da assicurarsi che operi secondo lo standard. Ciao.

Manugal
16-11-2005, 21:01
Ho caoito grazie. Più che altro mi interessava che il programma funzionasse.