Risolto Esercizio C - Aiuto

Stato
Discussione chiusa ad ulteriori risposte.

k35p0n33

Utente Iron
22 Febbraio 2022
16
4
2
14
Ultima modifica:
Ciao ragazzi, sto provando a risolvere questo esercizio in C, dovrei svilupparlo con un pensiero diverso e molto probabilmente mi sono complicato la vita attraverso vettori e matrici inutili. Qualcuno può delucidarmi su come ottimizzare e risolvere il codice? Questa è la traccia:

Scrivere un programma che acquisisca da tastiera un vettore di (max 100) valori di tipo intero e identifichi la più lunga sequenza di numeri consecutivi uguali. Se vengono identificate più sequenze della stessa lunghezza, si consideri solo la prima identificata. Il programma deve indicare il valore ripetuto e il numero di ripetizioni di quel valore.


Esempio:


Input: 19 3 15 15 7 9 9 9 9 12 3 3 3 Output: numero: 9, ripetizioni: 4

Io ho provato a risolverlo in questo modo ma so di aver fatto un pasticcio D:

C:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100

int main() {
    int vetA[MAX],i,j=0,k=0,n,num=0,rep=0,vetB[MAX][MAX];
    
    printf("Quanti valori si vuole introdurre?=");
    scanf("%d", &n);
    
    for(i=0;i<n;i++){
        printf("Valore=");
        scanf("%d", &vetA[i]);
    }
    
    for(i=0;i<n;i++){
    
        if(vetA[i]==vetA[i+1]){
            vetB[k][j]=vetA[i];
            num=vetA[i];
            j++;
            rep++;
        }
        if(vetA[i]!=vetA[i+1]){
            vetB[k][j]=vetA[i];
            num=vetA[i];
            rep=0;
            k++;
        }
        printf("Numero=%d Rep=%d\n", num,rep);
    }


    return 0;
}
 
Puoi evitare l'uso della matrice, ti basta salvare in due variabili la sequenza più lunga per confrontarla a quella corrente:

C:
int main() {
    int v[MAX], i, n, num = -1, rep = 1;
    int maxRepNum = 0, maxRep = 0;

    printf("Quanti valori si vuole introdurre?=");
    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        printf("Valore=");
        scanf("%d", &v[i]);
    }

    for (i = 0; i < n; i++) {
        if (v[i] == num) {
            rep++;
        }
        else {
            if (rep > maxRep) {
                maxRep = rep;
                maxRepNum = num;
            }
            rep = 1;
        }
        num = v[i];
    }
    printf("Numero=%d Rep=%d\n", maxRepNum, maxRep);
    return 0;
}
 
  • Mi piace
  • Grazie
Reazioni: k35p0n33 e biotek_
Ultima modifica:
Puoi evitare l'uso della matrice, ti basta salvare in due variabili la sequenza più lunga per confrontarla a quella corrente:

C:
int main() {
    int v[MAX], i, n, num = -1, rep = 1;
    int maxRepNum = 0, maxRep = 0;

    printf("Quanti valori si vuole introdurre?=");
    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        printf("Valore=");
        scanf("%d", &v[i]);
    }

    for (i = 0; i < n; i++) {
        if (v[i] == num) {
            rep++;
        }
        else {
            if (rep > maxRep) {
                maxRep = rep;
                maxRepNum = num;
            }
            rep = 1;
        }
        num = v[i];
    }
    printf("Numero=%d Rep=%d\n", maxRepNum, maxRep);
    return 0;
}
Grazie mille, solo una cosa:
Come mai si dichiara num=-1?
Quando il ciclo for fa il primo giro e si chiede if(v==num) sta praticamente chiedendo se v è uguale a -1.
E' semplicemente per inizializzare a un valore diverso da quello che si potrebbe inserire giusto?
 
Grazie mille, solo una cosa:
Come mai si dichiara num=-1?
Quando il ciclo for fa il primo giro e si chiede if(v==num) sta praticamente chiedendo se v è uguale a -1.
E' semplicemente per inizializzare a un valore diverso da quello che si potrebbe inserire giusto?

Esattamente, si può fare anche in altri modi, ad esempio se fosse necessario inserire numeri negativi potresti non inizializzarlo e inserire num = ~v[0]; prima del for per rendere il primo if sempre false o cambiare la struttura del ciclo usando i + 1 per non tenere traccia del numero precedente. Questa è solo una delle possibili soluzioni, l'ho scelta per restare fedele al codice che avevi iniziato e non complicare inutilmente le cose, per esempio potresti anche fare tutto in un solo ciclo (quello che chiede i numeri) e senza nemmeno vettore:

C:
int main() {
    int n, i, num, lastNum = -1, rep = 1, maxRepNum = 0, maxRep = 0;

    printf("Quanti valori si vuole introdurre?=");
    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        printf("Valore=");
        scanf("%d", &num);
        if (num == lastNum)
            rep++;
        else {
            if (rep > maxRep) {
                maxRep = rep;
                maxRepNum = lastNum;
            }
            rep = 1;
        }
        lastNum = num;
    }
    printf("Numero=%d Rep=%d\n", maxRepNum, maxRep);
    return 0;
}
 
  • Grazie
Reazioni: k35p0n33
Esattamente, si può fare anche in altri modi, ad esempio se fosse necessario inserire numeri negativi potresti non inizializzarlo e inserire num = ~v[0]; prima del for per rendere il primo if sempre false o cambiare la struttura del ciclo usando i + 1 per non tenere traccia del numero precedente. Questa è solo una delle possibili soluzioni, l'ho scelta per restare fedele al codice che avevi iniziato e non complicare inutilmente le cose, per esempio potresti anche fare tutto in un solo ciclo (quello che chiede i numeri) e senza nemmeno vettore:

C:
int main() {
    int n, i, num, lastNum = -1, rep = 1, maxRepNum = 0, maxRep = 0;

    printf("Quanti valori si vuole introdurre?=");
    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        printf("Valore=");
        scanf("%d", &num);
        if (num == lastNum)
            rep++;
        else {
            if (rep > maxRep) {
                maxRep = rep;
                maxRepNum = lastNum;
            }
            rep = 1;
        }
        lastNum = num;
    }
    printf("Numero=%d Rep=%d\n", maxRepNum, maxRep);
    return 0;
}
Perfetto, grazie mille per la delucidazione :)
 
Stato
Discussione chiusa ad ulteriori risposte.