Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni
Dal richiamo di Enrico Letta alla necessità di completare il mercato unico entro il 2028 alla visione di Nokia sul ruolo dell’IA e delle reti intelligenti, il Nokia Innovation Day 2025 ha intrecciato geopolitica e tecnologia, mostrando a Vimercate come la ricerca italiana contribuisca alle sfide globali delle telecomunicazioni
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza
OPPO Reno14 F 5G si propone come smartphone di fascia media con caratteristiche equilibrate. Il device monta processore Qualcomm Snapdragon 6 Gen 1, display AMOLED da 6,57 pollici a 120Hz, tripla fotocamera posteriore con sensore principale da 50MP e generosa batteria da 6000mAh con ricarica rapida a 45W. Si posiziona come alternativa accessibile nella gamma Reno14, proponendo un design curato e tutto quello che serve per un uso senza troppe preoccupazioni.
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


Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
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...
iPhone Air: rischio flop? Dai tempi di c...
La modalità Xbox di Windows 11 &e...
Display AMOLED curvo anche per i custom ...
ASUS riconosce il problema e avvia un'in...
Tencent si difende dall'accusa di plagio...
Ricchi sempre più ricchi: Kevin D...
Aprono gli ordini per la nuova Fiat 500 ...
Il film sulla F1 è stato un succe...
Google, oltre 200 lavoratori AI licenzia...
Ryzen 7 9800X3D supera il muro dei 7,3 G...
Ascend 950, 960 e 970: Huawei prepara il...
Mitsubishi svela la Eclipse Cross elettr...
PS5 Slim Digital: la nuova revisione ha ...
Scoperto bug grave su Chrome: Google ril...
In Italia si perde il 42% dell'acqua imm...
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: 01:24.


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