-

[RISOLTO] [C] Far acquisire all'utente un vettore

Stato
Discussione chiusa ad ulteriori risposte.

Drew_

Nuovo Utente
46
3
Hardware Utente
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
Hard Disk
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
Scheda Video
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
Alimentatore
seasonic s12ll 520w
Case
NZXT S340
Sistema Operativo
Windows 10
#1
Ciao ragazzi non capisco come far acquisire all utente un vettore (nemmeno per le stringhe ) una sequenza che viene terminata dall inserimento di un particolare valore , ad esempio lo 0
 

rodhellas

Utente Attivo
1,432
381
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#2
Intanto posta quello che sei riuscito a fare o quello che sai fare. Poi ti aiutiamo
 

Drew_

Nuovo Utente
46
3
Hardware Utente
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
Hard Disk
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
Scheda Video
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
Alimentatore
seasonic s12ll 520w
Case
NZXT S340
Sistema Operativo
Windows 10
#3
C:
#define STOP '0'
#include<stdio.h>
#include<stdlib.h>

int main(int argc,char*argv[])
{
  int n,i;
  int *v;
  n=0;
  for(i=0;v!=STOP;i++){
    scanf("%d",&v[I]);
    n++;}
  for(i=0;i<n;i++)
      printf("%d",v[I]);
    return 0;
  }[/I][/I]

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

int main(int argc,char*argv[])
{
  int *v;
  int dim,i,num;
  for(dim=0,i=0;num!=0;dim++,i++){
    v=(int*)malloc((dim+1)*sizeof(int));
    scanf("%d",&num);
    v[I]=num;
    }
  printf("%d",dim-1);
    return 0;
  }
Adesso mi è uscito questo che mi stampa la dimensione dell array con la sequenza che si ferma con lo 0(non contato), è una cosa giusta?
 
Ultima modifica da un moderatore:
511
303
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#4
Stai sbagliando. Se devi allocare un array devi allocare memoria prima del for. Ma non ha molto senso il codice in generale...
Per altro anche in caso di riallocazioni dovresti utilizzare realloc.

Dovresti creare una sorta di "array dinamico" per gestire le riallocazioni quando viene raggiunta la dimensione massima, per fare una cosa fatta bene.

In pausa pranzo ti rispondo meglio se dovesse servire.
 

Drew_

Nuovo Utente
46
3
Hardware Utente
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
Hard Disk
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
Scheda Video
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
Alimentatore
seasonic s12ll 520w
Case
NZXT S340
Sistema Operativo
Windows 10
#5
Se mi scriveresti un esempio di come si crea un array dinamico che si ferma quando inserisco lo zero mi faresti un favore enorme (la realloc non ce la fanno usare)
Quando hai tempo e se ti va
Comunque grazie

"Scrivete un programma che legga una sequenza di interi e la stampi al contrario, allocando la memoria necessaria in modo dinamico attraverso l’uso della funzione malloc.
L’input è dato da una sequenza di numeri terminata da 0; non potendo prevedere quanti numeri verranno inseriti, il vettore andrà ridimensionato man mano."

Questo è l'esercizio che dovrei fare
 
Ultima modifica da un moderatore:
511
303
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#7
Se mi scriveresti un esempio di come si crea un array dinamico che si ferma quando inserisco lo zero mi faresti un favore enorme (la realloc non ce la fanno usare)
Inizio con lo scriverti i passi in maniera descrittiva in quanto se ti scrivo il codice non capiresti come funzionano le cose (e l'esercizio è per te/voi).

Dovresti creare una funzione - spero le possiate utilizzare considerando che state utilizzando puntatori - che allochi la memoria e copi gli elementi del vecchio array nel nuovo qualora la dimensione venga raggiunta.
Nello specifico prima di inserire un nuovo elemento dovrai verificare se la capienza massima è stata raggiunta; se la capienza massima è stata raggiunta chiama una funzione che, ricevuti l'array e la dimensione come parametro, alloca il doppio della memoria (se prima erano 10 elementi, farai 10*2).
Fatto ciò, dovrai copiare tramite memcpy i valori dal vecchio array al nuovo (se non puoi usare memcpy, fai un for), poi fai un free sull'array ricevuto come parametro, e restituisci il nuovo array.

Puoi astrarre come preferisci: puoi anche avere una funzione che ricevuti due parametri (array e valore) verifichi il numero degli elementi presenti e richiami la funzione che alloca il doppio della memoria allocata prima.

In una sorta di pseudocodice:
C:
// capacity = 10
int *array = malloc(capacity * sizeof(int));
int n, size = 0;

while(true) {
  // leggi in input il valore, memorizzalo in n    
  if(n == 0)
      break;
  
  if(capacity == size)
  {
    // chiami la funzione che copia l'array; se non puoi usare funzioni, fai un ciclo qui;
    // ricordati che ora capacity però deve essere: capacity = capacity * 2
  }
  
  array[size++] = n;
}

// stampi l'array al contrario
Sono un pò di fretta, ma non dovrei aver commesso errori nell'esposizione.
 

Drew_

Nuovo Utente
46
3
Hardware Utente
CPU
intel i5-6600
Dissipatore
stock
Scheda Madre
ASrock h170 pro4/hyper
Hard Disk
WD wd10ezex 1TB 7200rpm + ssd samsung 850 evo 256 GB
RAM
corsair vengeance 2x4 GB 2133mhz CL13
Scheda Video
Sapphire Amd rx 480 nitro 8GB
Monitor
Asus vg245h
Alimentatore
seasonic s12ll 520w
Case
NZXT S340
Sistema Operativo
Windows 10
#8
Va bene grazie mille sei stato molto chiaro e molto gentile


Inviato dal mio iPhone utilizzando Toms Hardware Italia Forum
 
Stato
Discussione chiusa ad ulteriori risposte.

Discussioni Simili


Entra

Guarda il video live di tomshardwareita su www.twitch.tv