PROBLEMA FUNZIONE

di il
4 risposte

PROBLEMA FUNZIONE

Ciao a tutti,
premetto che non studio informatica ma devo dare l'esame di programmazione C e mi trovo alquanto in difficoltà non avendo mai studiato niente di programmazione. In particolare sono bloccata a questo esercizio:
"Scrivere una procedura che restituisca, nei parametri *neg e *pos, rispettivamente, la somma dei valori negativi e quella dei valori positivi."
Quello che ho scritto è:

#include <stdio.h>

int print_array(int a[], int dim);
int array(int a[], int dim);

int main()
{
int a[4]={-98,4,-5,6};
int neg;
int pos;
print_array(a,4);
printf("\n");
array(a,4);

printf("%d\n %d\n", neg, pos);
system("PAUSE");
return 0;
}
int print_array(int a[], int dim) {
int i;
for(i=0;i<dim;i++) {
printf("%d\n", a);
}
}

int array(int a[], int dim){
int i;
int neg=0;
int pos=0;
for(i=0;i<dim;i++) {
if(a<0)
{
neg=neg+a;
}
else {
pos=pos+a;
}

}
return (neg);
return (pos);
}


Ovviamente neg e pos non mi restituiscono i valori giusti .
L'unico modo per far tornare l'esercizio l'ho trovato portando " printf("%d\n %d\n", neg, pos);" dentro la funzione array ed eliminando quindi i due return. Proprio oggi però il mio prof mi ha detto di non usare il printf dentro la funzione. In cosa sbaglio secondo voi?
Grazie mille in anticipo.

4 Risposte

  • Re: PROBLEMA FUNZIONE

    Ciao, hai sbagliato un po di cosucce

    se una funzione è dichiarata con "int":
    int funzione (...)
    {
    
    }
    allora dovrà restituire (con "return") qualcosa altrimenti metti "void" al posto di int
    nella funzione print_array

    per restituire più di due valori non si può fare come hai fatto tu perchè return fa terminare la
    funzione e ritorna il valore quindi ritornava solo il valore del primo return e mai quello del secondo

    per ritornare due o più valori si possono usare i puntatori:
    
    void ritorna_due_oggetti(int *ogg1, int *ogg2)
    {
        *ogg1 = 3;
        *ogg2 = *ogg1 + 2;
    }
    
    //e si richiamerà così nel main:
    int ogg1, ogg2;
    ritorna_due_oggetti(&ogg1, &ogg2);
    printf("%d,%d\n",ogg1, ogg2);
    
    il "brutto" è che devi mettere davanti sempre l'asterisco...

    c'è un secondo modo ovvero con gli alias (come se dai un altro nome alla tua variabile,
    non ne crei una nuova è sempre la stessa):
    
    void ritorna_Due_Valori(int &ogg1, int &ogg2)
    {
       ogg1 = 3;
       ogg2 = ogg1 + 2;
    }
    
    //e si richiamerà così nel main:
    int ogg1, ogg2;
    ritorna_due_oggetti(ogg1, ogg2);
    printf("%d,%d\n",ogg1, ogg2);
    
    NB: gli & per ritornare l'indirizzo della variabile sono diversi dagli & per creare gli alias,
    i primi si usano sulle variabili, i secondi soltanto quando si creano le variabili, per indicare che quello è un alias (sinonimo) di un altra variabile.

    se vuoi ritornare i vettori e i puntatori non serve usare gli alias ovviamente

    
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    void print_array(int a[], int dim);
    void _array(int a[], int dim, int &neg, int &pos);
    
    int main()
    {
    	int a[4]={-98,4,-5,6};
    	int neg;
    	int pos;
    	print_array(a,4);
    	printf("\n");
    	_array(a,4, neg, pos);
    
    	printf("%d\n %d\n", neg, pos);
    	system("PAUSE");
    	return 0;
    }
    void print_array(int a[], int dim)
    {
    	int i;
    	for(i=0;i<dim;i++)
    	{
    		printf("%d\n", a[i]);
    	}
    }
    
    void _array(int a[], int dim, int &neg, int &pos)
    {
    	int i;
    	neg=0;
    	pos=0;
    	for(i=0;i<dim;i++)
    	{
    		if(a[i]<0)
    		{
    			neg=neg+a[i];
    		}
    		else
    		{
    			pos=pos+a[i];
    		}
    	}
    }
  • Re: PROBLEMA FUNZIONE

    La prima cosa sbagliata è l'uso di DEV-C++
    
    #include <stdio.h>
    
    void print_array(int a[], int dim);
    void array(int a[], int dim,int* outpos,int* outneg);
    
    int main()
    {
        int a[4]={-98,4,-5,6};
        int neg,pos;
    
        print_array(a,4);
        printf("\n");
    
        array(a,4,&pos,&neg);
    
        printf("%d\n %d\n", neg, pos);
    
        return 0;
    }
    
    void print_array(int a[], int dim)
    {
        int i;
        for(i=0;i<dim;i++)
            printf("a[%d]=%d\n", i,a[i]);
    }
    
    void array(int a[], int dim,int* outpos,int* outneg)
    {
        *outpos = 0;
        *outneg = 0;
    
        int i;
        for(i=0;i<dim;i++)
        {
            if(a[i]<0)
                *outneg += a[i];
            else
                *outpos += a[i];
        }
    }
    
    teseien nel linguaggio c non esiste il paggaggio per riferimento
    void ritorna_Due_Valori(int &ogg1, int &ogg2)
    questo frammento di codice è valido per il c++ ma non per il c!
  • Re: PROBLEMA FUNZIONE

    Grazie mille a entrambi. Ho corretto l'esercizio e mi torna adesso. Già che ci sono vorrei porvi un altro quesito su un altro esercizio. Questa volta l'esercizio mi chiede di scrivere, dato un array di interi, una procedura che restituisca il numero degli elementi che seguono il valore minimo. Se il valore minimo compare più volte si deve considerare la prima occorrenza.
    Tralasciando il fatto che nemmeno ci sono arrivata a scrivere cosa fare se il valore minimo compare più volte, questo è quello che sono riuscita a scrivere :
    
     #include <stdio.h>
    
    void print_array(int a[], int dim);
    int _array(int a[], int dim);
    
    int main () {
    int a[4]={98,4,12,6};
    int minimo;
    int conta;
    
    print_array(a,4);
    printf("\n");
    
    _array(a,4);
    printf("%d\n", _array(a,4));
    
    system ("PAUSE");
    return 0;
    }
    
    void print_array(int a[], int dim) {
    int i;
    for (i=0; i<dim; i++) {
    printf("%d\n", a[i]);
    }
    }
    
    int _array(int a[], int dim) {
    int i, j;
    int conta=0;
    int minimo=a[0];
    
    for(i=0; i<dim; i++) {
    if(a[i]<minimo)
    a[i]=minimo;
    for(j=i; j<dim; j++) {
    conta=conta+1;
    } 
    }
    return (conta);
    }
    
    
    di sicuro sto utilizzando due cicli for sbagliati, ma il mio ragionamento è questo: una volta trovato il minimo a partire da quello inizia a contare fino alla fine dell'array. Come risultato però mi esce 10... grazie ancora!
  • Re: PROBLEMA FUNZIONE

    Nuova domanda nuovo thread
Devi accedere o registrarti per scrivere nel forum
4 risposte