Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ordinamento per data
Forum - C/C++ - Ordinamento per data - Pagina 2

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
daniel007boss (Normal User)
Newbie


Messaggi: 9
Iscritto: 19/01/2018

Segnala al moderatore
Postato alle 21:26
Venerdì, 19/01/2018
Testo quotato

Postato originariamente da Poggi Marco:

L funzione strncat() serve a concatenare due vettori di char.
Come già detto devi implementare un algoritmo di ordinamento (esempio https://it.wikipedia.org/wiki/Bubble_sort).
Ovviamente gli scambi di posizione, quando necessari, vanno fatti contemporaneamente sui due vettori, tra gli stessi indici.  


conta che sono in 3superiore, e sinceramente ho più dubbi che certezze, e sinceramente un algoritmo di ordinamento, bhe non saprei nemmeno da dove iniziare per farlo

PM Quote
Avatar
daniel007boss (Normal User)
Newbie


Messaggi: 9
Iscritto: 19/01/2018

Segnala al moderatore
Postato alle 21:37
Venerdì, 19/01/2018
Testo quotato

Postato originariamente da Mikelius:

Perchè strncat() non puoi usarla? Specifiche del problema?





perchè a quanto pare la posso usare solo se devo intrecciare delle stringhe del tipo v[]=ciao;
ma io ho delle stringhe del tipo v[ciao, ciao1,ciao2];
io devo intrecciare insomma dei valori con delle lettere/parole...


daniel007boss ha allegato un file: Immagine.png (52748 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da daniel007boss il 19/01/2018 alle 21:43
PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 21:48
Venerdì, 19/01/2018
Scusa, ma usi c o c++?

Perchè
Codice sorgente - presumibilmente C/C++

  1. char nomi[5]



e' per una sola stringa di massimo 4 (+ '\0' ) caratteri.

Dovresti usare
Codice sorgente - presumibilmente Plain Text

  1. char* nomi[5]



ed inoltre

strncat vuole 3 argomenti...
strcat ne vuole solo 2.



Ho capito quello che devi fare, ma non ho capito i dati di partenza!

Ultima modifica effettuata da Mikelius il 19/01/2018 alle 21:49
PM Quote
Avatar
daniel007boss (Normal User)
Newbie


Messaggi: 9
Iscritto: 19/01/2018

Segnala al moderatore
Postato alle 21:51
Venerdì, 19/01/2018
Testo quotato

Postato originariamente da Mikelius:

Scusa, ma usi c o c++?

Perchè
Codice sorgente - presumibilmente C/C++

  1. char nomi[5]



e' per una sola stringa di massimo 4 (+ '\0' ) caratteri.

Dovresti usare
Codice sorgente - presumibilmente Plain Text

  1. char* nomi[5]



ed inoltre

strncat vuole 3 argomenti...
strcat ne vuole solo 2.



Ho capito quello che devi fare, ma non ho capito i dati di partenza!





i dati di partenza sono cinque nomi e cinque date, da inserire dentro due vettori da poi intrecciare.
comunque uso c++

PM Quote
Avatar
Mikelius (Member)
Expert


Messaggi: 525
Iscritto: 14/04/2017

Segnala al moderatore
Postato alle 22:11
Venerdì, 19/01/2018
Testo quotato

Postato originariamente da daniel007boss:

i dati di partenza sono cinque nomi e cinque date, da inserire dentro due vettori.



Inizia da qui. Crea i due vettori

PM Quote
Avatar
daniel007boss (Normal User)
Newbie


Messaggi: 9
Iscritto: 19/01/2018

Segnala al moderatore
Postato alle 22:24
Venerdì, 19/01/2018
ci proverò dai

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 23:15
Venerdì, 19/01/2018
Qui siamo all'abc della programmazione, prendete un buon libro e studiate


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 11:38
Sabato, 20/01/2018
Magari scrivo una cosa che didatticamente non ha senso, però non sarebbe più sensato usare delle struct? Se non le hai ancora studiate, cercale sul libro, non sono difficili da capire e in questo caso ti semplificherebbero parecchio la vita!

In pratica, una struct è un insieme di variabili raggrupate in un unico "blocco" che puoi trattare come un tutt'uno. Userei la metafora di uno scatolone: dentro ci metti quel che ti pare, quando lo chiudi è un unico scatolone e lo puoi maneggiare come un tutt'uno, ogni volta che ti serve puoi guardarci dentro e scoprire che quel che ci avevi messo è ancora lì, immutato.

Nel tuo caso, invece di creare due vettori da gestire in parallelo, potresti crearne uno solo che assicura "in automatico" la coerenza tra il nome e la data (a meno che ti sia stato esplicitamente detto di fare diversamente).

Per agevolare l'ordinamento delle date, invece, potresti usare le union (altro costrutto che non so se puoi o non puoi usare, né se lo conosci oppure no).

Una union è un po' come una struct, ma "impacchettata" in modo che i suoi elementi si sovrappongano, si fondano in un tutt'uno. Ad esempio, se organizzi la tua data in forma numerica (non come stringa!) con anno, mese e giorno, in una singola struct...

Codice sorgente - presumibilmente C++

  1. struct data_struct {
  2.     uint16_t anno;  // uint16_t e' un intero senza segno a 16 bit (in pratica un
  3.                     // unsigned short int); per usarlo devi includere <stdint.h>
  4.     uint8_t mese;   // uint8_t e' un intero senza segno a 8 bit (in pratica un
  5.     uint8_t giorno; // unsigned char); per usarlo devi includere <stdint.h>
  6. };



... e poi inserisci quella struct in una union che comprenda anche un uint32_t, finisci per avere una data che puoi leggere nei suoi singoli elementi, oppure come un tutt'uno trasformato in un valore intero senza segno che indica date più recenti col crescere del valore e più "antiche" col ridursi del valore. Molto comodo per riordinarle!

Codice sorgente - presumibilmente C/C++

  1. union data_union {
  2.     uint32_t data_long; // uint32_t e' un intero senza segno a 32 bit (in
  3.                         // pratica un unsigned long int); per usarlo devi
  4.                         // includere <stdint.h>
  5.     data_struct data;   // la struttura della data (quella vista prima) si
  6.                         // "sovrappone" al valore a 32 bit, diventando un
  7.                         // tutt'uno con esso; a quel punto puoi decidere di
  8.                         // leggere la data nella sua forma divisa in anno, mese
  9.                         // e giorno, oppure di leggerla come una "fusione" di
  10.                         // anno, mese e giorno
  11. };



Da lì ad usare la data in questa forma nel tuo problema, il passo è breve: fai una struttura che contenga la stringa del nome e la struttura della data (e' come mettere degli "scatoloni" uno dentro l'altro).

Codice sorgente - presumibilmente C/C++

  1. struct dato_struct {
  2.     char nome[LMAX_STR+1]; // lo spazio per la stringa del nome
  3.     data_union data;       // la data, leggibile come anno, mese, giorno
  4.                            // oppure come uint32_t, secondo convenienza
  5. };



A questo punto, puoi accedere ai dati in un modo come questo:

Codice sorgente - presumibilmente C++

  1. #include <string.h>
  2. #include <stdint.h>
  3.  
  4. #define LMAX_NOME   31
  5. #define QDATI        5
  6.  
  7. struct data_struct {
  8.     uint16_t anno;
  9.     uint8_t mese;
  10.     uint8_t giorno;
  11. };
  12.  
  13. union data_union {
  14.     uint32_t data_long;
  15.     data_struct data;
  16. };
  17.  
  18. struct dato_struct {
  19.     char nome[LMAX_NOME+1];
  20.     data_union data;
  21. };
  22.  
  23. void compila_dato( dato_struct *dato, const char *nome, int a, int m, int g ) {
  24.     // sarebbe bene controllare la validita' dei parametri...
  25.     strncpy( dato->nome, nome, LMAX_NOME );
  26.     dato->data.data.anno   = a;
  27.     dato->data.data.mese   = m;
  28.     dato->data.data.giorno = g;
  29. }
  30.  
  31. int main() {
  32.     dato_struct dati[QDATI];
  33.  
  34.     compila_dato( &dati[0], "Mozart Wolfgang Amadeus", 1756, 1, 27 );
  35.     compila_dato( &dati[1], "Haydn Franz Joseph", 1732, 3, 31 );
  36.     compila_dato( &dati[2], "Beethoven Ludwig Van", 1770, 12, 16 );
  37.     compila_dato( &dati[3], "Clementi Muzio", 1752, 1, 23 );
  38.     compila_dato( &dati[4], "Carulli Ferdinando", 1770, 2, 9 );
  39.  
  40.     return 0;
  41. }



Il bello è che dopo aver immesso i dati, la data di nascita di Mozart puoi leggerla sia come 1756, 1, 27, sia come 0x1B0106DC (453052124), quella di Haydn sia come 1732, 3, 31, sia come 0x1F0306C4 (520292036)! A questo punto, il confronto è immediato, perché 520292036 è chiaramente maggiore di 453052124 e rende evidente che Mozart è nato dopo Haydn. In più, avendo i dati "inscatolati" in una sola struttura, lo scambio da attuare nella funzione di ordinamento si può fare in un colpo solo, senza il rischio di "mischiare" malamente nomi e date, confondendo le corrispondenze. :heehee:




AldoBaldo ha allegato un file: screenshot.png (15145 bytes)
Clicca qui per guardare l'immagine


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo