Top.Mail.Ru
Ответы

C vs Rust vs Zig / На каком примере кода вам стало комфортно?

  • Zig:

123456789101112131415161718192021222324252627282930313233
 const std = @import("std"); 
 
pub fn main() !void { 
    var rng = std.rand.DefaultPrng.init(blk: { 
        var seed: u64 = undefined; 
        try std.os.getrandom(std.mem.asBytes(&seed)); 
        break :blk seed; 
    }); 
 
    var numbers: [15]i32 = undefined; 
 
    for (0..numbers.len) |i| { 
        numbers[i] = rng.random().intRangeAtMost(i32, 0, 100); 
    } 
 
    std.debug.print("{any}\n", .{numbers}); 
     
    var sum: f32 = 0; 
    var count: f32 = 0; 
 
    for (numbers) |elem| { 
        if (@rem(elem, 10) == 5) { 
            sum += @floatFromInt(elem); 
            count += 1; 
        } 
    } 
     
    if (count > 0) { 
        std.debug.print("{d}\n", .{sum / count}); 
    } else { 
        std.debug.print("none\n", .{}); 
    } 
} 
  • Rust:

123456789101112131415161718192021222324
 use rand::Rng; 
 
fn main() { 
    let mut rnd_generator = rand::thread_rng(); 
     
    let numbers: Vec<i32> = (0..15) 
        .map(|_| rnd_generator.gen_range(0..=100)) 
        .collect(); 
 
    println!("{:?}", numbers); 
     
    let numbers: Vec<i32> = numbers.into_iter() 
        .filter(|&x| x % 10 == 5) 
        .collect(); 
     
    if !numbers.is_empty() { 
        let sum = numbers.iter().sum::<i32>() as f32; 
        let len = numbers.len() as f32; 
         
        println!("{}", sum / len); 
    } else { 
        println!("none"); 
    } 
} 
  • C:

123456789101112131415161718192021222324252627282930313233343536373839
 #include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
 
#define NUMBERS_SIZE 15 
 
int main(void) 
{ 
    size_t count = 0; 
    float sum = 0; 
    size_t i; 
    int numbers[NUMBERS_SIZE]; 
 
    srand(time(NULL)); 
     
    for (i = 0; i < NUMBERS_SIZE; ++i) 
        numbers[i] = rand() % 101; /* 0..=100 */ 
     
    printf("["); 
    for (i = 0; i < NUMBERS_SIZE; ++i) { 
        printf("%d", numbers[i]); 
        if (i < NUMBERS_SIZE - 1) printf(", "); 
    } 
    printf("]\n"); 
     
    for (i = 0; i < NUMBERS_SIZE; ++i) { 
        if (numbers[i] % 10 == 5) { 
            count++; 
            sum += numbers[i]; 
        } 
    } 
     
    if (count > 0) 
        printf("%.2f\n", sum / count); 
    else 
        printf("none\n"); 
     
    return 0; 
} 

Задание:
Найдите среднее арифметическое элементов массива, которые оканчиваются на 5.
Массив должен быть образован генератором случайных чисел

Возможный вывод:
[14, 76, 45, 9, 83, 60, 28, 96, 50, 92, 50, 80, 37, 54, 31]
45

Анонимный опрос
Zig
Rust
C
Всего голосов: 13
По дате
По рейтингу
Аватар пользователя
Мыслитель

C существует более полувека, уступая лишь десятилетие Лиспу и Фортрану.
А новомодным сишкам - без году неделя, и они всегда будут вторичными. Да, в них насандалили фич, они такие супер-удобные, в два-три раза кода можно меньше писать. Но рынок не захватили. Go < 1.5%, Rust < 1%, а про зигу эту и вовсе никто не слышал.

Аватар пользователя
Мастер

Ваш вопрос несколько некорректный, тем более что код на Rust специально написали в малопонятном для непосвященного стиле.



Видео по теме