Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-08-2007, 10:08   #1
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
[C] Ricorsione ordinamento vettore

Allora, devo scrivere una funzione che restituisca 1 se il vettore è ordinato in modo crescente, -1 se è ordinato im modo decrescente e 0 se gli elementi stanno a caso.

con la RICORSIONE

buttate giu qualche idea, intanto ci penso anc'ìhio
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:07   #2
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho abbozzato questo ma non sembra avere molto senso

Codice HTML:
int ordinato(int vett[], int n){
                                
                                
                                if(n=1){return 0;}
                                
                                if(a[n-1]>a[n-2){return 1;}
                                
                                else return ordinato(int vett[], n-1);}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:13   #3
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Devi espandere un pochino il tema.
Per esempio, la tua funzione restituisce:
1 - se il vettore e' ordinato in modo crescente;
-1 - se il vettore e' ordinato in modo decrescente;
0 - se il vettore non e' ordinato;
-2 - se il vettore e' formato da elementi finora uguali.

il senso del risultato -2 e' che altrimenti non puoi stabilire l'ordine di vettori i cui primi elementi sono tutti uguali, ma dovrai rimandare la decisione fino a quando troverai un elemento diverso.

Usando questa considerazione, scriverai una funzione

int getOrder (int *vect, int n)

dove vect e' il tuo vettore ed n e' il numero di elementi ivi contenuti.
Potrai "giocare" con n al fine di ridurre la dimensione del vettore fino al/ai casi base.

BASE:
- se n <= 1 (quindi 0 o 1 elemento), ritornerai -2 (tutti elementi uguali, finora);
- se n == 2, ritornerai i corrispondenti confronti

PASSO RICORSIVO
- se n > 2, allora
- chiami ricorsivamente getOrder (vect, n-1).
Otterrai un risultato compreso fra {-1, 1, 0, -2};
- confronti gli elementi vect[n-2] e vect[n-1], ed il risultato lo confronti
con quanto riportato dalla chiamata ricorsiva.

C'est tout
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:23   #4
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ci provo
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:24   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
ci provo
Bene. Ho realizzato un piccolo codice per provare che funzionasse, se ti serve lo posto
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:27   #6
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho provato a scrivere questo ma non so cosa ci va al posto di if(n==2)

Codice HTML:
int ordinamento(int vett[], int n){
                                   if(n<=1){
                                            return -2;}
                                   if(n==2){
                                            
                                            
                                   if(n>2){
                                           ordinamento(int vett[], int n-1);}
Non è per me la ricorsione, sono piu per le cose meccaniche
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:33   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
anche il caso n > 2 deve essere controllato.

Comunque parliamo ora del caso n == 2. Io farei i confronti (tutti) fra gli unici due elementi che compongono il vettore:

- se vect[0] > vect[1] ritorna -1 (ordinato in modo decrescente)
- se vect[0] < vect[1] ritorna 1 (ordinato in modo crescente)
- se vect[0] == vect[1] ritorna -2 (vettore con tutti elementi uguali)

Ovviamente non hai il caso di vettore non ordinato, visto che contiene solo due elementi, i quali possono essere solo uguali o diversi fra loro e, se diversi, uno e' maggiore dell'altro
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:39   #8
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Codice HTML:
int ordinamento(int vett[], int n){
                                   if(n<=1){
                                            return -2;}
                                   if(n==2){
                                            if(vett[0]>vett[1]){return -1;}
                                            if(vett[0]<vett[1]){return 1;}
                                            if(vett[0]==vett[1]){return -2;}}
                                            
                                            
                                   if(n>2){
                                           ordinamento(int vett[], int n-1);}
Tipo così?

per se il vettore ha piu di 2 elementi devo richiamare direttamente la funzione con n-1 o cosa?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:43   #9
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
http://it.wikipedia.org/wiki/Quicksort
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:45   #10
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ma io non devo ordinare il vettore, devo controllare in che modo è ordinato
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:48   #11
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
Codice HTML:
int ordinamento(int vett[], int n){
                                   if(n<=1){
                                            return -2;}
                                   if(n==2){
                                            if(vett[0]>vett[1]){return -1;}
                                            if(vett[0]<vett[1]){return 1;}
                                            if(vett[0]==vett[1]){return -2;}}
                                            
                                            
                                   if(n>2){
                                           ordinamento(int vett[], int n-1);}
Tipo così?

per se il vettore ha piu di 2 elementi devo richiamare direttamente la funzione con n-1 o cosa?
Si, tipo cosi'. Pero' potresti evitare quanto meno il confronto (vett[0] == vett[1]) mettendo un else o un return -2 secco.

Per quanto riguarda la parte n > 2, devi fare qualcosa di piu' articolato:

1 - ret = ordinamento (vett, n-1); // Controlli se il vettore con n-1 elementi e' in qualche modo ordinato
2 - se ((ret == 1 oppure ret == -2) AND // quindi il vettore precedente e' crescente o quasi
vett[n-2] <= vett[n-1]) // Anche l'ultimo elemento e' maggiore o uguale del precedente
allora
puoi ritornare 1, cioe' il vettore al passo n e' ordinato in maniera crescente.


Analogamente dovrai affrontare il caso in cui il vettore e' ordinato in maniera decrescente.

Piu' semplice e' il caso che il vettore al passo n-1 sia formato da elementi tutti uguali e che anche l'ultimo elemento sia uguale

Infine, il caso che il vettore al passo n-1 sia non ordinato e' banale: in tal caso e' non ordinato anche al passo n.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:53   #12
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
piu o meno ho capito, ora faccio un altro esercizio e ci voglio riuscire da solo

grazie
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:59   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Una soluzione può essere questa:
Codice:
int ordinato (int *arr, int len)
{
    int r = 0;

    if (len > 1)
        r = arr[0] <= arr[1] ? +1 : -1;

    if (len > 2 && ordinato (&arr[1], len-1) != r)
        r = 0;

    return r;
}
L'unico caso particolare è quello di un array con 1 elemento, in tal caso ritorna 0 (che in effetti non è nemmeno sbagliato ... non c'è ordine).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 12:03   #14
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Potete dare un occhiata a questo esercizio. E' una funzione iterativa che somma i numeri presenti in un testo. Mi da dei numeri enormi però il programma sembra giusto
Codice HTML:
#include <stdio.h>
#define SIZE 20
int somma_interi_nel_testo(char *stringa);

int main(){
           
           int somma=0;
           char stringa[SIZE];
           
           printf("Inserisci una stringa:\n");
           scanf("%s", &stringa);
           
           somma=somma_interi_nel_testo(stringa);
           
           printf("%d", somma);
           while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();
           }
           



int somma_interi_nel_testo(char *stringa){
                                          int somma=0;
                                          
                                          for(;*stringa='\0';*stringa++){
                                                               
                                          if(((*stringa)>=0)&&((*stringa)<=9)){
                                                                               somma += *stringa;}
                                                                               }}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 12:09   #15
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da andbin Guarda i messaggi
Una soluzione può essere questa:
Codice:
int ordinato (int *arr, int len)
{
    int r = 0;

    if (len > 1)
        r = arr[0] <= arr[1] ? +1 : -1;

    if (len > 2 && ordinato (&arr[1], len-1) != r)
        r = 0;

    return r;
}
L'unico caso particolare è quello di un array con 1 elemento, in tal caso ritorna 0 (che in effetti non è nemmeno sbagliato ... non c'è ordine).

Mi sembra che questo codice stabilisca se un vettore e' ordinato semplicemente confrontando i primi 2 elementi dello stesso....
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 12:19   #16
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Mi sembra che questo codice stabilisca se un vettore e' ordinato semplicemente confrontando i primi 2 elementi dello stesso....
Analizzalo meglio. Noterai che l'algoritmo che ho usato parte dal fondo dell'array e appena trova discordanza nell'ordine di 3 valori (A vs B e B vs C), ritorna 0 da lì in avanti (tornando indietro dalla ricorsione).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 12:31   #17
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da andbin Guarda i messaggi
Analizzalo meglio. Noterai che l'algoritmo che ho usato parte dal fondo dell'array e appena trova discordanza nell'ordine di 3 valori (A vs B e B vs C), ritorna 0 da lì in avanti (tornando indietro dalla ricorsione).
Hai ragione.
Cmq ho provato a passare
{ 15, 10, 8, 7, 6, 5, 2, 2, 2, 2} e
{ 15, 10, 8, 7, 3, 3, 3, 3, 2, 1}
Mi ha detto, in entrambi i casi, che il vettore non e' ordinato... salvo errori miei, ovviamente
(cmq non penso sia un mio errore ma sia l'operatore ternario...)
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 12:34   #18
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
potete darmi un occhiata all'ultimo programma che ho postato?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 12:47   #19
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
questa dovrebbe essere la versione ricorsiva(incompleta), ditemi almeno se sono sulla giusta strada

Codice HTML:
int somma_interi_nel_testo(char stringa[], int n){
                                                  
                                                  if(n==0){
                                                           return 
                                                  if((stringa[n]>=0)&&(stringa[n]<=9)){
                                                                                       return stringa[n]+somma_interi_nel_testo(stringa[n], n-1);} else return somma_interi_nel_testo(stringa[], n-1);}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 13:32   #20
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Cmq ho provato a passare
{ 15, 10, 8, 7, 6, 5, 2, 2, 2, 2} e
{ 15, 10, 8, 7, 3, 3, 3, 3, 2, 1}
Mi ha detto, in entrambi i casi, che il vettore non e' ordinato...
Azz
Vero ... ma è un problema di concetto a cui non ho pensato subito. Avendo due valori adiacenti uguali, non si può stabilire alcunché sull'ordinamento, nel senso che dovrà essere il resto a determinarlo. In pratica, due valori uguali devono essere "bypassati".

Si dovrebbe aggiungere un quarto valore che indica appunto un "non so nulla dell'ordine".

Dovrebbe essere ok così:
Codice:
int ordinato (int *arr, int len)
{
    int r = -2, rr;

    if (len > 1)
        r = arr[0] < arr[1] ? +1 : arr[0] > arr[1] ? -1 : -2;

    if (len > 2)
    {
       rr = ordinato (&arr[1], len-1);

       if (r == -2)
           r = rr;
       else if (rr != -2 && r != rr)
           r = 0;
    }

    return r;
}
Se tutti i valori nell'array fossero uguali o se ci fosse 1 solo elemento, si otterrebbe alla fine -2.
È praticamente la ipotesi dei valori che facevi tu all'inizio.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
Sicurezza PC: Microsoft punta sui chip d...
Gemini 3 Pro disponibile ora: è i...
Super sconti robot aspirapolvere: ECOVAC...
DOOM: The Dark Ages si espande con Ripat...
EA SPORTS annuncia il futuro della serie...
Tutte le TV già in offerta defini...
Meta non ha un monopolio nel settore dei...
L'amministrazione Trump presta 1 miliard...
Continua la rivoluzione interna in Intel...
Lenovo Legion 5i, gaming senza compromes...
iPhone 17 Pro a sorpresa: il nuovo mostr...
SwitchBot, arriva il Presence Sensor a...
AirPods 4 in super offerta su Amazon: il...
Offerte Bose folli su Amazon: QuietComfo...
Apple apre le porte agli assistenti di t...
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: 11:25.


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