RISOLTO Ricercare due lettere in una Stringa

Stato
Discussione chiusa ad ulteriori risposte.

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Intanto la regola del forum dice che non si deve dare il codice risolutivo, ma solo indicazioni su come costruire l'algoritmo.

@Ibernato , hai visto un problema banale e hai voluto fare il gradasso violando la regola: così ti sei procurato pure una figuraccia! La prossima volta fai più attenzione e limitati a spiegare il concetto, lì si vede la vera abilità di un programmatore, la codifica in un linguaggio è un aspetto secondario.. considerato poi, che ormai tutti prevedono delle funzioni dedicate a svolgere quanto richiesto!

Inviato dal mio Nexus 6P utilizzando Tapatalk
Non ho fatto nessun gradasso.
La traccia dell'utente dice una stringa di 100 caratteri (non di meno).
Trovami l'errore nel programma con una stringa di 100 e accetto la critica.

Segmentation fault non accade dato che c'è la condizione && i<100 che non permette di superare la soglia del 99.

Se la traccia prevede anche una stringa inferiore allora sono d'accordo di dover calcolare la lunghezza e poi fare il test.
Ma in questo caso l'utente ha specificato solo 100 char

@M1n021 non è superflua. Infatti senza questa condizione ncapita il segmentation fault dato che i è 99 e i+1 da errore. In ogni caso anche i<99 va bene.
La situazione di Andreotti è valida ma dato che l'utente ha specificato 100char e non di meno allora ho fatto questa soluzione. Viceversa si deve calcolare prima la lunghezza ovviamente e poi basta sostituire 100 con la lunghezza trovata
 
Ultima modifica:

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Non ho fatto nessun gradasso.
La traccia dell'utente dice una stringa di 100 caratteri (non di meno).
Trovami l'errore nel programma con una stringa di 100 e accetto la critica.

Segmentation fault non accade dato che c'è la condizione && i
Se la traccia prevede anche una stringa inferiore allora sono d'accordo di dover calcolare la lunghezza e poi fare il test.
Comunque non dovevi dare il codice. Stop.

Riguardo a quello che hai scritto:

1. La stringa che analizzi ha meno di 100 byte quindi non puoi mandare il ciclo fino a 2. Siccome fai il controllo anche su i+1 la condizione del while sarà 3. Inoltre l'algoritmo stamperà "no" anche se il risultato sarà verificato.


Inviato dal mio Nexus 6P utilizzando Tapatalk
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Comunque non dovevi dare il codice. Stop.

Riguardo a quello che hai scritto:

1. La stringa che analizzi ha meno di 100 byte quindi non puoi mandare il ciclo fino a 2. Siccome fai il controllo anche su i+1 la condizione del while sarà 3. Inoltre l'algoritmo stamperà "no" anche se il risultato sarà verificato.


Inviato dal mio Nexus 6P utilizzando Tapatalk
Sono d'accordo per il codice, ma ho dato anche una risorsa da leggere per fargli capire il concetto di stringa.

Guarda che il programma funziona, l'ho testato e mi stampa ok.
L'algoritmo non stampa no anche se è verificato dato che c'è il return se viene verificato.
Non ho messo una stringa di 100 perché mi scocciavva
Post unito automaticamente:

Guarda:
350569

350570
 
Ultima modifica:

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Si, ma quel codice è pessimo sotto molti punti di vista. Intanto perché fai terminare il programma non appena verifichi che esiste la combinazione ricercata. La condizione i
Prova a inserire una stringa senza la combinazione 'cn' ???

Inviato dal mio Nexus 6P utilizzando Tapatalk
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Si, ma quel codice è pessimo sotto molti punti di vista. Intanto perché fai terminare il programma non appena verifichi che esiste la combinazione ricercata. La condizione i
Prova a inserire una stringa senza la combinazione 'cn' ???

Inviato dal mio Nexus 6P utilizzando Tapatalk
Mi spieghi perchè è pessimo? Non mi hai dato una motivazione. Lascia stare che ho messo 100 (li va messa la lunghezza effettiva nel caso la traccia prevede stringhe inferiori di 100).
La traccia dice che se trovi una combinazione nc allora devi stampare un messaggio. Una volta trovata la combinazione stampi ed esci (inutile scorrere ancora la stringa fino alla fine).
Ho provato ad inserire senza nc e funziona lo stesso...
 

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Pessimo perché non lineare e con due uscite. Vero che una volta trovata la combinazione non serve analizzare tutta la stringa, ma si può fare senza forzare il ciclo in maniera brutale, con la chiusura del programma. Mi sembra strano che funzioni lo stesso perché dovrebbe analizzare il vettore (stringa) in posizioni > length, per esempio per i= 20 e 20+1...

Inviato dal mio Nexus 6P utilizzando Tapatalk
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Pessimo perché non lineare e con due uscite. Vero che una volta trovata la combinazione non serve analizzare tutta la stringa, ma si può fare senza forzare il ciclo in maniera brutale, con la chiusura del programma. Mi sembra strano che funzioni lo stesso perché dovrebbe analizzare il vettore (stringa) in posizioni > length, per esempio per i= 20 e 20+1...

Inviato dal mio Nexus 6P utilizzando Tapatalk
Non lineare? Stai sbagliando qualcosa mi sa. Forzare due uscite non è affatto male. Se trovi quello che ti serve il programma può terminare tranquillamente (preferivi exit invece di return?).
Non analizza in posizione lenght e lenght+1 perchè c'è il controllo prima di length +1 (ovvero i < length).
 

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
char prova[] = "abcnnc";

if(prova == 'n' && i < 100 && prova[i + 1] == 'c')
Due problemi diversi:
1) prova[] è un array di 6 valori, l'indice i lo fai andare fino a 100.
2) se prova[] fosse un array di 100 valori, prova a valutare l'if con i = 99..
 

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Si può fare in modo molto più elegante senza dover forzare l'uscita all'interno della condizione. Si può fare senza dover stabilire a priori la lunghezza della stringa.

Non vedo quale controllo impedisca all'indice di andare oltre la lunghezza della stringa.

Poi, fine con questa scemenza: hai sbagliato a postare il codice e fine. Se almeno fosse stato giusto e fatto bene sarebbe stato un conto, ma questa tua insistenza in giustificazioni è solo fastidiosa.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 

willano

Nuovo Utente
81
5
Credo che la frase "Data una certa stringa di 100 caratteri da tastiera ", abbia tratto in inganno.
La soluzione corretta dovrebbe essere di controllare prima quanto è lunga una stringa effettivamente.
Per il resto, il codice sembra funzionare. Ci sono altri modi anche per farlo come dice @rctimelines
L'unica cosa che forse sostituirei è il return 0 nel ciclo con un exit, oppure metterei una flag e quando trovo "nc", setto a true il flag e faccio un break per uscire dal ciclo.

E come dice @rodhellas invece di i < 100 nell'if devi mettere i < 99.
Il resto, funziona.
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Due problemi diversi:
1) prova[] è un array di 6 valori, l'indice i lo fai andare fino a 100.
2) se prova[] fosse un array di 100 valori, prova a valutare l'if con i = 99..

@rctimelines mi dimostri l'errore con un esempio nel codice? Grazie. E ci sono altre soluzioni sicuramente, ma così per me funziona (cambiano i < 99). Risparmi la dichiarazione di una variabile e di scorrere l'intera stringa.
Posta una tua soluzione piuttosto che insistere ;)

Si si, i < 99, errore mio
Ho messo 100 perchè nella traccia diceva 100, ma li ci va la lunghezza della stringa

 
Ultima modifica:

M1n021

Nuovo Utente
143
68
Sempre ragionando in termini di array di caratteri e non di C-stringhe, c'è da dire che la condizione i < 99 nell'if è comunque superflua, basta infatti utilizzare la suddetta condizione nel while. Detta l1 la lunghezza della sequenza di elementi in cui ricercare una seconda sequenza di lunghezza l2, mi sembra ovvio che sia inutile andare oltre l'indice pari a l1-l2.

@Ibernato visto che si è detto molto nel frattempo, prima di invitare gli altri utenti a mostrarti gli eventuali errori, sarebbe meglio se postassi il codice aggiornato e per te corretto. Altrimenti si finisce per cadere in inutili incomprensioni.
 
Ultima modifica:
  • Mi piace
Reazioni: Ibernato

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Sempre ragionando in termini di array di caratteri e non di C-stringhe, c'è da dire che la condizione i < 99 nell'if è comunque superflua, basta infatti utilizzare la suddetta condizione nel while. Detta l1 la lunghezza della sequenza di elementi in cui ricercare una seconda sequenza di lunghezza l2, mi sembra ovvio che sia inutile andare oltre l'indice pari a l1-l2.

@Ibernato visto che si è detto molto nel frattempo, prima di invitare gli altri utenti a mostrarti gli eventuali errori, sarebbe meglio se postassi il codice aggiornato e per te corretto. Altrimenti si finisce per cadere in inutili incomprensioni.
Ecco.
Se trovate gli errori dite pure. Io ho sempre fatto così e non ho avuto mai problemi
C:
#include <stdio.h>
#include <string.h>

int main()
{
    char prova[] = "abcnnc";
    int i = 0;
    int size = strlen(prova);

    while(i < size){
        if(prova[i] == 'n' && i < (size -1) && prova[i + 1] == 'c'){
            printf("OK");
            return 0;
        }
        i++;
    }

    printf("No");

    return 0;
}
 

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Senza polemica, mi spieghi a cosa serve la condizione "i<size" dentro a if? Considerato che il contatore è sempre minore, essendo imposto nel ciclo principale while.
Inviato dal mio Nexus 6P utilizzando Tapatalk
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Senza polemica, mi spieghi a cosa serve la condizione "i<size" dentro a if? Considerato che il contatore è sempre minore, essendo imposto nel ciclo principale while.
Inviato dal mio Nexus 6P utilizzando Tapatalk
Non sto facendo nessuna polemica io.
Sei te che mi hai dato del gradasso ;)
C'è size - 1 perchè metti caso che l'ultima lettera della stringa è "n" (quindi abbiamo abcdn) allora poi andrà a controlla i + 1 (cioè 5+1), ma nella posizione 6 non c'è nulla.
 
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili