Add exam work for Architecture of Computers and Computer Networks
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
# Архітектура Комп'ютера та Комп'ютерних Мереж
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/target
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
1;2;3;4;5;6;7;8;9;a;b;c;d;e;f;10;11;12;13;14;15;16;17;18;19;1a;1b;1c;1d;1e;1f;20;21;22;23;24;25;26;27;28;29;2a;2b;2c;2d;2e;2f;30;31;32;33;34;35;36;37;38;39;3a;3b;3c;3d;3e;3f;40;41;42;43;44;45;46;47;48;49;4a;4b;4c;4d;4e;4f;50;51;52;53;54;55;56;57;58;59;5a;5b;5c;5d;5e;5f;60;61;62;63;64;65;66;67;68;69;6a;6b;6c;6d;6e;6f;70;71;72;73;74;75;76;77;78;79;7a;7b;7c;7d;7e;7f;80;81;82;83;84;85;86;87;88;89;8a;8b;8c;8d;8e;8f;90;91;92;93;94;95;96;97;98;99;9a;9b;9c;9d;9e;9f;a0;a1;a2;a3;a4;a5;a6;a7;a8;a9;aa;ab;ac;ad;ae;af;b0;b1;b2;b3;b4;b5;b6;b7;b8;b9;ba;bb;bc;bd;be;bf;c0;c1;c2;c3;c4;c5;c6;c7;c8;c9;ca;cb;cc;cd;ce;cf;d0;d1;d2;d3;d4;d5;d6;d7;d8;d9;da;db;dc;dd;de;df;e0;e1;e2;e3;e4;e5;e6;e7;e8;e9;ea;eb;ec;ed;ee;ef;f0;f1;f2;f3;f4;f5;f6;f7;f8;f9;fa;fb;fc;fd;fe;ff
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
01;02;03;04;05;06;07;10;11;12;13;14;15;16;17;020;021;022;023;024;025;026;027;030;031;032;033;034;035;036;037;040;041;042;043;044;045;046;047;050;051;052;053;054;055;056;057;060;061;062;063;064;065;066;067;070;071;072;073;074;075;076;077;100;101;102;103;104;105;106;107;110;111;112;113;114;115;116;117;120;121;122;123;124;125;126;127;130;131;132;133;134;135;136;137;140;141;142;143;144;145;146;147;150;151;152;153;154;155;156;157;160;161;162;163;164;165;166;167;170;171;172;173;174;175;176;177;200;201;202;203;204;205;206;207;210;211;212;213;214;215;216;217;220;221;222;223;224;225;226;227;230;231;232;233;234;235;236;237;240;241;242;243;244;245;246;247;250;251;252;253;254;255;256;257;260;261;262;263;264;265;266;267;270;271;272;273;274;275;276;277;300;301;302;303;304;305;306;307;310;311;312;313;314;315;316;317;320;321;322;323;324;325;326;327;330;331;332;333;334;335;336;337;340;341;342;343;344;345;346;347;350;351;352;353;354;355;356;357;360;361;362;363;364;365;366;367;370;371;372;373;374;375;376;377
|
||||||
Generated
+7
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "exam"
|
||||||
|
version = "0.1.0"
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
[package]
|
||||||
|
name = "exam"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Exam
|
||||||
|
|
||||||
|
> Скласти консольну програму для переведення чисел з комою з однієї системи числення в іншу.
|
||||||
|
>
|
||||||
|
> Вхідні данні:
|
||||||
|
> - Система числення: 16
|
||||||
|
> - Діапазон чисел: від 0 до 255
|
||||||
|
> - Точність: 2 знаків після коми
|
||||||
|
> - Організація вводу: файл, значення розділені «;»
|
||||||
|
>
|
||||||
|
> Вихідні дані:
|
||||||
|
> - Система числення: 8
|
||||||
|
> - Організація виводу: файл, значення розділені «;»
|
||||||
|
|
||||||
|
Convert floating-point numbers from hexadecimal (base-16) to octal (base-8).
|
||||||
|
|
||||||
|
Reads a semicolon-separated list of hexadecimal values from an input file, converting them first to binary and then to octal, and write the results to an output file using the same semicolon separator. The conversion logic manually maps characters to their bit representations rather than using built-in parsing functions to handle the fractional parts explicitly.
|
||||||
|
|
||||||
|
|
||||||
|
Cooked this bad boy during the exam.
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
/*
|
||||||
|
Скласти консольну програму для переведення чисел з комою з однієї системи числення в іншу.
|
||||||
|
Вхідні данні:
|
||||||
|
Система числення: 16
|
||||||
|
Діапазон чисел: від 0 до 255
|
||||||
|
Точність: 2 знаків після коми
|
||||||
|
Організація вводу: файл, значення розділені «;»
|
||||||
|
|
||||||
|
Вихідні дані:
|
||||||
|
Система числення: 8
|
||||||
|
Організація виводу: файл, значення розділені «;»
|
||||||
|
*/
|
||||||
|
use std::{env, error::Error, fs};
|
||||||
|
|
||||||
|
fn hex_to_bin(s: &str) -> Result<String, String> {
|
||||||
|
let mut result = String::new();
|
||||||
|
for c in s.chars() {
|
||||||
|
result += match c {
|
||||||
|
'.' | ',' => ".",
|
||||||
|
'0' => "0000",
|
||||||
|
'1' => "0001",
|
||||||
|
'2' => "0010",
|
||||||
|
'3' => "0011",
|
||||||
|
'4' => "0100",
|
||||||
|
'5' => "0101",
|
||||||
|
'6' => "0110",
|
||||||
|
'7' => "0111",
|
||||||
|
'8' => "1000",
|
||||||
|
'9' => "1001",
|
||||||
|
'A' | 'a' => "1010",
|
||||||
|
'B' | 'b' => "1011",
|
||||||
|
'C' | 'c' => "1100",
|
||||||
|
'D' | 'd' => "1101",
|
||||||
|
'E' | 'e' => "1110",
|
||||||
|
'F' | 'f' => "1111",
|
||||||
|
_ => return Err(format!("Can't convert `{c}` to binary")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bin_char_to_oct(s: &str) -> Result<&'static str, String> {
|
||||||
|
Ok(match s.trim_end_matches('0') {
|
||||||
|
"" => "0", // 000
|
||||||
|
"001" => "1", // 001
|
||||||
|
"01" => "2", // 010
|
||||||
|
"011" => "3", // 011
|
||||||
|
"1" => "4", // 100
|
||||||
|
"101" => "5", // 101
|
||||||
|
"11" => "6", // 110
|
||||||
|
"111" => "7", // 111
|
||||||
|
_ => return Err(format!("Can't convert `{s}` to octal")),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bin_to_oct(s: &str) -> Result<String, String> {
|
||||||
|
let (whole, fraction) = if s.contains('.') {
|
||||||
|
let mut split = s.split('.');
|
||||||
|
(split.next().unwrap(), Some(split.next().unwrap()))
|
||||||
|
} else if s.contains(',') {
|
||||||
|
let mut split = s.split(',');
|
||||||
|
(split.next().unwrap(), Some(split.next().unwrap()))
|
||||||
|
} else {
|
||||||
|
(s, None)
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut whole = String::from(whole);
|
||||||
|
while whole.len() % 3 != 0 {
|
||||||
|
whole = "0".to_string() + &whole;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut result = String::new();
|
||||||
|
|
||||||
|
for chunk in whole.chars().collect::<Vec<char>>().chunks(3) {
|
||||||
|
result += bin_char_to_oct(&chunk.iter().collect::<String>())?;
|
||||||
|
}
|
||||||
|
if let Some(fract) = fraction {
|
||||||
|
result += ".";
|
||||||
|
for chunk in fract.chars().collect::<Vec<char>>().chunks(3) {
|
||||||
|
result += bin_char_to_oct(&chunk.iter().collect::<String>())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
let input_file = env::args().nth(1).expect("Provide input filename");
|
||||||
|
let output_file = env::args().nth(2).expect("Provide output filename");
|
||||||
|
|
||||||
|
let contents: String = fs::read_to_string(input_file)?;
|
||||||
|
let numbers: Vec<&str> = contents.trim().split(';').collect();
|
||||||
|
|
||||||
|
let mut result: Vec<String> = Vec::new();
|
||||||
|
for num in numbers {
|
||||||
|
let bin = hex_to_bin(num)?;
|
||||||
|
let oct = bin_to_oct(&bin)?;
|
||||||
|
result.push(oct);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", result.join(";"));
|
||||||
|
fs::write(output_file, result.join(";"))?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user