Torna indietro   Hardware Upgrade Forum > Software > Programmazione

L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026
La parola d'ordine al Nextcloud Summit 2026, che si è tenuto a Monaco, è stata "sovranità". Non come è spesso usato questo termine in politica ma, al contrario, come capacità positiva di decidere il proprio destino tecnologico, con modalità collaborative e aperte. L'Europa dice già molto nel mondo open source, che viene visto come mezzo per ottenere la tanto agognata autonomia digitale
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più
Dreame X60 Pro Ultra Complete implementa due bracci estensibili, per spazzola e moccio, che si spingono ben oltre quanto visto sino ad oggi permettendo una pulizia di casa ancor più capillare e precisa
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati
La tecnologia SQD-Mini LED di TCL arriva sul taglio da 65 pollici con la serie C8L: 2040 zone, pannello WHVA 2.0 e un picco che alle rilevazioni delle sonde tocca i 4400 nit nel profilo Filmmaker e un HDR quasi perfetto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-12-2006, 15: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, 15: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 18: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, 18: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, 18: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, 19: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2006, 22:52   #7
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2790
@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, 08: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 09: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, 12:28   #10
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2790
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, 13: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 13: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, 14: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, 14: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, 14: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 developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2006, 14: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, 14: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, 14: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, 14: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, 15: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 15:42.
trallallero è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Dreame X60 Pro Ultra Complete: i bracci si estendono sempre di più Dreame X60 Pro Ultra Complete: i bracci si esten...
TCL 65C8L, la recensione del SQD-Mini LED da 4400 nit misurati TCL 65C8L, la recensione del SQD-Mini LED da 440...
MSI Maestro 500 Wireless: ANC e 90 ore di autonomia a 70 euro MSI Maestro 500 Wireless: ANC e 90 ore di autono...
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Tutte le offerte che meritano del Prime ...
Prime Day Apple: Studio Display, Apple W...
Prime Day FRITZ!: dal 5G al Wi‑Fi ...
Prime Day smartphone: Galaxy S26 in test...
Prime Day Amazon, pioggia di sconti sui ...
Nikon e Prime Day Amazon: si risparmiano...
Prime Day cuffie: Sony WH-1000XM6 e AirP...
Prime Day su schede video, memorie, stor...
Prime Day TV: LG, Philips, Samsung, TCL ...
Prime Day appena partito, tutti i robot ...
Prime Day portatili gaming, da HP Victus...
Portatili tuttofare: il meglio del Prime...
Prime Day e Amazon Seconda Mano, parte i...
Engwe O20 Boost: abbiamo provato in ante...
UWANT V800: addio al rullo rotante, l’as...
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: 03:13.


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