Pagina 1 di 1

[C] Somma numeri contigui (es svolto)

MessaggioInviato: 28 ago 2013, 19:16
da tecfil
Ciao a tutti!

Dopo aver saputo che ad altri utenti interessano questi argomenti e sopratutto gli esercizi svolti, eccone un altro fresco fresco appena svolto :mrgreen: :mrgreen:

La soluzione l'ho svolta io, però questa volta dovrebbe essere giusta ;-) (magari si può migliorare in qualche punto!)

Testo dell'esercizio
Si sviluppi un programma in linguaggio C che, ricevendo in ingresso una sequenza di lunghezza arbitraria di almeno due numeri interi (positivi o negativi) diversi da zero, terminata da uno zero, produca in uscita i primi due valori contigui nella sequenza (escluso l’ultimo zero) la cui somma ha valore assoluto minimo.
Ad esempio, ricevendo in ingresso la sequenza -7 2 -19 4 45 3 -4 9 3 0 il programma produce in uscita 3 -4


Ecco la mia soluzione:
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int *vett=NULL, i, sommamin=0, size=0, num, primo=0, secondo=0, somma=0;
   
    printf("Inserisci una sequenza di numeri, i primi due devono essere diversi da zero, per terminare digita 0.\n");
    do
    {
        printf("Inserisci il %d numero: ", size+1);
        scanf("%d", &num);
        if (num!=0)
        {
            size++;
            vett=(int*)realloc(vett,(size)*(sizeof(int)));
            vett[size-1]=num;
        }
    } while (size<2);
   
    sommamin=vett[0]+vett[1];
    primo=vett[0];
    secondo=vett[1];
    if (sommamin<0)
    {
        sommamin=sommamin*(-1);
    }
    do
    {
        printf("Inserisci il %d numero: ", size+1);
        scanf("%d", &num);
        size++;
        vett=(int*)realloc(vett,(size)*(sizeof(int)));
        vett[size-1]=num;
    } while (num!=0);
       
    for (i=2;i<size-2;i++)
    {
        somma=vett[i]+vett[i+1];
        if (somma<0)
        {
            somma=somma*(-1);
        }
        if (somma<sommamin)
        {
            sommamin=somma;
            primo = vett[i];
            secondo = vett[i+1];
        }
    }
   
    printf("\nLa somma con valore assoluto minimo vale: %d, ed è data dai numeri: %d e %d.", sommamin, primo, secondo);
   
   
    return 0;
}


Solo due note sullo svolgimento: visto che non sappiamo quanti numeri saranno inseriti nel vettore, ho utilizzato la funzione realloc per riallocare dinamicamente la dimensione del vettore.

Ho utilizzato due cicli do-while per fare in modo che l'utente inserisca almeno due numeri diversi da zero. Forse qui si poteva risparmiare un ciclo ed un pezzo di codice mettendo tutto in un solo do-while, però mi è tornato più comodo utilizzare questo procedimento, così posso assegnare un valore alla somma minima da confrontare poi con le successive somme.

A presto!
Ciaoo :-)

Re: [C] Somma numeri contigui (es svolto)

MessaggioInviato: 28 ago 2013, 19:58
da simo85
tecfil ha scritto:Forse qui si poteva risparmiare un ciclo ed un pezzo di codice mettendo tutto in un solo do-while

Senza il forse, si, potevi usare solo un ciclo. ;-)

Re: [C] Somma numeri contigui (es svolto)

MessaggioInviato: 28 ago 2013, 21:54
da tecfil
Ciao Foto Utentesimo85

Ho fatto una modifica togliendo il doppio do-while! :-)

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

int main ()
{
    int *vett=NULL, i, sommamin=0, size=0, num, primo=0, secondo=0, somma=0, indexIN=0;
    unsigned char bExit = FALSE;

    printf("Inserisci una sequenza di numeri, i primi due devono essere diversi da zero, per terminare digita 0.\n");
    do
    {
        printf("\tInserisci il %d numero: ", size+1);
        scanf("%d", &num);
        if (num==0 && size>=2)
        {
            bExit = TRUE;
        }
    else
    {
        if (num==0)
        printf("\tInserisci almeno 2 valori diversi 0 prima di terminare\n");
        else
        {
            size++;
            vett=(int*)realloc(vett,(size)*(sizeof(int)));
            vett[size-1]=num;
        }
    }
    } while (bExit == FALSE);   
   
    sommamin=vett[0]+vett[1];
    primo=vett[0];
    secondo=vett[1];
    if (sommamin<0)
    {
        sommamin=sommamin*(-1);
    }
       
    for (i=2;i<size-2;i++)
    {
        somma=vett[i]+vett[i+1];
        if (somma<0)
        {
            somma=somma*(-1);
        }
        if (somma<sommamin)
        {
            sommamin=somma;
            primo = vett[i];
            secondo = vett[i+1];
        }
    }
   
    printf("\nLa somma con valore assoluto minimo vale: %d, ed è data dai numeri: %d e %d.", sommamin, primo, secondo);
   
   
    return 0;
}


Grazie
Ciaoo! :-)

Re: [C] Somma numeri contigui (es svolto)

MessaggioInviato: 28 ago 2013, 23:54
da simo85
Bravo. :D

Forse avresti potuto ridurre ancor di più il codice ed usando meno variabili ed istruzioni.

Per esempio, il do-while potevi abbreviarlo così:

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int *buffer = (int*) malloc (sizeof(int));
    int num = 0, size = 0;
    unsigned char go = 1;

    printf("Inserisci una sequenza di numeri, i primi due devono essere diversi da zero, per terminare digita 0.\n");
    do
    {
        scanf("%d", &num);
        if(num != 0)
        {
            buffer = (int*) realloc (buffer, (size + 1) * sizeof(int));
            buffer[size] = num;
            size++;
        }
        else if(size < 2 && num == 0)
            printf("Elemento %.2d deve essere diverso da 0. Inserisci di nuovo: ", size);
        else if(size > 2 && num == 0)
            go = 0;

    }while(go);

    /* code ... */

    exit(0);
}


Tra l'altro cosa ci fa li la variabile indexIN? :-)

O_/

Re: [C] Somma numeri contigui (es svolto)

MessaggioInviato: 29 ago 2013, 7:33
da Ella
tecfil ha scritto:Ciao a tutti!

Dopo aver saputo che ad altri utenti interessano questi argomenti e sopratutto gli esercizi svolti, eccone un altro fresco fresco appena svolto :mrgreen: :mrgreen:


Presente! Oggi provo a svolgerlo da sola senza guardare la tua soluzione O_/

Re: [C] Somma numeri contigui (es svolto)

MessaggioInviato: 29 ago 2013, 8:52
da tecfil
simo85 ha scritto:Per esempio, il do-while potevi abbreviarlo così (..)


edit mod: non quotare tutto, solo la parte interessata.

Ciao Foto Utentesimo85

Giusto dopo da PC riscrivo il codice abbreviandolo ancora grazie mille!

Ciao :-)