Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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
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...
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++
struct data_struct {
uint16_t anno;// uint16_t e' un intero senza segno a 16 bit (in pratica un
// unsigned short int); per usarlo devi includere <stdint.h>
uint8_t mese;// uint8_t e' un intero senza segno a 8 bit (in pratica un
uint8_t giorno;// unsigned char); per usarlo devi includere <stdint.h>
};
... 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++
union data_union {
uint32_t data_long; // uint32_t e' un intero senza segno a 32 bit (in
// pratica un unsigned long int); per usarlo devi
// includere <stdint.h>
data_struct data; // la struttura della data (quella vista prima) si
// "sovrappone" al valore a 32 bit, diventando un
// tutt'uno con esso; a quel punto puoi decidere di
// leggere la data nella sua forma divisa in anno, mese
// e giorno, oppure di leggerla come una "fusione" di
// anno, mese e giorno
};
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++
struct dato_struct {
char nome[LMAX_STR+1]; // lo spazio per la stringa del nome
data_union data; // la data, leggibile come anno, mese, giorno
// oppure come uint32_t, secondo convenienza
};
A questo punto, puoi accedere ai dati in un modo come questo:
Codice sorgente - presumibilmente C++
#include <string.h>
#include <stdint.h>
#define LMAX_NOME 31
#define QDATI 5
struct data_struct {
uint16_t anno;
uint8_t mese;
uint8_t giorno;
};
union data_union {
uint32_t data_long;
data_struct data;
};
struct dato_struct {
char nome[LMAX_NOME+1];
data_union data;
};
void compila_dato( dato_struct *dato, constchar*nome, int a, int m, int g ){
// sarebbe bene controllare la validita' dei parametri...
strncpy( dato->nome, nome, LMAX_NOME );
dato->data.data.anno= a;
dato->data.data.mese= m;
dato->data.data.giorno= g;
}
int main(){
dato_struct dati[QDATI];
compila_dato(&dati[0], "Mozart Wolfgang Amadeus", 1756, 1, 27 );
compila_dato(&dati[1], "Haydn Franz Joseph", 1732, 3, 31 );
compila_dato(&dati[2], "Beethoven Ludwig Van", 1770, 12, 16 );
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.
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.