Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-12-2008, 22: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, 22: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, 21: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, 03: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, 03: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, 03: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, 15: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, 15: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, 16: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, 16: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, 17: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 17:07.
fabri_napoli è offline   Rispondi citando il messaggio o parte di esso
Old 14-12-2008, 17: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 15-12-2008, 00: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, 18: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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
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...
Missione Artemis II diretta verso la Lun...
Toy Story 5 arriva al cinema: è l...
Intel cambia rotta su Linux? Nuove assun...
Samsung aggiorna Bixby con One UI 8.5: p...
L'Etiopia vieta le auto a combustione: a...
Pirateria audiovisiva: la Guardia di Fin...
Ubisoft conferma due nuovi Far Cry in sv...
Chi vincerà il Festival di Sanrem...
G42 e Cerebras portano in India un super...
Offerte aggiornate del weekend Amazon: 7...
4 MacBook Air in offerta e scende a 939€...
Chrome cambia il tuo modo di lavorare: o...
Minimo storico iPhone 17 su Amazon: 909€...
USA, incriminati tre ingegneri della Sil...
Xbox: Phil Spencer lascia dopo 38 anni, ...
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: 22:39.


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