Newsgroup: it.comp.lang.c
Titolo: aiuto: problemi di un principiante

premetto che programma da 2 settimane in C.
Sto facendo questo programmino che permette di calcolare le quote di piu
investitori in un investimento.
Per ora non fa molto e non riesco a risolvere un problema.
All'inizio ho identificato gli investitori con un numero, ma ora vorrei
mettere il nome.
come faccio? visto che se faccio un char *nomi [xx] identifica solo un nome
xchè ogni "posizione" della vettore contiene un
carattere.
secondo punto (meno importante perchè devo risolvere il primo)
come noterete leggo e salvo i dati in due file: dati.txt (è il resoconto dei
movimenti) e dati2.txt (è un file dove memorizzo i dati per la
lettura successiva)
come faccio a memorizzare anche i dati
terzo punto
mi piacerebbe staccare in piu file il programma perchè sta diventando un po
lunghetto.
Ho fatto qualche esperimento ma non ci sono riuscito.
Mi aiutate?
Uso LCCWIN32 e win98 e compilo solo x la console.
grazie mille.
ciao
Lenny
**************
ecco il sorgente.
Spero di non averlo copiato male
#include <stdio.h>
#include <conio.h>
int i,x,n=0,im;   // i= contatore  n= n.investitori
long double modcap; // modcap= valore di capitale modificato
long double captot; // captot= capitale totale
long double q[11], q_perc[11]; // q[n]= valore quota del n investitore;
    // q_perc[n]= valore in percentuale del n inv.
long double newcap;   //capitale attuale
long double marg_ass, marg_perc; //margini assoluto e percentuale
int c;   // variabile di input per menu
FILE *stream, *fopen();
salvatxt()  // stampa su file un report della situazione  (modo append)
{
 stream = fopen ("dati.txt","a");
 fprintf(stream,"N.investitori: %d \n",n);
 for (i=1; i<=n ; i++)
  {
  fprintf(stream,"L'inv n.%d %.4f ",i,q[i]);
  fprintf(stream,"-> %.3lf%% \n",q_perc[i]);
  }
  fprintf(stream,"\n capitale totale %.4f \n",captot);
  fprintf(stream,"\n -------------- \n\n");
 fclose(stream);
return(0);
}
salvadati()  // salva il file di dati per una successiva lettura
{
 stream = fopen ("dati2.txt","w");
 fprintf(stream,"%d ",n);
 for (x=1;x<=n;x++)
  {
   fprintf(stream,"%lf ",q[x]);
  }
 fclose(stream);
 return(0);
}
leggidati()  // se presente il file dati allora li legge.
{
 fscanf(stream,"%d",&n);
 for (i=1;i<=n;i++)
 {
  fscanf(stream,"%lf",&q[i]);
  captot = captot + q[i];
 }
return(0);
}
calc_quote()    file://funzione che calcola le quote per gli n investitori
{
 for (i=1 ; i<=n ; i++)
  {
  q_perc[i] =100* q[i] / captot;
  }
 return(0);
}
stampa_quote() // funzione che stampa a video le quote degli investitori
{
 printf("\n\nCi sono %d investitori\n",n);
 for (i=1; i<=n ; i++)
  {
  printf("L'inv n.%d %.4f ",i,q[i]);
  printf("-> %.3f%% \n",q_perc[i]);
  }
  printf("\n capitale totale %.4f \n",captot);
return(0);
}
firstinput()  //nel caso non ci fosse il file dati allora chiede inserimento
dati
{
// input dati
 printf ("Quanti investitori iniziali ci sono? (max 10) : ");
 scanf ("%d", &n);
 for (i=1 ; i<=n ;i++)
  {
  printf("Immetti il capitale del %d investitore :  ",i);
  scanf("%lf", &q[i]);
  captot = captot + q[i];
  }
  return(0);
}
var_invest()
{
// parte per il ricalcolo delle quote dopo la variazione
// della quota di un investitore
 printf("\nImmetti l'investitore che ha modificato la sua quota: ");
 scanf("%d", &im);
 printf("Ora l'investitore %d ha %.4f \n",im,q[im]);
 printf("\nDi quanto ha modificato la sua quota? ");
 scanf("%lf", &modcap);
 q[im]= q[im] + modcap;
 captot = captot + modcap;
 calc_quote();
 stampa_quote();
 salvatxt();
 salvadati();
 return(0);
}
var_capit()
{
// da qui: calcola le nuove quote dato il capitale attuale
 printf("A quanto ammonta ora il capitale? ");
 scanf ("%lf", &newcap);
 marg_ass= newcap - captot;
 marg_perc= (newcap/captot-1)*100;
 printf ("\n\nMargine  : %.4f \n",marg_ass);
 printf ("Margine %%: %.3f \n",marg_perc);
 captot = newcap;
// calcola le nuove quote dopo i margini date le quote percentuali
 for (i=1 ; i<=n ; i++)
  {
  q[i] = newcap * q_perc[i] / 100;
  }
 stampa_quote();
 salvatxt();
 salvadati();
 return(0);
}
void main (void)  file://processo principale
{
for (x=1;x<30;x++)   //ciclo per pulire lo schermo
 {
  printf("\n");
 }
printf (" Quota by Luca Scrigna. \n Versione 0.6\n\n\n");
if ((stream = fopen ("dati2.txt","r"))==NULL)
  {
      printf ("Il file non esiste.\n\n");
   firstinput();
  }
else {
   leggidati();
  }
// calcolo e stampa  delle quote dai dati inseriti o dopo la lettura.
 calc_quote();
 stampa_quote();
 salvadati();
for (;;)
{
printf("\n\n");
printf("scegli:\n 1- Variazione quota investitore \n");
printf(" 2- Variazione capitale \n 3- Esci \n");
scanf("%d",&c);
switch (c)
 {
  case 1:var_invest(); break;
  case 2:var_capit();  break;
 }
if (c==3) break;
}

Mi aiutate?
Scomponi il codice in file .c, dichiara le funzioni interne di ogni
file come "static" e quelle esterne (cioe' appartenenti agli altri
moduli) come "extern". Es.:
---modulo primo.c :
#include <stdio.h>
static myfunc()
{
       printf( "hello " ) ;
}
--- modulo secondo.c :
#include <stdio.h>
extern myfunc() ;
static myfunc2() 
{
       myfunc() ;
       printf( "world!\n" ) ;
}
--- modulo main.c :
#include <stdio.h>
extern myfunc2() ;
main()
{
    myfunc2() ;
}
poi compili tutti e tre i moduli, supponiamo tu abbia :
main.o 
primo.o
secondo.o
e costruisci l'eseguibile main.exe da main.o + primo.o + secondo.o.
Ti conviene costruire un makefile.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------

 


 extern myfunc() ;
  ^^^^^^
Ti faccio notare che:
1) dichiare static una funzione significa limitare la sua visibilità al
   file in cui è dichiarata.
2) la dichiarazione 'extern' non è necessaria.
3) così come è scritto non funziona: 
[fok@fokhouse cancellami]$ gcc -o main main.c primo.o secondo.o
/tmp/cc5ArIK4.o: In function `main':
/tmp/cc5ArIK4.o(.text+0x4): undefined reference to `myfunc2'
secondo: In function `myfunc2':
secondo(.text+0x4): undefined reference to `myfunc'
collect2: ld returned 1 exit status
[fok@fokhouse cancellami]$
Per riuscire a compilarlo bisogna togliere le dichiarazioni 'static'.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

   file in cui =E8 dichiarata.
Hai ragione.
In realta' e' stata una svista, visto che pensavo di fare l'esempio
con funzioni static appartenenti al singolo modulo e funzioni da
richiamare poi in modo esterno. Grazie della correzione, comunque il
suggerimento era chiaro.


 Mi aiutate?
In generale devi compilare separatamente ogni modulo e poi linkare tutto
assieme. Guarda sulla documentazione del tuo compilatore per
informazioni più precise.
EMG

la tua mi sembra la soluzione piu veloce e semplice per le mie capacità, ma
sono ancora bloccato:
come faccio se voglio far inserire all'utente il nome ?
per i numeri uso lo scanf e si inserisce subito nella variabile mentre qui
con strcpy come faccio?
grazie per il supporto.


per il resto poi è solo matematica.
Non esagerare! Ora non ho sottomano il codice del tuo programma, ma mi
sembra che te la cavassi piuttosto bene con puntatori e cose del genere. Per
me c'è voluto un po', e ancora ora stento talvolta a capire il comportamento
(e l'utilità) di qualche cosa (vedi la "strana"(così è per me che sono
principiante) gestione del buffer di scanf), senza contare che tra basic e c
ce ne passa (anche io sapevo fare qualcosina in basic, ma davvero poco (il c
poi offre orizzonti molto vasti!)).
Ciao,
Zeppe

 scanf( "%s", nome );
scanf("%s",&nome );
Hai dimenticato '&';
Ivan Molella

 Hai dimenticato '&';
Se nome è un array di caratteri o un puntatore a memoria allocata
dinamicamente non ne va preso l'indirizzo.
EMG