Inserimento elementi in array da argomenti riga di comando

di il
11 risposte

Inserimento elementi in array da argomenti riga di comando

Buonasera, avrei bisogno di una mano per quanto riguarda il mio problema.
Infatti giocando un po' con gli argomenti passati tramite riga di comando, sono riuscito a passargli dei vettori (es. "{1, 2, 3, 4}") in formato di stringa e a convertirli in double e sommarli tra loro.
Ma se volessi conservare i double convertiti in un array come dovrei muovermi? Il massimo che sono riuscito a fare è stato conservarmi il primo token
Grazie a chiunque voglia darmi una mano
int main(int argc, char *argv[]) {
	printf("numero di argomenti: %d\n", argc);
	
	printf("nome programma: %s\n", argv[0]);

	int i;
	for (i=1; i<argc; i++) {
		printf("parametro %d : %s\n",i, argv[i]);
	}

	for (i=1; i<argc; i++) {
		pulisciSpazi(argv[i]); 		//elimina spazi 
		pulisciParentesi1(argv[i]); 	//elimina parentesi '{'
		pulisciParentesi2(argv[i]); 	//elimina prentesi '}'
		
		printf("Elementi Vettore : %s\n", argv[i]);

       char *token;
		double num=0;

        // prendo primo token
        token = strtok(argv[i], ",");
			
        // cerco altri tokens
       	while( token != NULL ) {
			   printf( " %s\n", token );	
			   num += strtod(token, NULL);
			   token = strtok(NULL, ",");
       		}
       				
		printf("Somma elementi vettore : %f\n", num);
	}
	return 0;
}

11 Risposte

  • Re: Inserimento elementi in array da argomenti riga di comando

    Non capisco la domanda. Hai fatto la somma e non puoi caricarli in un array? Perché?

    E poi, se nella linea di comando inserisci solo i valori senza parentesi, tipo

    programma.exe 1 2 3 4

    ti basta un semplice ciclo per la somma
    
    int main(int argc, char *argv[]) {
    	printf("numero di argomenti: %d\n", argc);
    
    	printf("nome programma: %s\n", argv[0]);
    
    	int i;
    	for (i = 1; i<argc; i++) {
    		printf("parametro %d : %s\n", i, argv[i]);
    	}
    
    	double num = 0.0;
    	for (i = 1; i<argc; i++)
    	{
    		num += strtod(argv[i], NULL);
    	}
    	
    	printf("Somma elementi vettore : %f\n", num);
    
    	return 0;
    }
    
  • Re: Inserimento elementi in array da argomenti riga di comando

    Il senso della domanda è che dovrei realizzare il prodotto scalare tra due vettori e sto cercando di fare questo esercizio arrivandoci passo passo perché non mi piace avere la pappa pronta, dunque mi servirebbero tutti i numeri in due array. Il problema è che riesco ad inserire solo il primo numero e dunque il mio prodotto scalare non è corretto (ovviamente il codice sviluppato è diverso).
    Comunqnue in ingresso avrei due vettori del tipo:
    ./programma "{1, 2, 3, 4}" "{5, 6, 7 ,8}"
  • Re: Inserimento elementi in array da argomenti riga di comando

    Ti conviene un input di questo tipo

    ./programma 1 2 3 4 , 5 6 7 8

    e puoi ottenere lo stesso risultato con molto meno codice.
  • Re: Inserimento elementi in array da argomenti riga di comando

    Eh purtroppo l'esercizio mi richiede esplicitamente quegli input.
    Posso inserire l'altro mio codice per il prodotto?
  • Re: Inserimento elementi in array da argomenti riga di comando

    Allora, a grandi linee, quando esamini la stringa e incontri la parentesi aperta, imposta un flag che ti permetta di distinguere il fatto che devi riempire il secondo vettore.
  • Re: Inserimento elementi in array da argomenti riga di comando

    oregon ha scritto:


    Allora, a grandi linee, quando esamini la stringa e incontri la parentesi aperta, imposta un flag che ti permetta di distinguere il fatto che devi riempire il secondo vettore.
    ma non è tanto questo il mio problema, se come input ho due vettori nei miei array riesco ad inserire solo il primo elemento
    Ad esempio: "{2,2,3,4}" "{6,1,1,1}" e ne calcolo il prodotto scalare mi viene 12. Anche se mi stampo gli array noto che solo nel primo elemento di entrambi si inserisce il numero.
    Probabilmente l'errore è nell' uso di strtod
    void conversione( char *stringa, double *vettore){
    	char *endPtr;
    	int i;
    	for(i = 0; i<100; i++){
    		vettore[i] = strtod(stringa,&endPtr);
    		stringa = endPtr;
    	}
    }
    
    double prodotto_scalare(double vettore1[], double vettore2[]){
    	double prodotto = 0;
    	int i;
    	for(i = 0; i<100; i++){
    		prodotto += (vettore1[i]*vettore2[i]);
    	}
    	return prodotto;
    }
  • Re: Inserimento elementi in array da argomenti riga di comando

    Ma queste funzioni che hai proposto come si integrano con il main? Mostra tutto il codice altrimenti non si capisce nulla.
  • Re: Inserimento elementi in array da argomenti riga di comando

    oregon ha scritto:


    Ma queste funzioni che hai proposto come si integrano con il main? Mostra tutto il codice altrimenti non si capisce nulla.
    Hai ragione, ecco tutto il codice
    
    void pulisciSpazi (char * stringa) {
            int i = 0;
            int scrittura = 0;
            while (stringa[i] != '\0') {
                    //salto gli spazi non entrando in if
                    if (stringa[i] != (' ')){
                            stringa[scrittura] = stringa[i];
                            scrittura++;
                    }
                    i++;
            }
            stringa[scrittura] = '\0';
    }
    
    void pulisciParentesi1 (char * stringa) {
            int i = 0;
            int scrittura = 0;
            while (stringa[i] != '\0') {
                    //salto le parentesi aperte non entrando in if
                    if (stringa[i] != ('{')){
                            stringa[scrittura] = stringa[i];
                            scrittura++;
                    }
                    i++;
            }
            stringa[scrittura] = '\0';
    }
    
    void pulisciParentesi2 (char * stringa) {
            int i = 0;
            int scrittura = 0;
            while (stringa[i] != '\0') {
                    //salto le parentesi chiuse non entrando in if
                                    if (stringa[i] != ('}')){
                            stringa[scrittura] = stringa[i];
                            scrittura++;
                    }
                    i++;
            }
            stringa[scrittura] = '\0';
    }
    void conversione( char *stringa, double *vettore){
    	char *endPtr;
    	int i;
    	for(i = 0; i<100; i++){
    		vettore[i] = strtod(stringa,&endPtr);
    		stringa = endPtr;
    		if(*stringa == '\0') {
    			break;
    		}
    	}
    }
    
    double prodotto_scalare(double vettore1[], double vettore2[]){
    	double prodotto = 0;
    	int i;
    	for(i = 0; i<100; i++){
    		prodotto += (vettore1[i]*vettore2[i]);
    	}
    	return prodotto;
    }
    
    int main(int argc, char *argv[]){
    	double vettore1[100];
    	double vettore2[100];
    	double risultato;
    		
    	printf("numero di argomenti: %d\n", argc);
    	printf("nome programma: %s\n", argv[0]);
    	int i;
    	for (i=1; i<argc; i++) {
    		printf("parametro %d : %s\n",i, argv[i]);
    	}
    
    	for (i=1; i<argc; i++) {
    		pulisciSpazi(argv[i]);      		//elimina gli spazi
            	pulisciParentesi1(argv[i]); 	//elimina parentesi '{'
    		pulisciParentesi2(argv[i]); 	//elimina parentesi '}'
    		printf("Elementi Vettore : %s\n", argv[i]);
    	}
        conversione(argv[1], vettore1);
    	conversione(argv[2], vettore2);
    		
        risultato = round(prodotto_scalare(vettore1, vettore2));
    	printf("Prodotto scalare tra i vettori: %f\n", risultato);
    				
    
    	return  (int) risultato;
    }
  • Re: Inserimento elementi in array da argomenti riga di comando

    Nella conversione devi spostare il puntatore con stringa++ per saltare la virgola
    
    		if (*stringa == '\0') {
    			break;
    		}
    		stringa++;
    
    Attenzione al prodotto che lavora sempre su 100 elementi.
  • Re: Inserimento elementi in array da argomenti riga di comando

    Ti ringrazio moltissimo perché non riuscivo a venirne a capo

    oregon ha scritto:


    Attenzione al prodotto che lavora sempre su 100 elementi.
    ecco questo, forse, potrebbe essere un ottimo spunto anche perché l'esercizio mi indica che i due vettori inseriti devono avere lo stesso numero di argomenti, ma non so veramente come agire per questo tipo di controllo
  • Re: Inserimento elementi in array da argomenti riga di comando

    filipp01 ha scritto:


    oregon ha scritto:


    Attenzione al prodotto che lavora sempre su 100 elementi.
    ecco questo, forse, potrebbe essere un ottimo spunto anche perché l'esercizio mi indica che i due vettori inseriti devono avere lo stesso numero di argomenti, ma non so veramente come agire per questo tipo di controllo
    Alla fine ho riutilizzato il primo codice postato del token per verificare se i due vettori inseriti sono della stessa grandezza. Scrivendo ora la condizione if-else nel main mi è venuto un dubbio, devo comunque far ritornare la funzione o basta la funzione exit ?
    In sostanza, qual è la chiusura più corretta?
    return EXIT_FAILURE;
    //oppure
    exit (EXIT_FAILURE);
Devi accedere o registrarti per scrivere nel forum
11 risposte