Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[C] Somma numeri contigui (es svolto)

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] [C] Somma numeri contigui (es svolto)

Messaggioda Foto Utentetecfil » 28 ago 2013, 19:16

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 :-)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

3
voti

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

Messaggioda Foto Utentesimo85 » 28 ago 2013, 19:58

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. ;-)
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

2
voti

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

Messaggioda Foto Utentetecfil » 28 ago 2013, 21:54

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! :-)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

1
voti

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

Messaggioda Foto Utentesimo85 » 28 ago 2013, 23:54

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_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

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

Messaggioda Foto UtenteElla » 29 ago 2013, 7:33

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_/
Avatar utente
Foto UtenteElla
15 1
 
Messaggi: 2
Iscritto il: 3 gen 2012, 14:23

0
voti

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

Messaggioda Foto Utentetecfil » 29 ago 2013, 8:52

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 :-)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 20 ospiti