PROBLEMA Problema esercizio array

gory10

Nuovo Utente
7
0
Ciao a tutti, sono alle prime armi con il C e specialmente con gli array. Ho un problema con questo esercizio di cui vi riporto la traccia con annessi input e output:
Scrivere un programma che legga da tastiera 10 interi, li scriva in un array A, e lo passi ad una funzione verifica condizione. La funzione restituisce l’indice i del primo elemento che verifica la seguente condizione:
A = A[i + 1] − A[i − 1]
oppure -1 nel caso in cui nessun elemento verifichi la suddetta condizione. Il risultato della funzione viene stampato nella main.

Esempio:
Input Output
9 2
5
-2
3
5
50
4
-7
0
-7

L'esercizio l'ho impostato così:
C:
#include <stdio.h>
#define dim 10
int verifica_condizione (int a[], size_t n);
int main () {
    int a[dim];
    printf("Inserisci 10 interi. \n");
    for (size_t i = 0; i < dim; i++) {
        while(scanf("%d", &a[i]) != 1) {
            printf("Input errato. Inserisci un intero.\n");
            scanf("%*[^\n]%*c");
        }   
    }
    printf("%d \n", verifica_condizione(a,dim));
}

int verifica_condizione (int a[], size_t n) {
    int indice = 0;
    int b;
    for (size_t y = 0; y < dim; y++) {
        b = a[y+1] - a[y-1];
        if (a[y] == b) {
            indice = y;
        } else {
            indice = -1;
        }
    }
    return indice;
}
Non capisco dove e in cosa sbaglio. Grazie in anticipo.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Ciao a tutti, sono alle prime armi con il C e specialmente con gli array. Ho un problema con questo esercizio di cui vi riporto la traccia con annessi input e output:

L'esercizio l'ho impostato così:
C:
#include <stdio.h>
#define dim 10
int verifica_condizione (int a[], size_t n);
int main () {
    int a[dim];
    printf("Inserisci 10 interi. \n");
    for (size_t i = 0; i < dim; i++) {
        while(scanf("%d", &a[i]) != 1) {
            printf("Input errato. Inserisci un intero.\n");
            scanf("%*[^\n]%*c");
        }   
    }
    printf("%d \n", verifica_condizione(a,dim));
}

int verifica_condizione (int a[], size_t n) {
    int indice = 0;
    int b;
    for (size_t y = 0; y < dim; y++) {
        b = a[y+1] - a[y-1];
        if (a[y] == b) {
            indice = y;
        } else {
            indice = -1;
        }
    }
    return indice;
}
Non capisco dove e in cosa sbaglio. Grazie in anticipo.
Il ciclo deve iniziare da 1 se vuoi accedere alla posizione y-1 e terminare a < dim-1 se vuoi accedere alla posizone y+1. E alla condizione (a[y] == b) vera dovresti terminare il ciclo e ritornare l'indice.
 
  • Mi piace
Reazioni: gory10

gory10

Nuovo Utente
7
0
Il ciclo deve iniziare da 1 se vuoi accedere alla posizione y-1 e terminare a < dim-1 se vuoi accedere alla posizone y+1. E alla condizione (a[y] == b) vera dovresti terminare il ciclo e ritornare l'indice.
Grazie, ora funziona. Ho riscritto la funzione cosi:
C:
int verifica_condizione (int a[], size_t n) {
    int indice = 0;
    int b;
    for (size_t y = 1; y < dim-1; y++) {
        b = a[y+1] - a[y-1];
        if (a[y] == b) {
            indice = y;
            break;  
        } else {
            indice = -1;
        }
    }
    return indice;
}
Mi spiegheresti gentilmente perché senza "break" non andava?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Grazie, ora funziona. Ho riscritto la funzione cosi:
C:
int verifica_condizione (int a[], size_t n) {
    int indice = 0;
    int b;
    for (size_t y = 1; y < dim-1; y++) {
        b = a[y+1] - a[y-1];
        if (a[y] == b) {
            indice = y;
            break; 
        } else {
            indice = -1;
        }
    }
    return indice;
}
Mi spiegheresti gentilmente perché senza "break" non andava?

Perchè non rispetteresti la richiesta dell'esercizio. Lì ti chiede esplicitamente di restituire l'indice della prima uguaglianza; se non metti il break e non interrompi il ciclo ci potrebbero essere altri valori uguali, e quindi non avresti più l'indice del primo elemento ma un altro indice, oppure ancora -1, perchè se non hai altre uguaglianze vai a porre l'indice a -1.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili