Difference between revisions of "Esercizio 1, prova pratica 12/02/2009"
Jump to navigation
Jump to search
(Created page with "Ho provato a svolgere l'esercizio 1 dell'esame di laboratorio del 2 febbraio 2009 ([http://www.cs.unibo.it/~renzo/so/pratiche/2009.02.12.pdf]). Consegna: <source lang="text">...") |
|||
Line 29: | Line 29: | ||
} | } | ||
</source> | </source> | ||
+ | |||
+ | ==Soluzione di Eddy== | ||
+ | <source lang="c"> | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <errno.h> | ||
+ | |||
+ | void scambia_ordine(int argc, char **argv, int j); | ||
+ | |||
+ | int main(int argc , char* argv[]) | ||
+ | { | ||
+ | if (argc < 2) return 2; | ||
+ | argv++; argc--; | ||
+ | scambia_ordine(argc, argv, 1); | ||
+ | execvp(argv[0], argv); | ||
+ | perror("execvp"); | ||
+ | return 3; | ||
+ | } | ||
+ | |||
+ | /* piccola funzione ricorsiva che: | ||
+ | * -memorizza in tmp gli argomenti dalla fine | ||
+ | * -assegna ad argv in ordine inverso | ||
+ | * | ||
+ | * non scambia il primo argomento | ||
+ | */ | ||
+ | void scambia_ordine(int argc, char **argv, int j) | ||
+ | { | ||
+ | char *tmp; | ||
+ | if (argc > 1){ | ||
+ | tmp = argv[argc-1]; | ||
+ | scambia_ordine (argc-1, argv, j+1); | ||
+ | argv[j]=tmp; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </source> | ||
+ | [[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 21:00 Saturday, 22 November 2014 (CET) |
Revision as of 20:50, 22 November 2014
Ho provato a svolgere l'esercizio 1 dell'esame di laboratorio del 2 febbraio 2009 ([1]).
Consegna:
Esercizio1 (obbligatorio): (10 punti)
Scrivere un programma C denominato “invarg” che esegua il programma passato come parametro invertendo gli argomenti.
Esempio:
invarg cat a b c
deve avere l'effetto di
cat c b a
Soluzione di Maldus
#include <stdio.h>
#include <stdlib.h>
int main(int argc , char* argv[]){
char *nargv[argc-1] ; /*nargv è il vettore degli argomenti da passare al programma da eseguire*/
int i , j ; /*puntatori che scorrono, rispettivamente, argv ed nargv per riempire correttamente nargv*/
nargv[0] = argv[1] ; /*il primo valore di nargv deve essere il programma chiamato, l'ultimo deve essere NULL*/
nargv[argc-1] = NULL ;
for( i = argc - 1 , j = 1 ; i > 1 , j < (argc - 1) ; i-- , j++ ) nargv[j] = argv[i] ; /*metto in nargv (dal secondo elemento in poi) gli argomenti presenti
in argv in ordine invertito*/
execvp( nargv[0] , nargv ) ; /*eseguo il programma (il cui nome è contenuto in nargv[0]) passandogli nargv come vettore di parametri*/
fprintf( stderr , "programma errato\n" ) ; /*se ci troviamo in questo punto significa che la chiamata a execvp è fallita, probabilmente
perchè il programma indicato non è stato trovato*/
exit(1) ;
}
Soluzione di Eddy
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
void scambia_ordine(int argc, char **argv, int j);
int main(int argc , char* argv[])
{
if (argc < 2) return 2;
argv++; argc--;
scambia_ordine(argc, argv, 1);
execvp(argv[0], argv);
perror("execvp");
return 3;
}
/* piccola funzione ricorsiva che:
* -memorizza in tmp gli argomenti dalla fine
* -assegna ad argv in ordine inverso
*
* non scambia il primo argomento
*/
void scambia_ordine(int argc, char **argv, int j)
{
char *tmp;
if (argc > 1){
tmp = argv[argc-1];
scambia_ordine (argc-1, argv, j+1);
argv[j]=tmp;
}
}