Advertisement
Guest User

array_num_count.rs

a guest
Dec 8th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.04 KB | None | 0 0
  1. //  Программа для подсчета количества одинаковых чисел в массиве
  2. use std::io::BufRead;
  3. use std::io::BufReader;
  4. use std::fs::OpenOptions;
  5. use std::str::FromStr;  //  Для преобразования чисел из строк
  6. use std::collections::BTreeMap; //  Для нашего хранилища
  7.  
  8. static  APP_NAME:   &str  = "array_num_count";
  9. static  BUF_SIZE:   usize = 0x10000;
  10. static  DELIM:  &str = "#--------------------------------";
  11.  
  12. //-------------------------------------------------------------------
  13. //  Начало программы
  14. fn  main()
  15. {
  16.     //  Породим вектор с аргументами командной строки
  17.     let argv:Vec<String> = std::env::args().collect();
  18.    
  19.     if  argv.len() > 1
  20.     {
  21.         for i in 1..argv.len()
  22.         {
  23.             //  Попробуем открыть на чтение файл с именем,
  24.             //  содержащимся в векторе argv по индексу i
  25.             match   OpenOptions::new().read(true).open(&argv[i])
  26.             {
  27.                 Ok( f ) =>
  28.                 {
  29.                     println!( "{}", DELIM );
  30.                     println!( "Обрабатываем файл '{}':",
  31.                         &argv[i] );
  32.                     //  Обработаем файл
  33.                     process_file( &f );
  34.                     println!( "{}", DELIM );
  35.                 },
  36.                 Err( err ) =>
  37.                 {
  38.                     eprintln!( "Ошибка открытия {}: {}",
  39.                          &argv[i], err );
  40.                 }
  41.             }
  42.         }
  43.     }
  44.     else
  45.     {
  46.         println!( "Использование:" );
  47.         println!( "{} <файл1> ... <файлN>", APP_NAME );
  48.     }
  49. }
  50. //-------------------------------------------------------------------
  51. fn  process_file( file : &std::fs::File )
  52. {
  53.     //  Породим BufReader
  54.     let reader = BufReader::with_capacity( BUF_SIZE, file );
  55.     //  Хранилище информации о числе цифр в массиве
  56.     //  Ключом является число из массива типа i64, значением - счетчик
  57.     //  таких чисел типа u64
  58.     let mut storage : BTreeMap<i64,u64> = BTreeMap::new();
  59.    
  60.     //  Построчное считывание файла
  61.     for (n,line) in reader.lines().enumerate()
  62.     {
  63.         match   line
  64.         {
  65.             Ok( l ) =>
  66.             {
  67.                 //  Произведем разбор считанной строки
  68.                 process_array_line( &l, &mut storage );
  69.             },
  70.             Err( err ) =>
  71.             {
  72.                 eprintln!( "Ошибка считывания строки {}: {}",
  73.                     n, err );
  74.             }
  75.         }
  76.     }
  77.    
  78.     println!( "Частота встречи чисел в массиве:" );
  79.     for (num,count) in &storage
  80.     {
  81.         println!( "Частота встречи числа {} в массиве: {} раза", num, count );
  82.     }
  83. }
  84. //-------------------------------------------------------------------
  85. fn  process_array_line( line: &std::string::String,
  86.         map: &mut BTreeMap<i64,u64> )
  87. {
  88.     //  Превратим строку чисел, разделенных пробелами и табуляцией
  89.     //  в вектор из отедльных полей
  90.     let num_str : Vec<&str> = line.split_whitespace().collect();
  91.    
  92.     for ns in num_str
  93.     {
  94.         //  Попробуем преобразовать каждый элемент вектора
  95.         //  из строки в число
  96.         match   i64::from_str( ns )
  97.         {
  98.             //  Перборазование удалось?
  99.             Ok( val ) =>
  100.             {
  101.                 //  Найдем в хранилище элемент с ключом,
  102.                 //  равным текущему числу или добавим
  103.                 //  такой ключ со счетчиком, равным 0,
  104.                 //  если его еще не существует
  105.                 let entry = map.entry( val ).or_insert( 0 );
  106.                 //  Увеличим счетчик количества чисел в
  107.                 //  массиве для данного числа на единицу
  108.                 *entry += 1;
  109.             },
  110.             //  Не, не удалось, надо вывести сообщение об ошибке
  111.             Err( err ) =>
  112.             {
  113.                 eprintln!( "Ошибка преобразования '{}' в i64: {}",
  114.                     ns, err );
  115.             },
  116.         }
  117.     }
  118.    
  119. }
  120. //-------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement