Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
float vet_mean(float vet[], size_t len){
size_t i;
float S=0;
for(i=0;i<len;i++){
S=S+vet[i];
}
return S/len;
}
void vet_print(float vet[], size_t len){
size_t i;
for(i=0;i<len;i++){
cout << vet[i] << " ";
}
}
void vet_input(float vet[], size_t len){
size_t i;
for(i=0;i<len;i++){
cout << "Inserisci valore: ";
cin >> vet[i];
}
}
float *vet_alloc(size_t len){
return (float*)malloc(len*sizeof(float));
}
size_t vet_min_index(float vet[], size_t len){
size_t i, m=0;
for(i=0;i<len;i++){
if (vet[i]<vet[m])
m=i;
}
return m;
}
float vet_swap(float vet[], size_t i, size_t j){
float tmp;
tmp = vet[i];
vet[i]=vet[j];
vet[j]=tmp;
}
void vet_sort(float vet[], size_t len){
size_t i, x;
for(i=0;i<len;i++){
x=vet_min_index(&vet[i], len-i);
vet_swap(vet,i,x+i);
}
}
void vet_output_file(float vet[], size_t len, FILE *fn, float M){
size_t i;
fprintf(fn,"Array ordinato\n");
for(i=0;i<len;i++)
fprintf(fn,"%f \n",vet[i]);
fprintf(fn,"Media dei numeri: ");
fprintf(fn, "%f", M);
}
int main(){
float *vet;
size_t len;
FILE* fn;
float M;
cout << "Inserisci numero di caratteri Array: ";
cin >> len;
vet=vet_alloc(len);
cout << "Riempi Array" << endl;
vet_input(vet, len);
cout << "Il tuo Array è: ";
vet_print(vet, len);
cout << endl << "Il tuo Array oridnato è: ";
vet_sort(vet, len);
vet_print(vet, len);
fn = fopen("values.dat","w");
M=vet_mean(vet, len);
vet_output_file(vet, len, fn, M);
fclose(fn);
}
Per commentare il codice passo il compito a @Not an engineerC++:#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; float vet_mean(float vet[], size_t len){ size_t i; float S=0; for(i=0;i<len;i++){ S=S+vet[i]; } return S/len; } void vet_print(float vet[], size_t len){ size_t i; for(i=0;i<len;i++){ cout << vet[i] << " "; } } void vet_input(float vet[], size_t len){ size_t i; for(i=0;i<len;i++){ cout << "Inserisci valore: "; cin >> vet[i]; } } float *vet_alloc(size_t len){ return (float*)malloc(len*sizeof(float)); } size_t vet_min_index(float vet[], size_t len){ size_t i, m=0; for(i=0;i<len;i++){ if (vet[i]<vet[m]) m=i; } return m; } float vet_swap(float vet[], size_t i, size_t j){ float tmp; tmp = vet[i]; vet[i]=vet[j]; vet[j]=tmp; } void vet_sort(float vet[], size_t len){ size_t i, x; for(i=0;i<len;i++){ x=vet_min_index(&vet[i], len-i); vet_swap(vet,i,x+i); } } void vet_output_file(float vet[], size_t len, FILE *fn, float M){ size_t i; fprintf(fn,"Array ordinato\n"); for(i=0;i<len;i++) fprintf(fn,"%f \n",vet[i]); fprintf(fn,"Media dei numeri: "); fprintf(fn, "%f", M); } int main(){ float *vet; size_t len; FILE* fn; float M; cout << "Inserisci numero di caratteri Array: "; cin >> len; vet=vet_alloc(len); cout << "Riempi Array" << endl; vet_input(vet, len); cout << "Il tuo Array è: "; vet_print(vet, len); cout << endl << "Il tuo Array oridnato è: "; vet_sort(vet, len); vet_print(vet, len); fn = fopen("values.dat","w"); M=vet_mean(vet, len); vet_output_file(vet, len, fn, M); fclose(fn); }
Codice molto basico, ma fa quello che deve fare haha.
PS: già che ci sono levatemi un dubbio. Come si fa rendere i messaggi visibili solo se si risponde a 3d?
Se intendi un .h per rendere un tuo set di funzione come se fossero funzioni di libreria (quindi includendo con #include <nome.h>) si, ma per programmi semplici come questo è un lavoro un pò oneroso, poi conta che per le funzioni di librerie ci sta un costrutto da dover seguire (se sei curioso vedi stdio.h come è strutturato, al di la delle macro concentrati sulla strutturazione del printf per esempio).@Kode una cosa sul chiamare le funzioni: di solito non si fa una cosa simile? Nel senso, si crea un .lib in cui inserisci le funzioni che poi richiami in diversi programmi, qui le ho scritte direttamente nello stesso file però il richiamarle dovrebbe essere qualcosa di "normale", o ricordo male?
Modificato un pò di cose per renderlo un pò meno 'meccanico', ma ancora il print dei valori mi restituisce tutti 0, e non capisco cos'altro c'è da cambiare oltre a double->float.
Anzi ora che ci penso, non dovrebbe neanche stampare i valori in automatico per come l'ho scritto, anche peggio.
C++:#include <stdio.h> #include <math.h> #include <iostream> #include <fstream> #include <malloc.h> float array_mean(float arr_1[],int dim) { float med=0,temp=0; for(int i=0;i<dim;i++) { temp+=arr_1[i]; } return temp/dim; } } void array_print_to_screen(float arr_1[],int dim) { for(int i=0;i<dim;i++) { printf("\narr_1[%d]= %f",i,arr_1[i]); } } void array_input(float arr_1[],int dim) { for(int i=0;i<dim;i++) { printf("\nInserire %do valore: ",i+1); scanf("%f",&arr_1[i]); } } float* array_alloc(int dim) { float* arr_1; arr_1=(float*)malloc(dim*sizeof(float)); if (arr_1 == NULL) { printf("\nMalloc non riuscito."); exit(0); } else { printf("\nMalloc riuscito."); } return arr_1; } float array_min_index(float arr_1[],int dim) { float min=0; for(int i=1;i<=dim;i++) { if(arr_1[i-1]<arr_1[i]) { min=arr_1[i-1]; } else { min=arr_1[i]; } } return min; } float array_sort(float arr_1[],int dim) { for(int i=0; i<dim; i++) { for(int j=i+1;j<dim;j++) { if(arr_1[j]<arr_1[i]) { float temp; temp=arr_1[j]; arr_1[j]=arr_1[i]; arr_1[i]=temp; } } } } void array_write_to_file(float arr_1[],int dim,FILE* Wfile) { for(int i=0;i<dim;i++) { fprintf(Wfile,"%d.%f\n",i+1,arr_1[i]); } } void scelta(int menu,float arr_1[],int dim) { bool close=false; do { switch(menu) { case 0://CHIUSURA { close==true; printf("\nChiusura..."); break; } case 1://STAMPA ARRAY { array_print_to_screen(arr_1,dim); break; } case 2://ORDINAMENTO ARRAY { array_sort(arr_1,dim); break; } case 3://SCRITTURA FILE { array_print_to_screen(arr_1,dim); break; } case 4://MEDIA { array_mean(arr_1,dim); break; } case 5://MINIMO { array_min_index(arr_1,dim); break; } default://INPUT NON VALIDO { printf("\nInserisci un numero da 1 a 5 per continuare, 0 per terminare.\n"); printf("1.arrayPrint\n2.arraySort\n3.writeOnFile\n4.arrayMean\n5.arrayMinIndex\n0.Close)"); break; } } }while(menu!=0 && close==false); } int main() { int dim=0,menu; printf("Dimensione array: "); scanf("%d",&dim); float* arr_1; FILE * Wfile; arr_1=array_alloc(dim); array_input(arr_1,dim); Wfile=fopen("values.dat","w"); if (arr_1 != NULL) { printf("1.arrayPrint\n2.arraySort\n3.writeOnFile\n4.arrayMean\n5.arrayMinIndex\n0.Close)"); scanf("%d",&menu); scelta(menu,arr_1,dim); } fclose(Wfile); free(arr_1); return 0; }
#include <stdio.h>
#include <math.h>
// #include <malloc.h> ???
#include <stdlib.h>
float array_mean(float arr_1[],int dim)
{
float med=0,temp=0;
for(int i=0;i<dim;i++)
{
temp+=arr_1[i];
}
return temp/dim;
}
void array_print_to_screen(float arr_1[],int dim)
{
for(int i=0;i<dim;i++)
{
printf("\narr_1[%d]= %f",i,arr_1[i]);
}
}
void array_input(float arr_1[],int dim)
{
for(int i=0;i<dim;i++)
{
printf("\nInserire %do valore: ",i+1);
scanf("%f",&arr_1[i]);
}
}
float* array_alloc(int dim)
{
float* arr_1;
arr_1=(float*)malloc(dim*sizeof(float));
if (arr_1 == NULL) {
printf("\nMalloc non riuscito.");
exit(0);
}
else
{
printf("\nMalloc riuscito.");
}
return arr_1;
}
// KODE: restituisce sempre 0, ci sta un problema... vedi bene che non è difficile trovare dove sia ;)
float array_min_index(float arr_1[],int dim)
{
float min=0; // KODE: attento qua
for(int i=1;i<=dim;i++)
{
if(arr_1[i-1]<arr_1[i]) // KODE: attento qua
{
min=arr_1[i-1];
}
else
{
min=arr_1[i];
}
}
return min;
}
float array_sort(float arr_1[],int dim)
{
for(int i=0; i<dim; i++)
{
for(int j=i+1;j<dim;j++)
{
if(arr_1[j]<arr_1[i])
{
float temp;
temp=arr_1[j];
arr_1[j]=arr_1[i];
arr_1[i]=temp;
}
}
}
}
void array_write_to_file(float arr_1[],int dim,FILE* Wfile)
{
for(int i=0;i<dim;i++)
{
fprintf(Wfile,"%d.%f\n",i+1,arr_1[i]);
}
}
void scelta(int menu,float arr_1[],int dim)
{
//bool close=false; KODE: booleano ridondante, alla fine basta vedere quando menu = 0
//do
//{
switch(menu)
{
case 0://CHIUSURA
{
// close==true;
printf("\nChiusura...");
break;
}
case 1://STAMPA ARRAY
{
array_print_to_screen(arr_1,dim);
break;
}
case 2://ORDINAMENTO ARRAY
{
array_sort(arr_1,dim);
break;
}
case 3://SCRITTURA FILE
{
array_print_to_screen(arr_1,dim);
break;
}
case 4://MEDIA
{
printf("\nMedia: %lf\n", array_mean(arr_1,dim)); //Non stampava la media
break;
}
case 5://MINIMO
{
printf("\nMin: %lf\n", array_min_index(arr_1,dim)); //Non stampava il minimo
break;
}
default://INPUT NON VALIDO
{
// KODE: i due printf sotto sono ridondanti ora, quindi li ho eliminati
//printf("\nInserisci un numero da 1 a 5 per continuare, 0 per terminare.\n");
//printf("1.arrayPrint\n2.arraySort\n3.writeOnFile\n4.arrayMean\n5.arrayMinIndex\n0.Close)");
printf("Input non valido");
break;
}
}
// }while(menu!=0 && close==false); KODE: va in loop, in genere quando si vuole effettuare una funzione
// di switching i cicli sono nel body della funzione invocatrice (nel nostro caso il main)
}
int main()
{
int dim=0, menu = 1;
printf("Dimensione array: ");
scanf("%d",&dim);
float* arr_1;
FILE * Wfile;
arr_1=array_alloc(dim);
array_input(arr_1,dim);
Wfile=fopen("values.dat","w");
if (arr_1 != NULL)
// KODE: Ho messo il ciclo all'interno del main piuttosto che in scelta
{
while(menu != 0){
printf("\n1.arrayPrint\n2.arraySort\n3.writeOnFile\n4.arrayMean\n5.arrayMinIndex\n0.Close\n)"); // KODE: ti ho aggiunto un \n perchè odiavo il fatto che non andasse da capo
printf("Digita la tua scelta:");
scanf("%d",&menu);
scelta(menu, arr_1, dim);
// KODE: quando finisce l'operazione dentro la scelta effettuata ritorna qui, nel caso di 0 termina il ciclo
}
}
// KODE: Grazie per aver liberato le risorse, la memoria ti ringrazia
fclose(Wfile);
free(arr_1);
return 0;
}
Grazie @Kode . Quali punti potrebbero essere snelliti?
Per quanto dice invece @DispatchCode , in che modo potrei ottimizzare lo scope delle variabili?
Thanks! Quindi, in generale, sempre meglio inizializzare la variabile quando la si usa e non all'inizio?Puoi sia compattarlo che evitare di dare "scope" così ampi. Se tu dichiari la variabile nella parte di inizializzazione del for, quella variabile sarà locale al solo ciclo. Idem le variabili che usi solo nel corpo dei ciclo.
C:void vet_sort(float vet[], size_t len){ size_t i, x; for(i=0;i<len;i++){ x=vet_min_index(&vet[i], len-i); vet_swap(vet,i,x+i); } }
Quindi in questo caso questa funzione puoi modificarla così:
C:void vet_sort(float vet[], size_t len){ for(size_t i=0;i<len;i++){ size_t x=vet_min_index(&vet[i], len-i); vet_swap(vet,i,x+i); } }
Ci siamo quasi, hai sistemato il punto di partenza, ossia hai assegnato per default che il minimo fosse il primo elemento. Ora basta vedere solamente se un elemento i-esimo è minore del minimo corrente, se lo è lo assegni a min altrimenti vai avanti. Per quanto riguarda il ciclo conta che facendo cosi dovresti andare in overflow. Perché? Perché gli indici di un array con n elementi va da 0 a n-1, quindi quando legge arr_1[n] vai fuori dall'area di memoria dell'array instanziato.@Kode il malloc.h non sono sicuro del perché l'ho messo, forse pensavo che per usare il malloc servisse la libreria o.ò
La funzione del minore dovrei averla sistemata, o almeno in un file nuovo funziona (e mi sembra di aver capito che il return funziona solo con numeri interi, e i float li arrotonda, quindi tocca per forza fare una stampa?)
C++:void array_min_index(float arr_1[],int dim) { float min=arr_1[0]; for(int i=1;i<dim;i++) { if(arr_1[i]<arr_1[0] && arr_1[i]<min) { min=arr_1[i]; } } printf("\nMin=%f",min); //return min; }
Scelta l'ho messa per fare in modo che si potessero richiamare le funzioni tutte le volte che si vuole fino a che non si "chiude il menu", senza star a eseguire di continuo.
Probabilmente va in loop per il default, così su due piedi: ho cercato velocemente un modo per controllare che l'input rientrasse nel range richiesto da me(da 0 a x ovvero il numero di funzioni da mettere dentro lo switch, e ora che ci penso avrei potuto anche mettere un controllo per evitare lettere, caratteri speciali etc.) e consigliavano di farlo in una funzione, così da richiamarla nel default per "resettarla" ma immagino che vada fatto in un certo modo.
Al momento non conosco altri metodi per resettare uno switch.
// da void a float
float array_min_index(float arr_1[],int dim)
{
float min=arr_1[0];
for(int i=1;i<dim-1;i++) // da 1 a dim-1, non facciamo il controllo a 0 dato che min = arr_1[0]
{
if( arr_1[i]<min) // il confronto solo con il valore min corrente
{
min=arr_1[i]; // nel caso sia minore quello letto dall'array, sarà il nuovo minimo
}
}
// printf("\nMin=%f",min); lo possiamo fare fuori
return min;
}
// [...]
//public void scelta([...]){
// dentro il case di array_min_index...
float x = array_min_index(arr_1, dim);
printf("\nMin=%f\n", min);
break;
static float MediaFloat(params float[] array)
{
float temp = 0;
int count = 0;
foreach (float x in array)
{
temp += x;
count++;
}
return temp / (float)count;
}
static void PrintArray(float[] array)
{
foreach (float x in array) {
Console.WriteLine(x);
}
}
static public void InputArray(List<float> array, int n)
{
for (int i=0;i<n;i++)
{
Console.Write($"Input {i}: ");
float temp = (float)Console.Read();
array.Add(temp);
}
}
static public void MinArray(float[] array)
{
float temp = 0;
foreach (float x in array)
{
if (x>temp)
{
temp = x;
}
}
foreach (float x in array)
{
if (x<temp)
{
temp = x;
}
}
Console.WriteLine(temp);
}
static public void ArrayWrite(float[] array, string filename)
{
StreamWriter sw = new StreamWriter(filename);
foreach (float x in array)
{
sw.WriteLine(Convert.ToString(x));
}
sw.Close();
}