Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1433 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  gestion de Grand Nombre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

gestion de Grand Nombre

n°242015
reglisse
Posté le 08-11-2002 à 23:02:57  profilanswer
 

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:  
 
 

mood
Publicité
Posté le 08-11-2002 à 23:02:57  profilanswer
 

n°242028
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 08-11-2002 à 23:43:01  profilanswer
 

apprends l'approche objet et apres on verra


---------------
du bon usage de rand [C] / [C++]
n°242034
reglisse
Posté le 08-11-2002 à 23:50:44  profilanswer
 

Taz@PPC a écrit a écrit :

apprends l'approche objet et apres on verra



ben  alors je repasserai dans 6 mois :sweat:

n°242101
Carbon_14
Posté le 09-11-2002 à 09:16:50  profilanswer
 

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. :)  

n°242102
reglisse
Posté le 09-11-2002 à 09:18:51  profilanswer
 

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

n°242103
lorill
Posté le 09-11-2002 à 09:21:26  profilanswer
 

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

n°242112
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 09-11-2002 à 10:03:09  profilanswer
 

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++]
n°242124
Carbon_14
Posté le 09-11-2002 à 10:59:46  profilanswer
 

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:

n°242125
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 09-11-2002 à 11:04:35  profilanswer
 

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++]
n°242128
Carbon_14
Posté le 09-11-2002 à 11:10:18  profilanswer
 

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


Message édité par Carbon_14 le 09-11-2002 à 11:10:44
mood
Publicité
Posté le 09-11-2002 à 11:10:18  profilanswer
 

n°242131
reglisse
Posté le 09-11-2002 à 11:24:57  profilanswer
 

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
n°242132
reglisse
Posté le 09-11-2002 à 11:26:49  profilanswer
 

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 ?

n°242133
lorill
Posté le 09-11-2002 à 11:28:17  profilanswer
 

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

n°242135
reglisse
Posté le 09-11-2002 à 11:33:20  profilanswer
 

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:

n°242136
Kristoph
Posté le 09-11-2002 à 11:33:34  profilanswer
 

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 ;)

n°242256
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 09-11-2002 à 15:45:56  profilanswer
 

reglisse a écrit a écrit :

vraiment ?




 
oui


---------------
du bon usage de rand [C] / [C++]
n°242262
Carbon_14
Posté le 09-11-2002 à 15:59:16  profilanswer
 

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
n°242303
reglisse
Posté le 09-11-2002 à 17:32:04  profilanswer
 

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 ?

n°242307
lorill
Posté le 09-11-2002 à 17:35:02  profilanswer
 

reglisse a écrit a écrit :

mais 10go en mémoire c impossible non ?




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

n°242348
reglisse
Posté le 09-11-2002 à 18:23:02  profilanswer
 

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

n°242354
reglisse
Posté le 09-11-2002 à 18:52:51  profilanswer
 

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:

n°242403
lorill
Posté le 09-11-2002 à 21:31:49  profilanswer
 

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 ?

n°242421
reglisse
Posté le 09-11-2002 à 23:09:03  profilanswer
 

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:

n°242438
Musaran
Cerveaulté
Posté le 10-11-2002 à 01:32:30  profilanswer
 

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
n°242532
reglisse
Posté le 10-11-2002 à 11:06:43  profilanswer
 

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

n°242608
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 10-11-2002 à 13:48:39  profilanswer
 

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++]
n°242611
Kristoph
Posté le 10-11-2002 à 13:54:29  profilanswer
 

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

n°242683
reglisse
Posté le 10-11-2002 à 16:46:01  profilanswer
 

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
n°242692
lorill
Posté le 10-11-2002 à 16:58:03  profilanswer
 

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 ?

n°242700
reglisse
Posté le 10-11-2002 à 17:25:20  profilanswer
 

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++

n°242702
reglisse
Posté le 10-11-2002 à 17:26:29  profilanswer
 

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
n°242704
lorill
Posté le 10-11-2002 à 17:27:54  profilanswer
 

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:

n°242706
reglisse
Posté le 10-11-2002 à 17:31:24  profilanswer
 

ç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
n°242708
reglisse
Posté le 10-11-2002 à 17:35:07  profilanswer
 

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:

n°242805
reglisse
Posté le 10-11-2002 à 22:07:39  profilanswer
 

[:_deckard_]

n°242870
Musaran
Cerveaulté
Posté le 11-11-2002 à 03:53:33  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  gestion de Grand Nombre

 

Sujets relatifs
[C] comment attribuer un nombre à un int ... [résolu]dessin a main levee et gestion de clic souris
Gestion de la documentation des softs ( + fichiers d'aide Windows)Nombre de tuple dans un curseur?
[ASP] Aide pour gestion de liens plizzzz[PHP] Nombre d'occurences d'un mot dans une chaine de caractères
[JAVA] obtenir la précision voulue pour un nombre....[C/C++] Générer un nombre aléatoire
[ JS ] générer un nombre aléatoire et probleme de tableau ( var )Tester si la variable est un nombre....
Plus de sujets relatifs à : gestion de Grand Nombre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR