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">...") | |||
| (4 intermediate revisions by 4 users not shown) | |||
| 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) | ||
| + | |||
| + | ==Soluzione di GFede== | ||
| + | <source lang="c"> | ||
| + | #include <stdio.h> | ||
| + | #include <unistd.h> | ||
| + | #include <errno.h> | ||
| + | |||
| + | void scambia(int offset, int argc, char* argv[]); | ||
| + | |||
| + | int main(int argc, char* argv[]) | ||
| + | { | ||
| + |    if(argc <= 1) | ||
| + |    { | ||
| + |       printf("Usage: invarg.exe command [arguments...]\n"); | ||
| + |       return 2; | ||
| + |    } | ||
| + |    scambia(2, argc - 1, argv); | ||
| + | |||
| + |    execvp(argv[1], argv + 1); | ||
| + |    perror("execvp"); | ||
| + |    return 1; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + |  * Scambia le stringhe all'interno dell'array | ||
| + |  * void scambia | ||
| + |  * int offset     Indice da cui iniziare a scambiare | ||
| + |  * int argc       Numero di valori nell'array (Compreso l'offset) | ||
| + |  * char* argv[]   array di stringhe da scambiare | ||
| + |  */ | ||
| + | void scambia(int offset, int argc, char* argv[]) | ||
| + | { | ||
| + |    int i; | ||
| + |    char* tmp; | ||
| + |    for( i = offset; i < argc - i + offset; i++ ) | ||
| + |    { | ||
| + |       tmp = argv[i]; | ||
| + |       argv[i] = argv[argc - i + offset]; | ||
| + |       argv[argc - i + offset] = tmp; | ||
| + |    } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | ==Soluzione di LorenzoV== | ||
| + | <source lang="c"> | ||
| + | #include <stdlib.h> | ||
| + | #include <stdio.h> | ||
| + | |||
| + | void swap(char **p, char **q){		// La swap modifica solo i puntatori | ||
| + | 	char *tmp; | ||
| + | 	tmp=*p; | ||
| + | 	*p=*q; | ||
| + | 	*q=tmp; | ||
| + | } | ||
| + | |||
| + | int main(int argc, char* argv[]){	 | ||
| + | 	char **begin, **end; | ||
| + | 	if (argc<3){ | ||
| + | 		fprintf(stderr, "Usage:\n\t%s command ...arguments...\n", argv[0]); | ||
| + | 		exit(1);	 | ||
| + | 	}	 | ||
| + | 	begin=argv+2; | ||
| + | 	end=argv+argc-1; | ||
| + | 	while (begin<end){		// Inverte i parametri passati al comando | ||
| + | 		swap(begin, end); | ||
| + | 		begin++; | ||
| + | 		end--; | ||
| + | 	} | ||
| + | 	execvp(argv[1], argv+1); | ||
| + | 	return 0; | ||
| + | } | ||
| + | </source> | ||
| + | --[[User:LorenzoV|LorenzoV]] ([[User talk:LorenzoV|talk]]) 18:35, 25 November 2014 (CET) | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==Soluzione di BoldrinD== | ||
| + | <source lang="c"> | ||
| + | #include <stdio.h> | ||
| + | #include <unistd.h> | ||
| + | #include <errno.h> | ||
| + | |||
| + | void invarg(int Qparametri, char* Rargv[], char* argv[]); | ||
| + | |||
| + | int main(int argc, char* argv[]){ | ||
| + | 	int Qparametri=argc-1;	 | ||
| + | 	char *Rargv[Qparametri]; | ||
| + | 	invarg(Qparametri, Rargv, argv); | ||
| + | 	printf("%s\n","il nuovo vettore dei parametri è stato creato con successo"); | ||
| + |    	execvp(Rargv[0], Rargv); | ||
| + |   	 perror("execvp"); | ||
| + |    return 1; | ||
| + | |||
| + | } | ||
| + | |||
| + | void invarg(int Qparametri, char* Rargv[], char* argv[]){ | ||
| + | 	Rargv[0]=argv[1]; | ||
| + | 	Rargv[Qparametri]=NULL; | ||
| + | 	int i=2; | ||
| + | 		while(argv[i]!=NULL){ | ||
| + | 		Rargv[Qparametri-1]=(argv[i]); | ||
| + | 		i++; | ||
| + | 		Qparametri--; | ||
| + | 		} | ||
| + | |||
| + | } | ||
| + | </source> | ||
| + | |||
| + | |||
| + | ==Soluzione di AleZ== | ||
| + | <source lang="c"> | ||
| + | #include <stdio.h> | ||
| + | #include <stdlib.h> | ||
| + | |||
| + | int main (int argc, char* argv[]) { | ||
| + | 	if (argc == 1) {	// Non è stato passato alcun comando per la execvp | ||
| + | 		fprintf(stderr, "Error: Segmentation fault\nUsage: [command] [arguments...]\n"); | ||
| + | 		return(EXIT_FAILURE); | ||
| + | 	} | ||
| + | 	char* tmp[argc];	// vettore che conterrà gli argomenti scambiati | ||
| + | 	int i = 0; | ||
| + | 	tmp[0] = argv[1];	// per convenzione il primo argomento è il programma chiamato | ||
| + | 	tmp[argc-1] = (char*)NULL;	// come da manuale | ||
| + | 	for (i = argc-2; i > 0; i--) tmp[i] = argv[(argc-i)];	// inverto gli argomenti  | ||
| + | 	execvp(tmp[0], tmp); | ||
| + | 	fprintf(stderr, "%s: command not found\n", argv[1]);	//execvp ha fallito | ||
| + | 	return(EXIT_FAILURE); | ||
| + | } | ||
| + | </source> | ||
| + | --[[User:Ale|Ale]] ([[User talk:Ale|talk]]) 20:39, 1 December 2014 (CET) | ||
Latest revision as of 20:39, 1 December 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)
Soluzione di GFede
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
void scambia(int offset, int argc, char* argv[]);
int main(int argc, char* argv[])
{
   if(argc <= 1)
   {
      printf("Usage: invarg.exe command [arguments...]\n");
      return 2;
   }
   scambia(2, argc - 1, argv);
   execvp(argv[1], argv + 1);
   perror("execvp");
   return 1;
}
/**
 * Scambia le stringhe all'interno dell'array
 * void scambia
 * int offset     Indice da cui iniziare a scambiare
 * int argc       Numero di valori nell'array (Compreso l'offset)
 * char* argv[]   array di stringhe da scambiare
 */
void scambia(int offset, int argc, char* argv[])
{
   int i;
   char* tmp;
   for( i = offset; i < argc - i + offset; i++ )
   {
      tmp = argv[i];
      argv[i] = argv[argc - i + offset];
      argv[argc - i + offset] = tmp;
   }
}
Soluzione di LorenzoV
#include <stdlib.h>
#include <stdio.h>
void swap(char **p, char **q){		// La swap modifica solo i puntatori
	char *tmp;
	tmp=*p;
	*p=*q;
	*q=tmp;
}
int main(int argc, char* argv[]){	
	char **begin, **end;
	if (argc<3){
		fprintf(stderr, "Usage:\n\t%s command ...arguments...\n", argv[0]);
		exit(1);	
	}	
	begin=argv+2;
	end=argv+argc-1;
	while (begin<end){		// Inverte i parametri passati al comando
		swap(begin, end);
		begin++;
		end--;
	}
	execvp(argv[1], argv+1);
	return 0;
}
--LorenzoV (talk) 18:35, 25 November 2014 (CET)
Soluzione di BoldrinD
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
void invarg(int Qparametri, char* Rargv[], char* argv[]);
int main(int argc, char* argv[]){
	int Qparametri=argc-1;	
	char *Rargv[Qparametri];
	invarg(Qparametri, Rargv, argv);
	printf("%s\n","il nuovo vettore dei parametri è stato creato con successo");
   	execvp(Rargv[0], Rargv);
  	 perror("execvp");
   return 1;
}
void invarg(int Qparametri, char* Rargv[], char* argv[]){
	Rargv[0]=argv[1];
	Rargv[Qparametri]=NULL;
	int i=2;
		while(argv[i]!=NULL){
		Rargv[Qparametri-1]=(argv[i]);
		i++;
		Qparametri--;
		}
}
Soluzione di AleZ
#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char* argv[]) {
	if (argc == 1) {	// Non è stato passato alcun comando per la execvp
		fprintf(stderr, "Error: Segmentation fault\nUsage: [command] [arguments...]\n");
		return(EXIT_FAILURE);
	}
	char* tmp[argc];	// vettore che conterrà gli argomenti scambiati
	int i = 0;
	tmp[0] = argv[1];	// per convenzione il primo argomento è il programma chiamato
	tmp[argc-1] = (char*)NULL;	// come da manuale
	for (i = argc-2; i > 0; i--) tmp[i] = argv[(argc-i)];	// inverto gli argomenti 
	execvp(tmp[0], tmp);
	fprintf(stderr, "%s: command not found\n", argv[1]);	//execvp ha fallito
	return(EXIT_FAILURE);
}