Программы
Примеры решений ДЗ

Примеры решений ДЗ

Примеры решений домашних заданий за первые 3 пары

Примеры взяты из решений студентов. "Рабский труд" и всё такое.

Изображение Изучаем язык программирования Си

1ая тема

Программа для проверки прямоугольности треугольника:

  • На вход даются 3 числа - длины 3-х сторон треугольника.
  • Вывести "True", если треугольник прямоугольный, иначе "False".

Тесты:

  • 3, 4, 5
  • 20, 4, 5
  • 1.2345678, 2.3456789, 2.650729551406942
#include <stdio.h>

int main(void){
    float a;
    float b;
    float c;
    float epsilon = 0.001;

    scanf("%f %f %f", &a, &b, &c);

    // Обработка ситуации с неправильным треугольником
    if (a + b - c < epsilon || a + c - b < epsilon || b + c - a < epsilon){
        puts("Uncorrect");
	// Это исключительная ситуация - указываем это кодом ошибки.
        return 1;
    }
    
    // Проверки по теореме Пифагора

    if (a * a + b * b - c * c < epsilon){
        puts("True");
        return 0;
    }

    if (a * a + c * c - b * b < epsilon){
        puts("True");
        return 0;
    }

    if (c * c + b * b - a * a < epsilon){
        puts("True");
        return 0;
    }

    // Если ничто не подошло, в рамках описанного контракта - вернём False
    puts("False");
    return 0;
}

2ая тема

Написать утилиту, позволяющую считать статистику по символам: цифры, латиница.

Пример работы:

→ cat /etc/passwd | ./counter
Digits: 12
Latin symbols: 112

Подсказка. Читать символы можно функцией getc из stdio, читать нужно из stdin, а символ конца ввода – EOF. Например:

while ((c = getc(stdin)) != EOF)
#include <stdio.h>

int main(void){
    int count_digital = 0;
    int count_character = 0;
    char c;

    while ((c = getc(stdin)) != EOF){
	// Используем тот факт, что символы от 'a' до 'z' идут порят.
	// Аналогично с от 'A' до 'Z'.
	
	// И помним, что двойные кавычки для строк, одинарные - для символов.
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
            count_character += 1;
        }

	// От '0' до '9' символы также идут подряд.
        if (c >= '0' && c <= '9'){
            count_digital += 1;
        }
    }

    printf("Count of digital: %d\n", count_digital);
    printf("Count of character: %d\n", count_character);
    return 0;
}

3ая тема

  • Написать вывод таблицы квадратов в псевдографике.

    Таблица

    • балл за реализацию на указателях
#include <stdio.h>

int main(void){
    puts("Table of squares of natural numbers from 10 to 99");
    int size = 10;
    int nums[size][size];
    int k = 0;

    for (int i = 0; i < size - 1; ++i) {
        for (int j = 0; j < size; ++j) {
            nums[i][j] = ((i + 1) * size + j) * ((i + 1) * size + j);
        }
    }

    for (int i = 0; i < size ; ++i){
        printf("%4d ", i);
    }
    printf("\n");

    for (int (*i)[size] = nums; i != nums + size - 1; ++i) {
        for (int *j = *i; j != *i + size; ++j) {
            if (j - (*i) == 0){
                printf("%d ", k + 1);
                k++;
            }
            printf("%4d ", *j);
        }
        printf("\n");
    }

    return 0;
}
  • Написать функцию strncat.
#include <stdio.h>
#include <string.h>

char* sstrncat(char *destptr, const char *srcptr, size_t num){
    int length = strlen(destptr);

    for (int i = 0; i < num; ++i){
        destptr[length + i] = srcptr[i];
    }

    // Не забываем про нуль-байт
    destptr[length + num] = 0;

    return destptr;
}

int main(void){
    char str1[40];
    char str2[40];
    int size;

    scanf("%s %s %d", &str1, &str2, &size);

    sstrncat(str1, str2, size);

    printf ("Result: %s\n", str1);
    return 0;
}