gestion de Grand Nombre

gestion de Grand Nombre - C++ - Programmation

Marsh Posté le 08-11-2002 à 23:02:57    

je souhaite faire un programme afin de gerer des trés grands nombres ( plusieurs milliers de chiffres voir plus )
 
 
je souhaite les gérer par fichiers txt
 
j'aimerais pour voir lire parmis un fichiers de n lignes de x chiffres un chifres precis par exemple le 10éme de la 15éme ligne
 
 
comment puis m'y prendre pour l'instant j'arrive à lire les tableau en entier c tout :hello:  
 
 

Reply

Marsh Posté le 08-11-2002 à 23:02:57   

Reply

Marsh Posté le 08-11-2002 à 23:43:01    

apprends l'approche objet et apres on verra


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 08-11-2002 à 23:50:44    

Taz@PPC a écrit a écrit :

apprends l'approche objet et apres on verra



ben  alors je repasserai dans 6 mois :sweat:

Reply

Marsh Posté le 09-11-2002 à 09:16:50    

Une méthode "basique" consiste à chercher dans le fichier les CrLf qui sont les caractères de fin de ligne (ou Cr ou Lf seul si Mac ou Unix (en désordre)).
Quand on trouve une séquence CrLf, c'est qu'on atteint la ligne suivante, on peut alors compter les caractères dans la nouvelle ligne.
 
Si on explore ce fichier une première fois, on peut remplir un tableau d'index des débuts de ligne (PosDebLigne[] ds l'exemple). Quand on veut trouver qq chose, on utilise la chaîne qui commence en PosDebLigne[NumLign - 1] + NumDuCaractDansLaLigne
 
Ca laisse le temps d'apprendre la POO. :)  

Reply

Marsh Posté le 09-11-2002 à 09:18:51    

Merçi :hello:  tu sais à mon grand age se mettre au c++ s'est dur  :cry:

Reply

Marsh Posté le 09-11-2002 à 09:21:26    

http://www.swox.com/gmp/
 
pourquoi réinventer la roue en la faisant carrée ?

Reply

Marsh Posté le 09-11-2002 à 10:03:09    

carbon_14 a écrit a écrit :

Une méthode "basique" consiste à chercher dans le fichier les CrLf qui sont les caractères de fin de ligne (ou Cr ou Lf seul si Mac ou Unix (en désordre)).
Quand on trouve une séquence CrLf, c'est qu'on atteint la ligne suivante, on peut alors compter les caractères dans la nouvelle ligne.
 
Si on explore ce fichier une première fois, on peut remplir un tableau d'index des débuts de ligne (PosDebLigne[] ds l'exemple). Quand on veut trouver qq chose, on utilise la chaîne qui commence en PosDebLigne[NumLign - 1] + NumDuCaractDansLaLigne
 
Ca laisse le temps d'apprendre la POO. :)  
 




 
vu tes connaissances, le mieux est de charger tout le fichier en mémoire, ca sera plus simple.
 
 

Code :
  1. std::string line;
  2. std::vector< std::string > lines;
  3. while(getline(cin, line))
  4. {
  5.   lines.push_back(line);
  6. }


 
 
edit : CrLF n'existe po, parcontre '\n'  :sarcastic:


Message édité par Taz@PPC le 09-11-2002 à 10:06:04

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 09-11-2002 à 10:59:46    

Oui, je me suis laissé glisser en ASCII (en lecture de fichier linux, on est bien content).
 
Le chargement du fichier en mémoire est idéal quand pas trop énorme, car ça va vite ensuite, et on peut faire ce qu'on veut, autant de fois qu'il faut sans soucis. J'avais pas précisé :(.
C'est la méthode que j'utilise pour des fichiers binaires de spectros (très rapide sur vieux 33MHz), recherche ensuite des séquences spécifiques...
 
Le C++, j'arrive pas non plus à trouver du temps à m'y initier (l'âge aussi...). Suis resté page 20 de mon bouquin. Y a des urgences qui se bousculent :( . Ce sera pour la retraite. :lol:

Reply

Marsh Posté le 09-11-2002 à 11:04:35    

carbon_14 a écrit a écrit :

Oui, je me suis laissé glisser en ASCII (en lecture de fichier linux, on est bien content).
 
Le chargement du fichier en mémoire est idéal quand pas trop énorme, car ça va vite ensuite, et on peut faire ce qu'on veut, autant de fois qu'il faut sans soucis. J'avais pas précisé :(.
C'est la méthode que j'utilise pour des fichiers binaires de spectros (très rapide sur vieux 33MHz), recherche ensuite des séquences spécifiques...
 
Le C++, j'arrive pas non plus à trouver du temps à m'y initier (l'âge aussi...). Suis resté page 20 de mon bouquin. Y a des urgences qui se bousculent :( . Ce sera pour la retraite. :lol:  




 
 
mais on fait du C++ ou du C?
 
et puis le chargement en mémoire d'un fichier texte ...  :sarcastic: meme s'ilf ait 10Mo, ca vaut le coup.
 
sinon si le problème est sous linux, y a encore mieux avec mmap  :sol:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 09-11-2002 à 11:10:18    

C ou C++, faut demander à reglisse.
 
DOS, Win ou Nunux ?
 
Up !


Message édité par Carbon_14 le 09-11-2002 à 11:10:44
Reply

Marsh Posté le 09-11-2002 à 11:10:18   

Reply

Marsh Posté le 09-11-2002 à 11:24:57    

ben je suis en C++ et windows avec Dev C++  
 
moi je comprend pourquoi on peut pas lire le eme caractere dans un fichier txt  
 
par exemple 1hf5hyu4y5uh52f5s
 
par comment simplement afficher le 5éme soit h ici ?


Message édité par reglisse le 09-11-2002 à 11:25:23
Reply

Marsh Posté le 09-11-2002 à 11:26:49    

Taz@PPC a écrit a écrit :

 
 
 
mais on fait du C++ ou du C?
 
et puis le chargement en mémoire d'un fichier texte ...  :sarcastic: meme s'ilf ait 10Mo, ca vaut le coup.
 
sinon si le problème est sous linux, y a encore mieux avec mmap  :sol:  



vraiment ?

Reply

Marsh Posté le 09-11-2002 à 11:28:17    

je connais pas vraiment C++, mais il doit surement exister un equivalent a fseek() avec les flux, non ?

Reply

Marsh Posté le 09-11-2002 à 11:33:20    

lorill a écrit a écrit :

je connais pas vraiment C++, mais il doit surement exister un equivalent a fseek() avec les flux, non ?



ben oui mais j'arrive pas  :sweat:

Reply

Marsh Posté le 09-11-2002 à 11:33:34    

Oui, il y a l'opération seek() qui fonctionne exactement comme fseek(), mais ca ne marche que sur les flux "seekable" bien sur, et cin/cout le sont rarement ;)

Reply

Marsh Posté le 09-11-2002 à 15:45:56    

reglisse a écrit a écrit :

vraiment ?




 
oui


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 09-11-2002 à 15:59:16    

reglisse a écrit a écrit :

vraiment ?




On n'accède qu'une fois au fichier, et après ça va très vite. On peut faire tout ce qu'on veut.
 
Si le fichier fait 100 ou 1000Mo, faut charger que des bouts (de 10Mo :D), genre "fenêtrage".


Message édité par Carbon_14 le 09-11-2002 à 15:59:49
Reply

Marsh Posté le 09-11-2002 à 17:32:04    

carbon_14 a écrit a écrit :

 
On n'accède qu'une fois au fichier, et après ça va très vite. On peut faire tout ce qu'on veut.
 
Si le fichier fait 100 ou 1000Mo, faut charger que des bouts (de 10Mo :D), genre "fenêtrage".



mais 10go en mémoire c impossible non ?

Reply

Marsh Posté le 09-11-2002 à 17:35:02    

reglisse a écrit a écrit :

mais 10go en mémoire c impossible non ?




si t'as 20go de mémoire, ca passe  :whistle:

Reply

Marsh Posté le 09-11-2002 à 18:23:02    

ok j'ai confoondu Mo et Go bah ct pas loin

Reply

Marsh Posté le 09-11-2002 à 18:52:51    

bon ça marche avec des tableua je multiplie de nombre de 9 chifres ça donne le resultat exacte mais au bout de 3 min  :pt1cable:  
 
j'ose pas passé à dix  :lol:

Reply

Marsh Posté le 09-11-2002 à 21:31:49    

mais tu dois absolument faire ta propre implémentation de la gestion des grands nombres, ou tu peux en utiliser une existante ?
 
pourquoi tu t'obstines a faire un truc qui sera forcément moins bien que ce qui existe ?

Reply

Marsh Posté le 09-11-2002 à 23:09:03    

lorill a écrit a écrit :

mais tu dois absolument faire ta propre implémentation de la gestion des grands nombres, ou tu peux en utiliser une existante ?
 
pourquoi tu t'obstines a faire un truc qui sera forcément moins bien que ce qui existe ?



ben si je savais ou trouver une je le ferai pas mais bon comme je sais pas en trouver une j'en fais une je crois que je suis limiter par les long  :sweat:

Reply

Marsh Posté le 10-11-2002 à 01:32:30    

Il y a un vieux et très bon topic sur les grands nombre.
 
http://forum.hardware.fr/forum2.php3?post=29&cat=10bistromatique, grands nombres et opérations optimisées, évaluation d'expressions, arbre, pile


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 10-11-2002 à 11:06:43    

bon ok tout est bien expliqué mais bon je vais terminer me reste la division et corriger la multiplication ya un tuc qui depasse le long

Reply

Marsh Posté le 10-11-2002 à 13:48:39    

Taz@PPC a écrit a écrit :

 
sinon si le problème est sous linux, y a encore mieux avec mmap  :sol:  




 
est ce que l'API C de windows propose une fonction similaire à mmap qui permette une projection de fichier en mémoire?


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 10-11-2002 à 13:54:29    

Oui, elle le permet. Mais faudra aller chercher dans la MSDN pour ça.

Reply

Marsh Posté le 10-11-2002 à 16:46:01    

bon ben j'ai un autre probleme quand je depasse 1600 chiffres environ ça bug
 
sinon comment faire une fonction qui lit un fichier texte comme ça :
 
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789  
 
 
et qui range les chiffres dans un tableau int genre tab[i]=ni ?


Message édité par reglisse le 10-11-2002 à 16:47:15
Reply

Marsh Posté le 10-11-2002 à 16:58:03    

reglisse a écrit a écrit :

ben si je savais ou trouver une je le ferai pas mais bon comme je sais pas en trouver une j'en fais une je crois que je suis limiter par les long  :sweat:  




 
tu te fous de moi ?
 
6eme message du topic :

Citation :


http://www.swox.com/gmp/
 
pourquoi réinventer la roue en la faisant carrée ?

Reply

Marsh Posté le 10-11-2002 à 17:25:20    

lorill a écrit a écrit :

 
 
tu te fous de moi ?
 
6eme message du topic :

Citation :


http://www.swox.com/gmp/
 
pourquoi réinventer la roue en la faisant carrée ?





Ben oui j'ai vu mais je sais pas comment m'en servir  :sweat: et puis c oussi un pretexte pour apprendre le c++

Reply

Marsh Posté le 10-11-2002 à 17:26:29    

reglisse a écrit a écrit :

bon ben j'ai un autre probleme quand je depasse 1600 chiffres environ ça bug
 
sinon comment faire une fonction qui lit un fichier texte comme ça :
 
123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789  
 
 
et qui range les chiffres dans un tableau int genre tab[i]=ni ?




 
 
j'ai fais ça mais la fonction lire j'arrive pas  :sweat:  
 

Code :
  1. void ajouter (char fichier[20], unsigned long int a)
  2.      { 
  3.         FILE *fp;
  4.         fp = fopen(fichier, "a+" );
  5.         fprintf(fp, "%d", a);
  6.         fclose(fp);
  7.      }
  8.    
  9. void ajoutersaut (char fichier[20])
  10.      { 
  11.         FILE *fp;
  12.         fp = fopen(fichier, "a+" );
  13.         fprintf(fp, "\n" );
  14.         fclose(fp);
  15.      }
  16.    
  17. void ajouterespace (char fichier[20])
  18.      { 
  19.         FILE *fp;
  20.         fp = fopen(fichier, "a+" );
  21.         fprintf(fp, " " );
  22.         fclose(fp);
  23.      }
  24. void ecrire (char fichier[20],unsigned long int nb[n])
  25.     {
  26.     unsigned long int k=0;     
  27.     for (unsigned long int i=n;i>0;i--)
  28.              {
  29.              k++;           
  30.              ajouter (resultat,nb[i]);           
  31.              if (k%9==0) ajouterespace (resultat); 
  32.              if (k%45==0)
  33.                           {
  34.                           ajouter(resultat,k);
  35.                           ajoutersaut (resultat);
  36.                           }
  37.              }
  38.     ajoutersaut(resultat);
  39.     ajoutersaut(resultat);
  40.     }


Message édité par reglisse le 10-11-2002 à 17:37:15
Reply

Marsh Posté le 10-11-2002 à 17:27:54    

reglisse a écrit a écrit :

Ben oui j'ai vu mais je sais pas comment m'en servir  




 :??:  
 
t'es pas capable d'utiliser un truc dont l'interface est pas vraiment compliquée, et tu veux recrééer l'equivalent ?  :heink:

Reply

Marsh Posté le 10-11-2002 à 17:31:24    

ça donne ça comme fichier sur des petits nombres de 89 chiffres de 9 multiplier pas lui même ( au carré quoi ) les zeros c parce que c des tableaux de 180 chifres en base 10 bien sur
 
 
000000000 000000000 000000000 000000000 000000000  
000000000 000000000 000000000 000000000 000000000  
099999999 999999999 999999999 999999999 999999999  
999999999 999999999 999999999 999999999 999999999  
 
×
 
000000000 000000000 000000000 000000000 000000000  
000000000 000000000 000000000 000000000 000000000  
099999999 999999999 999999999 999999999 999999999  
999999999 999999999 999999999 999999999 999999999  
 
=
 
009999999 999999999 999999999 999999999 999999999  
999999999 999999999 999999999 999999999 999999999  
800000000 000000000 000000000 000000000 000000000  
000000000 000000000 000000000 000000000 000000001


Message édité par reglisse le 10-11-2002 à 17:33:58
Reply

Marsh Posté le 10-11-2002 à 17:35:07    

lorill a écrit a écrit :

 
 :??:  
 
t'es pas capable d'utiliser un truc dont l'interface est pas vraiment compliquée, et tu veux recrééer l'equivalent ?  :heink:  



ben oui j'ai donwloader le gmp-4.1 mais j'ai rien compris et puis c un pretexte pour apprendre  :hello:

Reply

Marsh Posté le 10-11-2002 à 22:07:39    

[:_deckard_]

Reply

Marsh Posté le 11-11-2002 à 03:53:33    

reglisse a écrit a écrit :

j'ai fais ça mais la fonction lire j'arrive pas  :sweat:



N'ouvres le fichier qu'une fois, et transmet le FILE* à la fonction.
Comme ça, tu peux transmettre stdout/stdin pour faire des test console rapides.
 
Utilises "%lu" comme format pour unsigned long.
 

Code :
  1. fscanf(fp,"%d", &ul); //lire un unsigned long
  2. fscanf(fp," " ); //sauter un espace
  3. fscanf(fp,"\n" ); //sauter un retour à la ligne


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed