Stringa di lunghezza massima
Buongiorno,
il codice che segue DOVREBBE
prendere in input 5 parole (e lo fa), stamparle dopo averle inserite (e lo fa), e poi stampare la parola più lunga.
Ho impostato l'esercizio usando le strutture, ma se avete altri suggerimenti sono ben accetti!
Venendo a noi, il mio problema principale è stampare la parola massima, fuori dal ciclo for. Infatti per adesso riesco a farla stampare nel for...ma ovviamente ne stampa più di uno. Ho provato ad assegnare un valore tipo max=matrice.parola ma il programma si impalla quindi presumo che il c non accetti una cosa del genere... Credo di avervi detto tutto, attendo ansiosa
#include
#include
#include
struct parole{
char parola[20];
};
int main(){
struct parole matrice[5];
printf("Inserisci 5 parole\n");
int i=0;
for(i=1;i<=5;i++){
scanf("%s", &matrice.parola );
//printf("%s\n", matrice.parola);
}
getchar();
getchar();
for(i=1;i<=5;i++){
strlen(matrice.parola);
printf("Lunghezza parola %i: %d\n", i, strlen(matrice.parola));
}
getchar();
for(i=1;i<=5;i++){
if(strlen(matrice.parola)>strlen(matrice[i+1].parola))
{
printf("\n%s", matrice.parola);
}
};
//printf("\n%s", parola_max);
getchar();
getchar();
getchar();
getchar();
}
;
il codice che segue DOVREBBE

Ho impostato l'esercizio usando le strutture, ma se avete altri suggerimenti sono ben accetti!
Venendo a noi, il mio problema principale è stampare la parola massima, fuori dal ciclo for. Infatti per adesso riesco a farla stampare nel for...ma ovviamente ne stampa più di uno. Ho provato ad assegnare un valore tipo max=matrice.parola ma il programma si impalla quindi presumo che il c non accetti una cosa del genere... Credo di avervi detto tutto, attendo ansiosa

#include
#include
#include
struct parole{
char parola[20];
};
int main(){
struct parole matrice[5];
printf("Inserisci 5 parole\n");
int i=0;
for(i=1;i<=5;i++){
scanf("%s", &matrice.parola );
//printf("%s\n", matrice.parola);
}
getchar();
getchar();
for(i=1;i<=5;i++){
strlen(matrice.parola);
printf("Lunghezza parola %i: %d\n", i, strlen(matrice.parola));
}
getchar();
for(i=1;i<=5;i++){
if(strlen(matrice.parola)>strlen(matrice[i+1].parola))
{
printf("\n%s", matrice.parola);
}
};
//printf("\n%s", parola_max);
getchar();
getchar();
getchar();
getchar();
}
;
Risposte
Questo dovrebbe funzionare, però fa uso del typedef... non so se lo conosci
Ah funziona per più parole comunque

Ah funziona per più parole comunque

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 101 typedef char Stringa[MAX]; void LeggiStringa(Stringa s,char c); void EstraiParola(Stringa s,Stringa p,int i); int main() { Stringa str,par,min,max; int i=0; LeggiStringa(str,'\n'); strcpy(min,str);strcpy(max,""); while((str[i] !='\0') && (i<MAX)) { EstraiParola(str,par,i); printf("%s\n",par); if (strlen(par)>strlen(max)) strcpy(max,par); i = i + strlen(par) + 1; } printf("Parola piu'lunga:%s\n",max); return EXIT_SUCCESS; } void LeggiStringa(Stringa s, char l) { int i=0; char c; while ((s[i++]=getchar()) != l); s[i] ='\0'; } void EstraiParola(Stringa s, Stringa p, int i) { int j=0; while ((s[i]!=' ')&&(s[i]!='\n')) p[j++]=s[i++]; p[j] = '\0'; }
Non conoscevo typedef, ma ho letto qualcosa sul manuale. Praticamente è una sorta di sinonimo che mi permette di usare Stringa[MAX] per definire variabili di tipo char, giusto?
A parte questo.
Il programma si apre, digito una serie di stringhe e poi scompare dopo aver premuto invio. Forse devo provare ad aggiungere qualche getchar()...
Volevo chiedere.. Ma non c'è modo di impiegare qualcosa per far funzionare il mio programma?
A parte questo.
Il programma si apre, digito una serie di stringhe e poi scompare dopo aver premuto invio. Forse devo provare ad aggiungere qualche getchar()...
Volevo chiedere.. Ma non c'è modo di impiegare qualcosa per far funzionare il mio programma?
ho risolto il problema, adesso funziona.
Ma come funziona la funzione estrai parola?
Comunque ti ringrazio per la disponibilità.
Ma come funziona la funzione estrai parola?
Comunque ti ringrazio per la disponibilità.
Diciamo che l'idea è quella di estrarre una sottostringa( la parola più lunga) dalla stringa inserita dall'utente.. quindi gli passo come parametri 2 stringhe ed un indice ( per scorrere la stringa come un array).. Si tratta di una void perché non deve restituire alcun valore.
Come puoi vedere, finché l'i-esimo carattere della stringa s non è uno spazio bianco( è terminata la parola) oppure non è \n ( l'utente ha premuto invio) dico che le 2 stringhe sono uguali.. quando ho finito, l'altro indice j sarà l'ultimo carattere e deve essere uguale a \0, ovvero il terminatore di stringa
Come puoi vedere, finché l'i-esimo carattere della stringa s non è uno spazio bianco( è terminata la parola) oppure non è \n ( l'utente ha premuto invio) dico che le 2 stringhe sono uguali.. quando ho finito, l'altro indice j sarà l'ultimo carattere e deve essere uguale a \0, ovvero il terminatore di stringa

aaaah, geniale! Perdonami, ma questa materia mi è COMPLETAMENTE nuova
Poi volevo chiederti un'altra cosa... nel codice trovo scritto strcopy(max, " ") che copia la stringa spazio bianco nella stringa max... ma quindi la stringa max diventa la stringa spazio bianco anche nel confronto delle lunghezze? Ergo è un modo per assegnare un valore alla stringa max?
Comunque grazie mille, le tue spiegazioni sono molto chiare!

Poi volevo chiederti un'altra cosa... nel codice trovo scritto strcopy(max, " ") che copia la stringa spazio bianco nella stringa max... ma quindi la stringa max diventa la stringa spazio bianco anche nel confronto delle lunghezze? Ergo è un modo per assegnare un valore alla stringa max?
Comunque grazie mille, le tue spiegazioni sono molto chiare!

Aggiungo: il mio codice è proprio da buttare?
Scusa se insisto ma le strutture mi andavano a genio
Scusa se insisto ma le strutture mi andavano a genio

Si, all'inizio la stringa max è vuota 
Allora, da buttare non direi, ha qualche problema di imput perché ho dovuto premere invio più volte, però si può sistemare credo...
Curiosità personale.. perché hai voluto usare il tipo struct?

Allora, da buttare non direi, ha qualche problema di imput perché ho dovuto premere invio più volte, però si può sistemare credo...
Curiosità personale.. perché hai voluto usare il tipo struct?
In generale lo trovo più immediato, come se digerissi meglio quel tipo di algoritmo ma credo che sia perché in realtà non conosco per bene le cose. Ti chiedo ancora: perché scrivi
$i = i + strlen(par) + 1; $ ?
scusa la "capraggine" ma ci tengo a capire davvero bene.
e ancora, riguardo al mio programma, hai idea di come poter assegnare un valore massimo se ho a che fare con le strutture?
Cioè, non c'è modo di scrivere una cosa del tipo max= matrice.parola come se fosse un array?( in parole povere penso al programma che calcola il numero massimo inserito) perché se così fosse il programma risulterebbe molto più snello (anche se meno chiaro ed elegante) -opinione personale-
Grazie ancora
$i = i + strlen(par) + 1; $ ?
scusa la "capraggine" ma ci tengo a capire davvero bene.
e ancora, riguardo al mio programma, hai idea di come poter assegnare un valore massimo se ho a che fare con le strutture?
Cioè, non c'è modo di scrivere una cosa del tipo max= matrice.parola come se fosse un array?( in parole povere penso al programma che calcola il numero massimo inserito) perché se così fosse il programma risulterebbe molto più snello (anche se meno chiaro ed elegante) -opinione personale-
Grazie ancora
"laska":
In generale lo trovo più immediato, come se digerissi meglio quel tipo di algoritmo ma credo che sia perché in realtà non conosco per bene le cose. Ti chiedo ancora: perché scrivi
$i = i + strlen(par) + 1; $ ?
scusa la "capraggine" ma ci tengo a capire davvero bene.
e ancora, riguardo al mio programma, hai idea di come poter assegnare un valore massimo se ho a che fare con le strutture?
Cioè, non c'è modo di scrivere una cosa del tipo max= matrice.parola come se fosse un array?( in parole povere penso al programma che calcola il numero massimo inserito) perché se così fosse il programma risulterebbe molto più snello (anche se meno chiaro ed elegante) -opinione personale-
Grazie ancora
Scusami, ho visto ora citando.. la formula mi nascondeva strlen e mi metteva una disuguaglianza che non avevo inserito, quindi non capivo la domanda

Comunque è sempre per la questione del \0...Se tu hai una stringa di 4 caratteri.. ad esempio ape... tu sai che in realtà è composta da ape\0

In realtà di struct non ne capisco molto.. non mi sono mai andate a genio... provo a guardarmele un po e ti faccio sapere quando ho tempo

ok ok, non capivo proprio a cosa serviva praticamente, poi l'ho commentato e ho visto che praticamente l'indice non scorreva 
Io le struct le trovo più che altro degli oggetti interessanti (forse perché il massimo per un -aspirante- fisico è avere sempre tutto sottomano e ben raggruppato
). Attendo fiduciosa un tuo parere!

Io le struct le trovo più che altro degli oggetti interessanti (forse perché il massimo per un -aspirante- fisico è avere sempre tutto sottomano e ben raggruppato

Diciamo che sono oggetto interessanti quando ti serve una base dati, che una matrice bidimensionale non può fornirti, in quanto il tipo base deve essere unico. Ad esempio, se dovessi gestire una lista di nomi ( stringhe) e l'anno di corso (int) dovresti usare 2 vettori " paralleli", mentre il tipo struct invece ti permette di aggirare il problema

ma non posso assegnare ai membri di una struttura una valore temporaneo? Fuori dalla struttura però
Non c'é bisogno di typedef e similari in questo caso:
Alternativamente puoi usare un puntatore al posto dell'indice:
#include<stdio.h> #include<string.h> int main() { char parole[5][100]; printf("Inserisci 5 parole\n"); for(unsigned int i=0; i!=5; ++i) { scanf("%s", parole[i] ); } unsigned int max_len = 0; unsigned int index; for(unsigned int i=0; i!=5; ++i) { unsigned int const temp = strlen(parole[i]); if(temp > max_len) { index = i; max_len = temp; } } printf("La parola di lunghezza massima e' %s e ha lunghezza %u", parole[index], max_len); return 0; }
Alternativamente puoi usare un puntatore al posto dell'indice:
#include<stdio.h> #include<string.h> int main() { char parole[5][100]; printf("Inserisci 5 parole\n"); for(unsigned int i=0; i!=5; ++i) { scanf("%s", parole[i] ); } unsigned int max_len = 0; char *max; for(unsigned int i=0; i!=5; ++i) { unsigned int const temp = strlen(parole[i]); if(temp > max_len) { max = parole[i]; max_len = temp; } } printf("La parola di lunghezza massima e' %s e ha lunghezza %u", max, max_len); return 0; }
Perfetto! Il primo codice l'ho modificato un po' perché il compilatore non mi accettava alcune sintassi (roba da niente
) e mi va molto a genio rispetto all'ostrogoto del mio professore.
Ne approfitto per chiedervi una cosa.
Sulle dispense trovo questo codice dal titolo legginumerodirecorddiunfileedistringhe.c :
Ora, nel mio file.txt c'è scritto

Ne approfitto per chiedervi una cosa.
Sulle dispense trovo questo codice dal titolo legginumerodirecorddiunfileedistringhe.c :
#include<stdlib.h> #include<string.h> int main(void) { char c; int k; FILE *ifp, *ofp; ifp=fopen("dati.txt","r"); k=0; while (!feof(ifp)) { c = getc(ifp); putchar(c); k++; } printf("\n i record letti sono %d \n",k); system ("PAUSE"); return 0; }
Ora, nel mio file.txt c'è scritto
Questa è una stringae quando faccio partire il programma mi stampa a video 23. La lunghezza della stringa è 20 contando anche gli spazi bianchi...Allora da dove salta fuori il 23? E poi perché chiama il programma record di un file?
Io cambierei così.. leggerei finché non è EOF

#include <stdio.h> #include<stdlib.h> #include<string.h> int main(void) { char c; int k; FILE *ifp; ifp=fopen("dati.txt","r"); k=0; while ((c=getc(ifp)!=EOF)) { k++; } printf("\nI record letti sono %d \n",k); system ("PAUSE"); return 0; }
ok, funziona..bah, mistero

In effetti si può anche implementare quello del tuo prof... Questo dovrebbe andare, comunque

#include <stdio.h> #include<stdlib.h> #include<string.h> int main() { char c; int k; FILE *ifp, *ofp; ifp=fopen("dati.txt","r"); k=0; while (!feof(ifp)) { c = getc(ifp); putchar(c); k++; } printf("\nI record letti sono %d \n",(k-1)); system ("PAUSE"); return 0; }
Sì, avevo attuato anche io la stessa modifica per farlo andare
che poi alla fine *ofp non serve praticamente a nulla

che poi alla fine *ofp non serve praticamente a nulla

"laska":
Sì, avevo attuato anche io la stessa modifica per farlo andare![]()
che poi alla fine *ofp non serve praticamente a nulla


"Obidream":
Si in effetti... potrebbe essere un pezzo di altro programma dove serviva un altro FILE e magari tagliando ed incollando se lo ha dimenticato...
Sinceramente penso che ifp stia per "input file pointer" e ofp stia per "output file pointer". Quindi immagino abbia una sorta di template per questo tipo di programmi.