Torna indietro   Hardware Upgrade Forum > Software > Programmazione

In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi
Abbiamo assemblato e provato la Fiido Nomads Pro, evoluzione del modello da trekking già presente nella gamma, che migliora in tutto, soprattutto grazie al motore centrale, fluido e potente. Ottima app, costruzione solida e prezzo ok completano il quadro
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto
Lo chassis in Ceraluminium è il cuore di questo notebook in edizione 2026, un modello pensato per garantire produttività con le tipiche applicazioni di produttività personale e capace di offrire un'autonomia di funzionamento lontano dalla presa di corrente da riferimento. Potenza, facilità di trasporto e costruzione robusta tutto in un notebook compatto.
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare
MSI PRO MAX 341QPXW14G è un monitor ultrawide da 34 pollici che porta la tecnologia QD-OLED di quinta generazione in un contesto principalmente orientato alla produttività. La qualità dell'immagine è elevatissima, il formato 21:9 è ideale per il multitasking e la dotazione di porte trasforma il monitor in un vero hub per Mac, PC e dispositivi mobili. Il limite principale è invece il refresh rate di soli 144 Hz, che lo allontana dai giocatori competitivi più esigenti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-12-2008, 21:04   #1
fabri_napoli
Junior Member
 
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
[C] array+array=...?

Buonasera a tutti
Proseguivo con gli esercizi che il professore di programmazione ci ha assegnato, e (grazie a voi) sembrava andare tutto per il meglio, ormai le funzioni le ho imparate.. quando arrivo a questo esercizio:
Realizzare una function di tipo main e function merge che esegua la fusione (merge) di due array ordinati...
Non so se perchè ho il cervello fuso o meno, ma mi sembra più difficile del normale
Vi posto quello che ho fatto fin'ora:
Codice:
#include <stdio.h>
#include <stdlib.h>

int merge (int *a, int *b, int n, int t);

main ()
{
     int *a, *b, *c, n, t, s, i, j, k;
     
     printf ("Inserisci il numero di elementi contenuti nel primo array\n");
     scanf ("%d", &n);
     a=(int*)malloc(n*sizeof(int));
     printf ("Inserisci il numero di elementi contenuti nel secondo array\n");
     scanf ("%d", &t);
     b=(int*)malloc(t*sizeof(int));
     
     for (i=0; i<n; i++) {
                          printf ("Inserisci l'elemento n.%d dell'array A\n", i+1);
                          scanf ("%d", &a[i]); }
     for (j=0; j<t; j++) {
                          printf ("inserisci l'elemento n.%d dell'array B\n", j+1);
                          scanf ("%d", &b[j]); }
     
     merge (a, b, n, t);
     
     printf ("La fusione dei due array ha generato un terzo array contenente i seguenti elementi\n");
     
     for (k=0; k<s; k++) {
                          printf ("%d) %d", k+1, c[k]); }
                          
     system ("pause");
     free (a);
     free (b);
     }
     
int merge (int *a, int *b, int n, int t) {
    int s= n+t;
    int i, j;
    int k=-1;
    int *c;
    
    for (i=0; i<n; i++) {
        for (j=0; j<t; j++) { 
                         if (a[i]<b[j]) {
                                         a[i]=c[k++]; }
                         else { b[j]=c[k++]; }
                         }
}
}
Potreste aiutarmi a capire cos'è che ho sbagliatoo?? mi crasha!! forse ho messo più variabili di quante ne servano? forse sbaglio a scrivere la function??
Vi ringrazio in ogni caso ^^
buona serata!
fabri_napoli è offline   Rispondi citando il messaggio o parte di esso
Old 12-12-2008, 21:50   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da fabri_napoli Guarda i messaggi
Potreste aiutarmi a capire cos'è che ho sbagliatoo?? mi crasha!! forse ho messo più variabili di quante ne servano?
Sbagliato, ne hai messo di meno: hai dichiarato int *c nel main() e anche nella merge(), ma non l'hai inizializzata mai da nessuna parte. In più, i cambiamenti che effettui sulla variabile nella funzione non si ripercuoteranno mai nella funzione principale (devi passare anche il puntatore al vettore in cui salvare i risultati, o allocarlo nella funzione e restituirlo come valore di ritorno).
Quote:
Originariamente inviato da fabri_napoli Guarda i messaggi
forse sbaglio a scrivere la function??
Questo di sicuro: si chiama funzione, se esiste un nome italiano ci sarà un perché.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 13-12-2008, 20:41   #3
fabri_napoli
Junior Member
 
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
ho letto e riletto il tuo messaggio ma non capisco
devo iniziare un altro ciclo for per scorrere C insieme ad A e B?
fabri_napoli è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 02:17   #4
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da fabri_napoli Guarda i messaggi
Codice:
#include <stdio.h>
#include <stdlib.h>

int merge (int *a, int *b, int n, int t);

main ()
{
     int *a, *b, *c, n, t, s, i, j, k;
     
     printf ("Inserisci il numero di elementi contenuti nel primo array\n");
     scanf ("%d", &n);
     a=(int*)malloc(n*sizeof(int));
     printf ("Inserisci il numero di elementi contenuti nel secondo array\n");
     scanf ("%d", &t);
     b=(int*)malloc(t*sizeof(int));
     
     for (i=0; i<n; i++) {
                          printf ("Inserisci l'elemento n.%d dell'array A\n", i+1);
                          scanf ("%d", &a[i]); }
     for (j=0; j<t; j++) {
                          printf ("inserisci l'elemento n.%d dell'array B\n", j+1);
                          scanf ("%d", &b[j]); }
     
     merge (a, b, n, t);
     
     printf ("La fusione dei due array ha generato un terzo array contenente i seguenti elementi\n");
     
     for (k=0; k<s; k++) {
                          printf ("%d) %d", k+1, c[k]); }
                          
     system ("pause");
     free (a);
     free (b);
     }
     
int merge (int *a, int *b, int n, int t) {
    int s= n+t;
    int i, j;
    int k=-1;
    int *c;
    
    for (i=0; i<n; i++) {
        for (j=0; j<t; j++) { 
                         if (a[i]<b[j]) {
                                         a[i]=c[k++]; }
                         else { b[j]=c[k++]; }
                         }
}
}
Ti ho messo in grassetto le parti problematiche: quel puntatore int *c è dichiarato nel main() ma la memoria a cui dovrebbe puntare non è mai riservata ed il puntatore rimane non inizializzato (quindi andresti a scrivere un po' a caso nella memoria). Fai la stessa identica cosa nel merge(), con la sola differenza che qui vai anche a scriverci effettivamente della roba, e quasi certamente vai ad interferire con dati che non sono nello spazio riservato per la tua applicazione.

In più, se anche la merge() funzionasse, non ti sei assicurato che il puntatore faccia riferimento alla stessa memoria in cui vuoi scrivere: quindi se tu allocassi la memoria per l'array dentro merge() poi la main() non riceverebbe le modifiche. Devi quindi allocarla nella main(), passare il puntatore come parametro alla merge(), e da lì riempirla.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 02:26   #5
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
vorrei sdrammatizzare un pochino

a domanda rispondo
domanda : [C] array+array=...?
risposta : 2array
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 02:29   #6
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989


Mi rincuora se non altro che non sono l'unico scemo che alle 3 e mezza della notte scrive cazzate.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 14:19   #7
fabri_napoli
Junior Member
 
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
ho finalmente capito cosa intendevi
quindi ho scritto:
Codice:
#include <stdio.h>
#include <stdlib.h>

int merge (int *a, int *b, int *c, int n, int t);

main ()
{
     int *a, *b, *c, n, t, s, i, j, k;
     
     printf ("Inserisci il numero di elementi contenuti nel primo array\n");
     scanf ("%d", &n);
     a=(int*)malloc(n*sizeof(int));
     printf ("Inserisci il numero di elementi contenuti nel secondo array\n");
     scanf ("%d", &t);
     b=(int*)malloc(t*sizeof(int));
     c=(int*)malloc((t+n)*sizeof(int));
     
     for (i=0; i<n; i++) {
                          printf ("Inserisci l'elemento n.%d dell'array A\n", i+1);
                          scanf ("%d", &a[i]); }
     for (j=0; j<t; j++) {
                          printf ("inserisci l'elemento n.%d dell'array B\n", j+1);
                          scanf ("%d", &b[j]); }
     
     merge (a, b, c, n, t);
     
     printf ("La fusione dei due array ha generato un terzo array contenente i seguenti elementi\n");
     
     for (k=0; k<(n+t); k++) {
                 
                          printf ("%d\n", c[k]); }
     system ("pause");
     free (a);
     free (b);
     }
     
int merge (int *a, int *b, int *c, int n, int t) {
    int s= n+t;
    int i, j;
    int k=-1;
    
    for (i=0; i<n; i++) {
        for (j=0; j<t; j++) { 
                         if (a[i]<b[j]) {
                                         c[k++]=a[i]; }
                         else { c[k++]=b[j]; }
                         }
ma a quanto pare è proprio la funzione merge che non funge
se inserisco ad esempio a= {1,2} e b= {3,4} nell'array risultante mi stampa valori come 1, 1, 2, 2, 2...
e se provassi ad avanzare contemporaneamente nei due array con un unico indice incrementandolo ogni volta di uno?
fabri_napoli è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 14:41   #8
Netskate
Senior Member
 
L'Avatar di Netskate
 
Iscritto dal: Oct 2004
Messaggi: 1661
vediamo se ho capito.

devi fondere due array ordinati in modo da avere un terzo array (sempre ordianto) che li contenga entrambi?

esempio

primo array: 1, 5, 6
secondo array: 2, 9, 10

(sto supponendo che per ordine intendi la grandezza del numero in ordine crescente)

array dopo il merge: 1, 2, 5, 6, 9, 10

se cosi fosse, quali vincoli hai?
ci sono parecchie strade da seguire, sembra che ti sei un po' complicato la vita ^^
Netskate è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 15:13   #9
fabri_napoli
Junior Member
 
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
Quote:
Originariamente inviato da Netskate Guarda i messaggi
vediamo se ho capito.

devi fondere due array ordinati in modo da avere un terzo array (sempre ordianto) che li contenga entrambi?

esempio

primo array: 1, 5, 6
secondo array: 2, 9, 10

(sto supponendo che per ordine intendi la grandezza del numero in ordine crescente)

array dopo il merge: 1, 2, 5, 6, 9, 10

se cosi fosse, quali vincoli hai?
ci sono parecchie strade da seguire, sembra che ti sei un po' complicato la vita ^^
esattamente, quello che devo fare è proprio questo!
ghghgh se ci sono tante strade da seguire secondo me allora mi sono completamente perso
fabri_napoli è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 15:50   #10
Kenger
Member
 
Iscritto dal: Aug 2005
Messaggi: 168
Codice:
    for (i=0; i<n; i++) {
        for (j=0; j<t; j++) { 
                         if (a[i]<b[j]) {
                                         c[k++]=a[i]; }
                         else { c[k++]=b[j]; }
                         }
}
}
Il problema è che fai il controllo n*t volte al posto che n+t.
La soluzione che mi sembra migliore (che tra l'altro è il merge che si usa di solito in mergesort) è fare un unico ciclo che dura n+t e tenere due ulteriori indici, che indicano a che punto dei vettori a e b si è arrivati.
Kenger è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 16:02   #11
fabri_napoli
Junior Member
 
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
nel frattempo ho avuto un'idea, non so se coincide con quello che hai scritto tu
pensavo di fare un unico ciclo for che scorre l'array C vuoto... e SE a[i]<b[j] allora c[k]=a[i] ed incremento l'indice i di 1. Altrimenti c[k]=b[j] ed incremento j di 1...
ora provo a vi faccio sapere :P

così:
Codice:
int merge (int *a, int *b, int *c, int n, int t) {
    int s= n+t;
    int i=0;
    int j=0;
    int k;
        
            for (k=0; k<s; k++) {
                         if (a[i]<b[j]) {
                                         c[k]=a[i];
                                         i++; }
                         else { c[k]=b[j]; 
                         j++;}
                         }

}
OODDDDIO SEMBRA FUNZIONARE. vado a piedi a pompei se funziona in tutti i casi XD

Ultima modifica di fabri_napoli : 14-12-2008 alle 16:07.
fabri_napoli è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 16:15   #12
fabri_napoli
Junior Member
 
Iscritto dal: Dec 2008
Città: Napoli
Messaggi: 21
ok, finalmente funziona
ringrazio tutti per il vostro prezioso aiuto! domani ho la prova......!!!!!
mi manca solo un ultimo esercizio e poi posso riposarmi!
grazie ancoraaaa!!!
fabri_napoli è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 23:36   #13
Netskate
Senior Member
 
L'Avatar di Netskate
 
Iscritto dal: Oct 2004
Messaggi: 1661
buona fortuna allora

ps: se posso darti un consiglio, cerca di usare dei nomi per le variabili con un po più di significato, aiutano a non confondersi.
Netskate è offline   Rispondi citando il messaggio o parte di esso
Old 15-12-2008, 17:23   #14
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi


Mi rincuora se non altro che non sono l'unico scemo che alle 3 e mezza della notte scrive cazzate.
... ti volevo fare compagnia .. ci sono riuscito allora
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
MSI PRO MAX: QD-OLED ultrawide per lavorare, creare e giocare MSI PRO MAX: QD-OLED ultrawide per lavorare, cre...
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Sprechi pubblici: nessuno vuole i tablet...
Tutti i dispositivi Amazon in offerta fi...
Nikon squalifica il vincitore di Small W...
FBI, proseguono gli arresti per l'attacc...
Amazfit T-Rex 3 Pro a 287,49€ su Amazon:...
GTA 6, il leaker CyberLeek minaccia di p...
Torna la 2 CV, ma è elettrica e c...
NVIDIA voleva un solo connettore di alim...
GeForce RTX 5090 al capolinea? RTX 5080 ...
Rivoluzione in arrivo per Xbox su PC: la...
Weekend di offerte Amazon: vano a ruba l...
Quanto costerà la serie Galaxy S2...
Blink ai minimi su Amazon: videocamere M...
Fire TV Stick 4K a 27,99€, Echo Dot a 29...
Samsung e Thierry Henry: svelata la nuov...
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: 09:05.


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