Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Destiny Rising: quando un gioco mobile supera il gioco originale
Destiny Rising: quando un gioco mobile supera il gioco originale
Tra il declino di Destiny 2 e la crisi di Bungie, il nuovo titolo mobile sviluppato da NetEase sorprende per profondità e varietà. Rising offre ciò che il live service di Bungie non riesce più a garantire, riportando i giocatori in un universo coerente. Un confronto che mette in luce i limiti tecnici e strategici dello studio di Bellevue
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro è un registratore digitale elegante e tascabile con app integrata che semplifica trascrizioni e riepiloghi, offre funzioni avanzate come template e note intelligenti, ma resta vincolato a un piano a pagamento per chi ne fa un uso intensivo
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-05-2015, 17:00   #1
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Ordinamento e Array

Salve a tutti,
tra un paio di giorni ho l'esame di programmazione, devo però portare dei programmi, uno di questi mi sta dando diversi problemi nell'implementazione. Vi scrivo qui sotto il testo richiesto:

In questo esercizio ti viene chiesto di implementare l'algoritmo di Selection Sort visto in classe.

Una volta implementato l'algoritmo, risolvi i seguenti esercizi:
3. Dato un vettore di interi v e un intero x, scrivi una funzione in C che stampa a video la piu piccola
sequenza di elementi di v la cui somma supera x. Ad esempio, supponiamo che v = {3; 12;-1; 10}.
A tal ne basta prendere la sequenza formata dall'unico elemento 12 per avere 12 > 10. Qual'e la
complessita computazionale dell'algoritmo proposto?


Probabilmente, anzi quasi sicuramente ci sarà un modo migliore per implementarlo, quindi anche in questo vorrei essere aiutato, comunque la parte che mi manca è quella che mi confronta i singoli elementi dell'array con la x, quando ho provato a implementarlo il problema è che mi stampava tutti e tre i risultati, cioè sia la somma di due che somma dei tre elementi insieme al singolo.
Vi scrivo, quindi, il codice qui sotto:




Codice:
#include <stdio.h>
#include <stdlib.h>

const int dim = 3;		//Dimensione

int main()
{
    int* v = (int*)calloc(dim,sizeof(int));	//Crea un array dinamico di 4 celle tute inizializzate a 0
    int k,somma,i,j,totale;
    printf("Inserisci elementi:\n"); 
    for (i = 0 ; i < dim ; i++ )
    {			//Inserisco i valori nelle celle scandite da 0 a 3
        printf("\tInserisci valore: ");
        scanf("%d", &v[i]);
	}
    
    int x;
    printf("inserisci un intero x \n");		//Setto il valore di x
    scanf("%d", &x);
    
    k = somma = totale = 0;
    while(k < dim)
    {							//Se il mio scan di indice raggiunge la fine dell'array
		for(j = 0; j < dim; j++)
        {			//Sotto ciclo per scandire le altre posizioni
			if(j != k)
            {						//Leggo tutte le posizioni tranne in quella dove sono
				somma = v[k]+v[j];
				if(somma > x)
                {				//Se la somma è superiore a x, ho finito esco dal programma e faccio una stampa.
					printf("Nella posizione v[%d]=%d e v[%d]=%d la loro somma e' %d supera il valore x=%d\n",k,v[k],j,v[j],somma,x);
                    return 0;
				}
                
		    }
		}
		k++;
		for(j = 0; j < dim; j++)
        {
		    if(j != k)
		    {
                totale = v[k]+v[j]+v[j++];
                if(somma < x && totale > x)
	            {
				    printf("La somma di tutti gli elementi nel vettore e' %d supera il valore x=%d\n",totale,x);
                    return 0;   
				}
		    }
		}
	}
	printf("La somma di tutti gli elementi dell'array e' minore di x= %d\n",x);	//Se sono arrivati qui senza essere stato bloccato sopra vuol dire che non ci sono elementi per cui la loro somma sia superiore ad x.
	free(v);	//Libero la memoria allocata per V, per renderla di nuovo disponibile al OS
    return 0;
}


Chiedo un vostro aiuto, ringrazio anticipatamente.

Ultima modifica di shiony710 : 20-05-2015 alle 00:10.
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 05:54   #2
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2774
Secondo me il problema è mal posto: perché l'esercizio inizia dicendo che ti viene richiesto di implementare l'algoritmo di selection sort?
Probabilmente vuole che il vettore lo tratti come un insieme e non come una sequenza al fine di trovare la più piccola sequenza di numeri (diversi) la cui somma supera x.
Così avrebbe molta più attinenza con il sorting...
Se così non fosse, riguardo il tuo codice, ti consiglio di dividerlo in sotto funzioni (tra l'altro ti viene richiesto di scrivere una funzione). Inoltre la dimensione dell'array deve essere variabile quindi il modo in cui hai scritto l'algoritmo non va proprio bene...
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 05:54   #3
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Edito: già risposto wingman
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 06:06   #4
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Ordini il vettore dal più piccolo al più grande poi di volta in volta sommi gli elemento dell'array fino a che la somma supera l'intero di riferimento
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 06:11   #5
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Nell'esempio il vettore ordinato sarebbe v= {12,10,3,-1} e x=10, quindi dato che 12 è già maggiore di x il ciclo di somma si chiude e il risultato è 12
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 13:51   #6
Zeppe79
Senior Member
 
Iscritto dal: Feb 2006
Messaggi: 326
forse

se vuoi risolvere l'esercizio utilizzando il sorting, come dice mattia, ordini il vettore dall'intero più grande al più piccolo, e all'interno di un ciclo fai il confronto. es: v=[9,4,-5,7,3,11] e x=14.
ordini v, così da avere [11,9,7,4,3,-5]
inizi il ciclo:
11 > 14 ? no
(11+9) > 14 ? sì -> fine ciclo, trovato il risultato
Zeppe79 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 15:43   #7
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Credo di averlo terminato, a me il programma funziona correttamente ditemi se c'è qualcosa da correggere


Codice:
#include <stdio.h>
 
int main()
{
   int v[100], n, i, j, position, swap, somma=0;
   
 
   printf("Inserisci il numero degli elementi\n");
   scanf("%d", &n);
 
   printf("Inserisci %d elementi\n", n);
 
   for ( i = 0 ; i < n ; i++ )
      scanf("%d", &v[i]);
 
   for ( i = 0 ; i < ( n - 1 ) ; i++ )
   {
      position = i;
 
      for ( j = i + 1 ; j < n ; j++ )
      {
         if ( v[position] < v[j] )
            position = j;
      }
      if ( position != i )
      {
         swap = v[i];
         v[i] = v[position];
         v[position] = swap;
      }
   }
 
   printf("Lista in ordine decrescente:\n");
 
   for ( i = 0 ; i < n ; i++ )
      printf("%d\n", v[i]);
    int x;
    printf("inserisci un intero x \n");		//Setto il valore di x
    scanf("%d", &x);
    for( i = 0; i < n; i++)
	{
	     if ( v[i] > x)
         {
  			 printf("Il primo elemento dell'array=%d e' maggiore di x=%d", v[i], x);
			 return 0;
		 }
		 else
		 {
			for(i = 0; i < n; i++)
			{
				somma += v[i];
				if (somma > x)
			    {
					printf("la somma degli elementi e' %d maggiore di x %d", somma, x);
					return 0;
			    }
			}
		 }
	 
       printf("La somma di tutti gli elementi dell'array e' minore di x= %d\n",x);	
    }
	return 0;
   
}

Ultima modifica di shiony710 : 20-05-2015 alle 17:44.
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 18:41   #8
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Ad occhio sembra che funzioni ma non mi pare che ritorni un secondo vettore che contiene solo la minore sequenza di elementi che servono per superare il numero x
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 21:39   #9
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
ma perché comunque il testo non è molto chiaro, non capisco se come sequenza intendi il minor numero di elementi da utilizzare o anche la grandezza degli elementi, se fosse come nel secondo caso come dovrei cambiarlo?
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 20-05-2015, 21:45   #10
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
La traccia dice di stampare a video la più piccola sequenza degli elementi dell'array v, tale che la somma di questi superi il valore di x
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 00:20   #11
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Si, ma ripeto non si capisce se con "sequenza" intendo il numero di elementi da utilizzare o anche la grandezza degli elementi
shiony710 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 06:42   #12
GTKM
Senior Member
 
L'Avatar di GTKM
 
Iscritto dal: Jan 2014
Messaggi: 3826
Scusatemi eh, che c'è di poco chiaro? Una sequenza è una serie di oggetti disposti in un certo ordine.

Dunque, il compito del programma è quello di stampare a video la più piccola "lista" di numeri la cui somma supera 'x'.

Comunque, non per rompere le uova nel paniere, ma l'esercizio chiede che sia scritta una funzione che risolva questo problema. Tra l'altro, il C è stato proprio pensato e realizzato per scomporre il programma in funzioni.
Mettere tutto nel main è il modo peggiore di usare questo linguaggio
GTKM è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 06:48   #13
mattia01
Member
 
Iscritto dal: Jun 2005
Messaggi: 130
Sono pienamente d'accordo!
mattia01 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 08:22   #14
Zeppe79
Senior Member
 
Iscritto dal: Feb 2006
Messaggi: 326
ciclo di troppo ?

dorvesti spezzare il codice in funzioni, anche solo per aumentare la leggibilità: almeno 1 funzione che fa il sorting (array in ingresso,e array in uscita), 1 funzione che fa la ricerca (array in ingresso, x in ingresso, risultato in uscita). Nel main tieni l'interazione con l'utente.

Secondo me nella funzione di ricerca fai un ciclo di troppo:

Codice:
for( i = 0; i < n; i++)
{
    if ( v[i] > x)
    {
        printf("Il primo elemento dell'array=%d e' maggiore di x=%d", v[i], x);
	return 0;
     }
    .....
secondo me il controllo che fai su v[i] lo puoi integrare nel secondo ciclo, iniziando da somma = 0;

Codice:
somma = 0;
for(i = 0; i < n; i++)
{
	somma += v[i];

	if (somma > x)
        {
		printf("la somma degli elementi e' %d maggiore di x %d", somma, x);
		return 0;
	}
}
In più dovresti salvare l'array di elementi la cui somma > x, o quanto meno l'indice i dell'array ordinato dove raggiungi il risultato.
Zeppe79 è offline   Rispondi citando il messaggio o parte di esso
Old 21-05-2015, 15:41   #15
shiony710
Junior Member
 
Iscritto dal: Jan 2015
Messaggi: 16
Ok perfetto, vi ringrazio per l'aiuto, siete stati gentilissimi , vorrei però usufruire una seconda volta del vostro aiuto per chiedermi chiarimenti riguardante la complessità, sia in questo programma che in generale.
Perché studiandola sia da internet che dal libro, ho avuto scarsi risultati nel comprenderla, quindi se in qualche modo potete darmi una mano ne sarei entusiasta
shiony710 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Destiny Rising: quando un gioco mobile supera il gioco originale Destiny Rising: quando un gioco mobile supera il...
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
L'autobus elettrico interurbano di Merce...
Il PPE contro il Green Deal: 'Salviamo l...
AMD lancia in segreto quattro nuovi Ryze...
Maxi blitz contro lo streaming pirata: u...
PS5: oggi l'update che introduce il Powe...
Tesla apre le vendite del Cybertruck neg...
realme Watch 5: il nuovo smartwatch arri...
AV2 in arrivo entro fine anno: il nuovo ...
Echo, Kindle e Fire TV: Amazon prepara u...
Shai-Hulud è il worm auto-replica...
Stop a benzina e diesel dal 2035, ecco c...
Gli strumenti di scrittura AI arrivano s...
Tesla tenta l'azzardo in Europa: produzi...
OpenAI cerca un esperto di contenuti: ha...
Consumer Reports attacca Microsoft: 'Con...
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: 12:10.


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