Difference between revisions of "Esercizio 1, prova pratica 12/02/2009"

From Sistemi Operativi
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;
	}

}

Eddy (talk) 21:00 Saturday, 22 November 2014 (CET)