Istvan

Prognyelvek C++ beadandó: Könyvazonosító számok ellenőrzése

Apr 22nd, 2012
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. /*Könyvazonosító számok ellenőrzése
  2.  
  3. Az ISBN (International Standard Book Number) azonosítók olyan tízjegyű számok, amelyeket könyvek azonosítására használnak. A szám tizedik számjegye lehet X karakterrel leírt 10-es is. A könnyebb olvashatóság végett a szám leírásában kötőjelek és szóközök szerepelhetnek, lényegi jelentőségük nincsen.
  4.  
  5.  Valójában az első kilenc számjegy azonosítja a könyvet. A tizedik számjegy validálja, hogy az első kilenc számjegy helyes-e. Mivel a checksum algoritmus 11-gyel vett oszthatóságot vizsgál, szükséges lehet a 10-es ellenőrző számjegy, amit X jelöl az ISBN számban.
  6.  
  7.  Az ISBN számok ellenőrzésére az alábbi checksum algoritmus használható: két részletösszeg számítandó az ISBN számból: s1 és s2. Az s1 az ISBN számjegyeinek részletösszegei, míg s2 az s1 részletösszege. Az ISBN érvényes, ha az utolsó s2 részletösszeg osztható 11-gyel.
  8.  
  9. Példa: 0-13-162959-X (Tanenbaum: Computer Networks)
  10. 0 1 3 1  6  2  9  5  9   10  (Az ISBN számjegyei)
  11. 0 1 4 5  11 13 22 27 36  46  (s1 részletösszegek)
  12. 0 1 5 10 21 34 56 83 119 165 (s2 részletösszegek)
  13.    
  14.  Mivel a 165 osztható 11-gyel, az azonosító érvényes.
  15.  
  16.  
  17.  
  18. Feladat: a standard inputról beolvasott azonosítókról eldönteni, hogy a fenti algoritmus alapján érvényes azonosító-e. Minden sorban pontosan egy azonosító szerepel. A standard output-on "Valid" jelenti az érvényes azonosítót, "Invalid" jelenti az érvénytelen azonosítót. A standard input-on az eof jelzi, hogy nincs több ellenőrizendő azonosító.
  19.  
  20. Példa Input:
  21. 0-13-162959-X
  22. 1-234-5678-90
  23.    
  24.  
  25.  
  26. Példa Output:
  27. Valid
  28. Invalid*/
  29.  
  30. #include <iostream>
  31. #include <fstream>
  32. #include <stdlib.h>
  33. #include <string>
  34. #include <vector>
  35.  
  36. using namespace std;
  37.  
  38. void print_result(bool is_valid)
  39. {
  40.   if ( is_valid )
  41.   {
  42.     cout << "Valid" << endl;
  43.   }
  44.   else
  45.   {
  46.     cout << "Invalid" << endl;
  47.   }
  48. }
  49.  
  50. bool check_sum(vector<int> vector)
  51. {
  52.   int s1 = 0;
  53.   int s2 = 0;
  54.  
  55.   for ( int i=0; i < (int)vector.size(); i++ )
  56.   {
  57.     s1 = s1 + vector[i];
  58.     vector[i] = s1;
  59.     s2 = s2 + vector[i];
  60.     cout << s2 << " ";
  61.   }
  62.   cout << endl;
  63.   if ( (s2 % 11) == 0 )
  64.   {
  65.     return true;
  66.   }
  67.   else
  68.   {
  69.     return false;
  70.   }
  71. }
  72.  
  73. bool ends_with_x(string line)
  74. {
  75.   bool X = true;
  76.   if ( 'X' == !line[line.size()-1] )
  77.   {
  78.     X = false;
  79.   }
  80.   return X;
  81. }
  82.  
  83. void read_from_file()
  84. {
  85.   string line;
  86.   int number;
  87.   ifstream file;
  88.   vector<int> vector;
  89.  
  90.   file.open("data.txt");
  91.  
  92.   while( getline(file,line) )
  93.   {
  94.     for ( int i=0; i < (int)line.size()-1; i++)
  95.     {
  96.       string temp (line,i,1);
  97.       if (isdigit(temp[0]))
  98.       {
  99.           number = atoi(&temp[0]);
  100.       vector.push_back(number);
  101.       }
  102.     }
  103.     if ( ends_with_x(line) )
  104.     {
  105.       vector.push_back(10);
  106.     }
  107.  
  108.     bool is_valid = check_sum(vector);
  109.     print_result(is_valid);
  110.  
  111.     vector.erase(vector.begin(),vector.end());
  112.   }
  113.  
  114.   file.close();
  115. }
  116.  
  117. int main()
  118. {
  119.   read_from_file();
  120.   return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment