Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
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
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%)
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
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%)
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: 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");
}
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
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da wingman87
bisognerebbe che siano anche scritti bene.
Posso essere del tutto sincero??? .... Ehm ... il tuo codice è orripilante.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
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: 2787
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
Città: TO
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, SCJP 5 (91%) - SCWCD 5 (94%)
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
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da cionci
Diciamo che te la scrivo in C++
Ah beh ... certo, usando STL è mooooolto facile.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
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


Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Beast of Reincarnation ha una data di us...
Provati Reno15 e Reno15 FS: analisi comp...
L'Europa sfida la Cina sul litio: in Fin...
Sono 32, di cui 6 nuove, le offerte Amaz...
Rinnovo dei coupon Amazon nascosti: ecco...
Corsair aggiorna la confezione delle RAM...
Ecco tutti i robot aspirapolvere in offe...
Tachyum: dal processore universale alle ...
L'eVTOL tedesco per missioni mediche e m...
Zscaler Threat Report 2026: l'adozione d...
Claude AI minaccia omicidi e ricatti qua...
Dentro la gara: a Milano Cortina 2026 i ...
Samsung Display presenta QD-OLED Penta T...
KONAMI torna con "Silent Hill: Town...
Rende il citofono smart a 44,99€: Ring I...
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: 13:13.


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