Torna indietro   Hardware Upgrade Forum > Software > Programmazione

WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-12-2006, 16:03   #1
lucas87
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;
}
ma mi da errore a if (strcmp(s[i],s[j])<0).
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.
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 16:28   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 19:03   #3
lucas87
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
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 19:41   #4
lucas87
Bannato
 
Iscritto dal: Oct 2006
Messaggi: 170
qualcuno mi aiutiiiii domani devo consegnaro, nn so fare l'array di stringhe!!!!!!!11
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 19:49   #5
lucas87
Bannato
 
Iscritto dal: Oct 2006
Messaggi: 170
praticamente devo fare l'ordinamento lessicografico di un array di strighe, chi mi aiuta
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 20:59   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 23:52   #7
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
@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");
}
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 09:34   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da wingman87
bisognerebbe che siano anche scritti bene.
Posso essere del tutto sincero??? .... Ehm ... il tuo codice è orripilante.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 10:02   #9
cionci
Senior Member
 
L'Avatar di cionci
 
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++...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 13:28   #10
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2794
Quote:
Originariamente inviato da andbin
Posso essere del tutto sincero??? .... Ehm ... il tuo codice è orripilante.
Ok, cosa devo fare x migliorarlo?
@cionci: a scuola impariamo il c++, so che una differenza è che il C non è ad oggetti, quindi avrei dovuto non usare la iostream?
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 14:09   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da wingman87
Ok, cosa devo fare x migliorarlo?
Guarda ... sinteticamente:
- 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, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 14:29   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da wingman87
@andbin: funziona ma vorrei sapere se ho scritto del buon codice, me lo puoi controllare?
Diciamo che te la scrivo in C++
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;
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 15:06   #13
lucas87
Bannato
 
Iscritto dal: Oct 2006
Messaggi: 170
diciamo che me lo scrivete in C smplice cosi mi risolvete un grande problema?
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 15:10   #14
cionci
Senior Member
 
L'Avatar di cionci
 
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 15:12   #15
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da cionci
Diciamo che te la scrivo in C++
Ah beh ... certo, usando STL è mooooolto facile.
__________________
Andrea, Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 15:16   #16
lucas87
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");
}
eccolo pero non posso usare jump e non so cosa sia strtok. in piu dovrei levare iostream.

che altro devo fare quindi?
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 15:23   #17
cionci
Senior Member
 
L'Avatar di cionci
 
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");
La strtok o string tokenizer è una funzione molto potente, ma anche abbastanza complessa...è probabilmente la più complessa della libreria standard... Sommariamente serve per dividere una stringa in vari pezzi sostituendo il carattere di fine stringa alla prima occorrenza del carattere cercato (in questo caso lo spazio)...
http://www.cplusplus.com/ref/cstring/strtok.html
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 15:42   #18
lucas87
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]);  
      }
ora dovrò sostituire l'ordinamento, in quanto l'esercio non chiede un ordinamento in generale, ma margesort. chia ha qualche idea mi facci sapere.
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 15:50   #19
lucas87
Bannato
 
Iscritto dal: Oct 2006
Messaggi: 170
ok a quanto pare ho sottovalutato mergesort, è piu difficile di quanto credessi. chi mida una mano??
lucas87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 16:40   #20
trallallero
Senior Member
 
L'Avatar di trallallero
 
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
Quote:
Originariamente inviato da lucas87
ok a quanto pare ho sottovalutato mergesort, è piu difficile di quanto credessi. chi mida una mano??
a parte che potresti scegliere se usare il C o il C++ quindi malloc O new
e poi questa:
Codice:
frase = (char *) malloc(1);
non ho seguito il programma ma vedo che allochi 1 (UNO) byte di memoria ...
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];
tanto non esiste una parola cosí lunga. Ce ne stanno 10
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.
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
La Cina si prepara al primo lancio orbit...
Sale LAN, la Manovra 2027 introduce una ...
11 prezzi imperdibili in Amazon: non sol...
Giù i prezzi di Xiaomi 17T e Xiao...
Una tassa di 5,5 centesimi su ogni gigab...
Vuoi clonare un videogioco con l'IA? Cla...
Furto da 6,3 miliardi di dollari, Binanc...
Gli USA dipendono dai robot stranieri: T...
Volkswagen non ha più soldi per l...
Telescopio spaziale Hubble: la NASA cerc...
Più sottile e potente: le nuove i...
Il JPL estende la vita operativa della s...
DAZN Full è in offerta: tutta la ...
GTA 6 su PC potrebbe arrivare prima del ...
Da zero al tracciato in secondi: LibreCo...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:53.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v