Примеры взяты из решений студентов. "Рабский труд" и всё такое.
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;
}