|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
C:STRINGHE
Non riesco a fare questo esercizio:
Scrivere un programma in C che riceva in input un insieme di parole (stringhe) e produca in output le parole di input ordinate. Esempio: Input: “Oggi è proprio una bella giornata. Quasi quasi vado al mare.” Output: al bella è giornata mare Oggi proprio Quasi quasi una vado In piu allocare dinamicamente la memoria per la stringa. Ecco la mia soluzione: Codice HTML:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXWORD 100 #define N 1000 void sort_word(char s[], int ); void swap(char **p, char **q); void write_word(char s[], int ); int contaparole(char s[], int); int caricamento(char s[]); int main(void) { char word[MAXWORD]; char s[N]; int n,i,num; num=contaparole(s,caricamento(s)); if (num>=N) printf("ERRORE:TROPPE PAROLE"); if (strlen(s)>=MAXWORD) printf("ERRORE:PAROLA TROPPO LUNGA"); if (calloc(strlen(s)+1,sizeof(char))== NULL) printf("ERRORE DI CALLOC"); sort_word(s,num); write_word(s,num); system("PAUSE"); return 0; } void sort_word(char s[], int num){ int i,j; for (i=0;i<num;++i){ for (j=i+1;j<num;++j){ if (strcmp(s[i],s[j])<0){ swap(&s[i], &s[j]); } } } } void swap(char **p, char **q){ char *tmp; tmp=*p; *p=*q; *q=tmp; } void write_word(char s[], int num){ int i; for (i=0;i<num;++i){ printf("%s\n", s[i]); } } int caricamento(char s[]){ int i; for (i = 0; ;i++){ s[i]=getchar(); if (s[i]=='\n'){ break; } } s[i]='\0'; return i; } int contaparole(char s[],int n){ int j; int k=1; for(j=0;j<n;j++){ if (s[j]==' '){ k++; } } return k; } Chi mi aiuta a risolvere è un genio. Ringrazio tutti in anticipo. PS:ho pochissimo tempo per consegnare il rpograma funzionante, ovvero domani. Se non capite qualcosa nel programma fatemi sapere che ve lo spiego. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Dalla singola stringa iniziale di input dovresti ottenere un array di stringhe .... cosa che non vedo ....
E quindi fare l'ordinamento sull'array di stringhe.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#3 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
mhhh, probabilmente si, ma nn so usarlo, se è poco da modificare non è che me lo modificheresti tu?
please |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
qualcuno mi aiutiiiii domani devo consegnaro, nn so fare l'array di stringhe!!!!!!!11
|
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
praticamente devo fare l'ordinamento lessicografico di un array di strighe, chi mi aiuta
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Ti fornisco qualche indizio utile:
- Un array di stringhe lo dichiari con ad esempio: char *stringhe[30]; - Per "spezzare" la stringa usando gli spazi come delimitatori puoi usare la funzione di libreria strtok(). Ovviamente si può anche fare "a mano" con del codice apposito ma ti consiglio, per semplicità, la strtok(). Se hai altri dubbi, chiedi pure.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
@andbin: funziona ma vorrei sapere se ho scritto del buon codice, me lo puoi controllare? Te lo chiedo xk devo fare le olimpiadi di info, non so se a gennaio o a febbraio, e oltre a scrivere programmi funzionanti bisognerebbe che siano anche scritti bene. Grazie.
Codice:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main(){
char *frase,**parole,*temp;
int np=0,i,j;
frase=(char*)malloc(1);
jump:
cout<<"Inserire frase...\n";
for(i=0;;i++){
frase=(char*)realloc(frase,i+1);
frase[i]=getchar();
if(frase[i]==' ') np++;
else if(frase[i]=='\n'){
frase[i]='\0';
if(i!=0) np++;
break;
}
}
if(np==0) goto jump;
parole=new char*[np];
parole[0]=strtok(frase," ");
for(i=1;i<np;i++)
parole[i]=strtok(NULL," ");
for(i=0;i<np;i++)
for(j=np-1;j>i;j--)
if(strcmp(parole[j],parole[j-1])<0){
temp=parole[j];
parole[j]=parole[j-1];
parole[j-1]=temp;
}
cout<<"Parole ordinate:\n";
for(i=0;i<np;i++)
cout<<parole[i]<<"\n";
system("pause");
}
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
wingman87: lo richiedeva in C, non in un misto C/C++...
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2787
|
Quote:
@cionci: a scuola impariamo il c++, so che una differenza è che il C non è ad oggetti, quindi avrei dovuto non usare la iostream? |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
- Hai usato roba del C (malloc ad esempio) e roba del C++ (cout e new char*[np] ad esempio). Non è un male grave, però per un esercizietto così, o usi solo cose del C o solo cose del C++. - Hai usato il goto. - Alla fine non hai deallocato quello che è stato allocato. - Non hai messo un return qualcosa alla fine. - Non hai testato l'eventuale fallimento delle allocazioni. - Nella fase di input riallochi il buffer per ogni singolo carattere (inefficiente). Inoltre conti le parole in base al numero di spazi, senza tenere conto che si potrebbero inserire più spazi tra le parole e all'inizio/fine. - Inoltre come è scritto (tutto appiccicato e senza spaziature) non mi piace.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Codice:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
int main()
{
string linea;
vector<string> parole;
getline(cin, linea);
istringstream iss(linea);
while(!iss.eof())
{
string parola;
iss >> parola;
parole.push_back(parola);
}
sort(parole.begin(), parole.end());
for(vector<string>::iterator it = parole.begin(); it != parole.end(); it++)
cout << *it << endl;
return 0;
}
|
|
|
|
|
|
|
#13 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
diciamo che me lo scrivete in C smplice cosi mi risolvete un grande problema?
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Guarda...in pratica te l'ha fatto wingman87: prendi il suo sostituisci la scanf alla cin, printf alla cout e la malloc alla new...
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#16 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
Codice HTML:
#include <iostream> #include <stdlib.h> #include <string.h> int main(){ char *frase,**parole,*temp; int np=0,i,j; frase=(char*)malloc(1); jump: printf("Inserire frase...\n"); for(i=0;;i++){ frase[i]=getchar(); if(frase[i]==' ') np++; else if(frase[i]=='\n'){ frase[i]='\0'; if(i!=0) np++; break; } } if(np==0) goto jump; parole=new char*[np]; parole[0]=strtok(frase," "); for(i=1;i<np;i++) parole[i]=strtok(NULL," "); for(i=0;i<np;i++) for(j=np-1;j>i;j--) if(strcmp(parole[j],parole[j-1])<0){ temp=parole[j]; parole[j]=parole[j-1]; parole[j-1]=temp; } printf("Parole ordinate:\n"); for(i=0;i<np;i++) printf("%s\n",parole[i]); system("pause"); } che altro devo fare quindi? |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per sostituire il goto (che non va mai usato tranne in rarissimi casi, anzi scordatevi che esiste)...
Codice:
if(np > 0)
{
parole=new char*[np];
parole[0]=strtok(frase," ");
for(i=1;i<np;i++)
parole[i]=strtok(NULL," ");
for(i=0;i<np;i++)
for(j=np-1;j>i;j--)
if(strcmp(parole[j],parole[j-1])<0){
temp=parole[j];
parole[j]=parole[j-1];
parole[j-1]=temp;
}
printf("Parole ordinate:\n");
for(i=0;i<np;i++)
printf("%s\n",parole[i]);
}
system("pause");
http://www.cplusplus.com/ref/cstring/strtok.html |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
ecco penso che adesso l'ho aggiustato ed è puro c, piu leggibile con funzioni:
Codice HTML:
#include <stdio.h> #include <stdlib.h> #include <string.h> int caricamento(char *frase); void ordinamento(char **parole, int ); void swap(char **p, char **q); void stampa(char **parole, int ); int main(){ char *frase,**parole,*temp; int np,i,j; frase=(char*)malloc(1); if (frase== NULL) printf("ERRORE DI ALLOCAZIONE DI MEMORIA"); np=caricamento(frase); if (np>0){ parole=new char*[np]; parole[0]=strtok(frase," "); for(i=1;i<np;i++) parole[i]=strtok(NULL," "); ordinamento(parole,np); stampa(parole,np); }else printf("non hai inserito nulla\n"); system("pause"); } int caricamento(char *frase){ int i,np=0; printf("Inserire frase...\n"); for(i=0;;i++){ frase[i]=getchar(); if(frase[i]==' ') np++; else if(frase[i]=='\n'){ frase[i]='\0'; if(i!=0) np++; break; } } return np; } void ordinamento(char **parole, int np){ int i,j; for (i=0;i<np;++i){ for (j=i+1;j<np;++j){ if (strcmp(parole[i],parole[j])>0){ swap(&parole[i], &parole[j]); } } } } void swap(char **p, char **q){ char *temp; temp=*p; *p=*q; *q=temp; } void stampa(char **parole, int np){ int i; printf("Parole ordinate:\n"); for(i=0;i<np;i++) printf("%s\n",parole[i]); } |
|
|
|
|
|
#19 |
|
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
ok a quanto pare ho sottovalutato mergesort, è piu difficile di quanto credessi. chi mida una mano??
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
e poi questa: Codice:
frase = (char *) malloc(1); stai usando una cella di memoria per la getchar, secondo me é inutile. L'allocazione dinamica si usa di solito quando non sai quanta memoria ti servirá ed in certi casi se sai che sará una sola parola conviene comunque una variabile automatica tipo Codice:
char parola[256]; Sull'ordinamento ci vuole un po di tempo per controllare ... ma mi sembra che hai fatto un pó di casini pure nella creazione della matrice EDIT: non avevo visto il ciclo dove usi "frase" allochi 1 e poi sfori di brutto! non ti si inchioda il programma ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve Ultima modifica di trallallero : 15-12-2006 alle 16:42. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:13.











non avevo visto il ciclo dove usi "frase"








