Programmazione C

di il
11 risposte

Programmazione C

Salve! Mi sono appena iscritta, non so bene come funzioni il forum! Mi presento sono una studentessa di ingegneria, sarei grata a chiunque di voi fosse disponibile a darmi una risposta. Devo creare una pila (stack) ,implementata tramite un array statico, e sommare tutti gli elementi estratti da quest'ultima. Come? Ho provato con il comando for, ma non funziona. Davvero grazie a chiunque voglia aiutarmi!


PS: Per quanto riguarda la Pila e l'array, ho già creato il codice,con le relative funzioni! Mi manca solo questo passaggio!

11 Risposte

  • Re: Programmazione C

    Ciao,
    vuoi fare la somma di tutti gli elementi di un array? Allora prova così:
    
    int somma_array(int *array, int dimensione)
    {
        int i, somma = 0;
        for(...)                      /* qui completa tu... */
            somma += array[i];        /* incremento la somma */
    
        return somma;
    }
    
    E comunque, è vietato il crossposting! Link.
  • Re: Programmazione C

    Grazie mille per la risposta! Ho provato ma non funziona! Sono disperata, ho un esame a breve!
  • Re: Programmazione C

    Evidentemente hai qualche errore nel codice, perché il metodo che ti ho postato funziona sicuramente!
  • Re: Programmazione C

    Ok, riproverò! Ti ringrazio! E per quanto riguarda i valori estratti dalla pila sai dirmi qualcosa? come faccio a sommarli? avevo pensato di memorizzarli in un secondo array e poi sommarli con un ciclo for!
  • Re: Programmazione C

    Forse allora stiamo parlando di due cose diverse e la mia risposta di prima non era del tutto pertinente. Quella che ti ho postato prima era una funzione che restituisce la somma dei valori contenuti in un array.

    Se invece vuoi estrarre da una pila (ad esempio con un metodo pop) un valore alla volta e sommarli tutti puoi fare una cosa del genere:
    
    int somma = 0;
    int valore;
    
    for(...)
    {
        valore = pop_sulla_pila();
        somma += valore;
    }
    
    // ora la variabile "somma" contiene la somma dei valori estratti
    
  • Re: Programmazione C

    Ti ringrazio tantissimo per la disponibilità!! Ti chiedo troppo se ti posto il codice?
    Ovviamente quello creato da me, non ti sto chiedendo di farmelo!
  • Re: Programmazione C

    Certo: posta pure.
  • Re: Programmazione C

    #include <stdio.h>
    #include <stdlib.h>

    struct stackNode{
    int data;
    struct StackNode*nextPtr;};
    typedef struct stackNode StackNode;
    typedef StackNode*StackNodePtr;
    void push(StackNodePtr*topPtr,int info);
    int pop(StackNodePtr*topPtr);
    int isEmpty(StackNodePtr topPtr);
    void instructions (void);
    void printStack(StackNodePtr topPtr);
    int main(int argc, char *argv[])
    {
    StackNodePtr stackPtr=NULL;
    int choice;
    int value;

    instructions();
    printf("?");
    scanf("%d",&choice);
    int sum=0;
    int tot=0;
    while(choice!=3){
    switch(choice){
    case 1:
    printf("Inserisci valore\n");
    scanf("%d",&value);
    push(&stackPtr,value);
    sum=sum+value;
    printStack(stackPtr);
    break;

    case 2:
    //Se la pila non è vuota
    if(!isEmpty(stackPtr)){
    printf("Valore prelevato=%d\n",pop(&stackPtr));
    }
    tot=tot+(pop(&stackPtr));
    printStack(stackPtr);
    printf("Somma valori prelevati %d",tot);
    break;

    default:
    printf("Scelta non valida!\n");
    instructions();
    break;
    }//fine switch

    printf("?");
    scanf("%d",&choice);
    }
    printf("Fine\n");
    system("PAUSE");
    return 0;
    }

    void instructions(void)
    {
    printf("Enter choice:\n"
    "1 inserisci un valore\n"
    "2 prelevare un elemento dalla pila\n"
    "3 per terminare il programma!\n");
    }

    void push(StackNodePtr*topPtr, int info)
    {
    StackNodePtr newPtr;
    newPtr=malloc(sizeof(StackNode));
    if(newPtr!=NULL)
    {
    newPtr->data=info;
    newPtr->nextPtr=*topPtr;
    *topPtr=newPtr;}
    else
    {printf("%d non inserito. Memoria non disponibile\n",info);
    }
    }





    int pop(StackNodePtr *topPtr)
    {
    StackNodePtr tempPtr;
    int popValue;
    tempPtr=*topPtr;
    popValue=(*topPtr)->data;
    *topPtr=(*topPtr)->nextPtr;
    free (tempPtr);
    return popValue;
    }

    void printStack(StackNodePtr currentPtr)
    {
    if(currentPtr==NULL)
    {
    printf("La pila è vuota!\n");
    }
    else{
    printf("La pila è :\n")

    while(currentPtr!=NULL){
    printf("%d-->",currentPtr->data);
    currentPtr=currentPtr->nextPtr;
    }
    printf("NULL\n\n");
    }
    }
    int isEmpty(StackNodePtr topPtr)
    {
    return topPtr==NULL;
    }




    Dove sbaglio? Grazie mille!!
  • Re: Programmazione C

    Ho corretto diversi errori. In particolare c'era qualche problema nel caso la scelta dell'utente fosse (2), cioè prelevare un elemento dalla pila, nel qual caso andavi ad eseguire due volte il metodo pop.
    Inoltre cerca di rispettare una sintassi standard: se vuoi dichiarare un puntatore a qualcosa non scrivere
    qualcosa*nome_puntatore;
    ma
    qualcosa *nome_puntatore;
    Cioè lascia lo spazio.

    Comunque ecco il codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct stackNode
    {
    	int data;
    	struct stackNode *nextPtr;
    };
    
    typedef struct stackNode StackNode;
    typedef StackNode* StackNodePtr;
    
    void push(StackNodePtr *topPtr,int info);
    int pop(StackNodePtr *topPtr);
    int isEmpty(StackNodePtr topPtr);
    void instructions (void);
    void printStack(StackNodePtr topPtr);
    int main(int argc, char *argv[])
    { 
    	StackNodePtr stackPtr=NULL;
    	int choice;
    	int value;
    
    	instructions();
    	printf("?");
    	scanf("%d",&choice);
    	int sum=0;
    	int tot=0;
    	int prelevato;
    	while(choice!=3){
    		switch(choice){
    			case 1:
    				printf("Inserisci valore\n");
    				scanf("%d", &value);
    				push(&stackPtr, value);
    				sum=sum+value;
    				printStack(stackPtr);
    				break;
    
    			case 2:
    				//Se la pila non è vuota
    				if(!isEmpty(stackPtr))
    				{
    					prelevato = pop(&stackPtr);
    					printf("Valore prelevato=%d\n",prelevato);
    					tot=tot + prelevato; 
    				}
    				
    				printStack(stackPtr);
    				printf("Somma valori prelevati %d",tot);
    				break;
    
    			default:
    				printf("Scelta non valida!\n");
    				instructions();
    				break;
    		}//fine switch
    
    		printf("?");
    		scanf("%d",&choice);
    	}
    	printf("Fine\n");
    	system("PAUSE");	
    	return 0;
    }
    
    void instructions(void)
    {
    	printf("Enter choice:\n"
    			"1 inserisci un valore\n"
    			"2 prelevare un elemento dalla pila\n"
    			"3 per terminare il programma!\n");
    }
    
    
    
    void push(StackNodePtr *topPtr, int info)
    {
    	StackNodePtr newPtr;
    	newPtr = (StackNodePtr) malloc(sizeof(StackNode));
    	if(newPtr!=NULL)
    	{
    		newPtr->data=info;
    		newPtr->nextPtr = (*topPtr);
    		*topPtr = newPtr;
    	}
    	else
    	{
    		printf("%d non inserito. Memoria non disponibile\n",info);
    	}
    }
    
    
    int pop(StackNodePtr *topPtr)
    {
    	StackNodePtr tempPtr;
    	int popValue;
    	tempPtr = *topPtr;
    	popValue=(*topPtr)->data;
    	*topPtr = (*topPtr)->nextPtr;
    	free (tempPtr);
    	return popValue;
    }
    
    
    void printStack(StackNodePtr currentPtr)
    {
    	if(currentPtr==NULL)
    	{
    		printf("La pila è vuota!\n");
    	}
    	else{
    		printf("La pila è :\n");
    
    			while(currentPtr!=NULL){
    				printf("%d-->",currentPtr->data);
    				currentPtr=currentPtr->nextPtr;
    			}
    		printf("NULL\n\n");
    	}
    }
    
    
    int isEmpty(StackNodePtr topPtr)
    {
    	return topPtr==NULL;
    } 
    
    Da qualche test che ho fatto, sembra che funzioni correttamente. Comunque può darsi che abbia tralasciato qualcosa, quindi facci sapere come va.

    Ciao.
  • Re: Programmazione C

    Ti ringrazio infinitamente per l'aiuto!
  • Re: Programmazione C

    Prego. Se hai altri problemi, siamo qui.

    Ciao.
Devi accedere o registrarti per scrivere nel forum
11 risposte