Практические задания по программированию на C/C++ (часть 2)

Задание №8: Нисходящая разработка алгоритмов

#include <windows.h>
#include <stdio.h>

const char info[] =
"                          Задание №8n"
"n"
"2.5.3 Разработка алгоритмов и программ нисходящим способомn"
"n"
"     Разработать алгоритм и программу нисходящим способом, предполагаяn"
"заданной матрицу A из 5  строк и 5  столбцов  или  одномерные  массивыn"
"указанной длины.n"
"n"
"     Если в матрице A элементы, равные нулю, встречаются не более, чемn"
"в двух строках, задать элементам X1, X2, ..., X5 значения соответству-
"ющих по номеру элементов главной диагонали.n";

const unsigned SIZE_A = 5;

void printA(int A[][SIZE_A]) {
    unsigned i, j;
    printf("Исходная матрица An");
    for (i = 0; i < SIZE_A; ++i) {
        for (j = 0; j < SIZE_A; ++j) printf("%3d", A[i][j]);
        printf("n");
    }
    printf("n");
}

void printX(int X[]) {
    unsigned i;
    printf("Результирующий массив Xn");
    for (i = 0; i < SIZE_A; ++i) printf("%3d", *X++);
    printf("nn");
}

bool zero(int col[]) {
    unsigned i;
    for (i = 0; i < SIZE_A; ++i) if (*col++ == 0) return true;
    return false;
}

bool zero2(int A[][SIZE_A]) {
    unsigned i, cnt;
    for (i = cnt = 0; i < SIZE_A; ++i) if (zero(A[i]) && ++cnt == 3) return true;
    return false;
}

void diagonal(int A[][SIZE_A], int X[]) {
    unsigned i;
    for (i = 0; i < SIZE_A; ++i) *X++ = A[i][i];
}

int main() {
    int A[][SIZE_A] = { { 1, 2, 3, -5, 0}, { 10, 17, 13, 1, 70}, { 6, 7, 0, 8, 16}, { 1, 1, 1, 1, 1}, { 2, 2, 2, 2, 2} };
    int X[SIZE_A];
    SetConsoleOutputCP(1251);
    printf(info);
    printA(A);
    if (zero2(A)) printf("В матрице A более двух строк, содержащих хотя бы один нульnn");
    else { diagonal(A, X); printX(X); }
    system("pause");
    return 0;
}

Задание №9: Многомодульные программы

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <ctype.h>
#include <vector>
#include <string>

using namespace std;

const char info[] =
"                     Задание №9n"
"n"
"4.3.3 многомодульных программ с выделением процедурn"
"n"
"     Разработать программу, выделив процедуры.n"
"n"
"     Определить по экзаменационной ведомости, попадает ли группаn"
"на конкурс лучших групп. Условия конкурса:  средний балл  группыn"
"выше четырех, отсутствие неуспевающих, число студентов, не имею-n"
"щих троек, больше половины всех студентов группы.n";

struct MAN { string fio; unsigned year; char sex; unsigned eval[3]; unsigned grants; };
vector<MAN> group;
char inp[1024];
const unsigned CNT_PARAM = 9;
int cnt;
unsigned char* param[CNT_PARAM];
unsigned num;
FILE* f;

bool get_param(void) {
    char* s, c;
    ++num; cnt = 0; s = inp;
    for (;;) {
        while ((c = *s) == ' ' || c == 't' || c == 'n') ++s;
        if (c == 0) break;
        if (cnt == CNT_PARAM) { printf_s("Строка файла %u:nСлишком много параметровn", num); fclose(f); return false; }
        param[cnt++] = (unsigned char*)s;
        while ((c = *s) != ' ' && c != 't' && c != 'n' && c) ++s;
        if (c == 0) break;
        *s++ = 0;
    }
    if (cnt == 0 || cnt == CNT_PARAM) return true;
    printf_s("Строка файла %u:nОжидалось %u параметровn", num, CNT_PARAM); fclose(f); return false;
}

int test_num(unsigned char* s, const char* name, int min, int max) {
    int v;
    if (!isdigit(*s)) { printf_s("Строка файла %u:nЗначение '%s' ошибочноn", num, name); fclose(f); return 0; }
    v = atoi((char*)s);
    while (isdigit(*++s));
    if (*s) { printf_s("Строка файла %u:nЗначение '%s' ошибочноn", num, name); fclose(f); return 0; }
    if (v < min || v > max) { printf_s("Строка файла %u:nЗначение '%s' не в диапазоне [%d...%d]n", num, name, min, max); fclose(f); return 0; }
    return v;
}

bool input(void) {
    string name; MAN man;
    printf_s("Имя файла с данными студентов: "); getline(cin, name);
    if ((f = fopen(name.c_str(), "r")) == NULL) { printf_s("Ошибка открытия файлаn"); return false; }
    while (fgets(inp, sizeof(inp) - 2, f)) {
        if (!get_param()) return false;
        if (cnt == 0) continue;
        man.fio = (char*)param[0]; man.fio += " "; man.fio += (char*)param[1]; man.fio += " "; man.fio += (char*)param[2];
        if ((man.year = test_num(param[3], "год рождения", 1971, 2000)) == 0) return false;
        if (strcmp((const char*)param[4], "М") && strcmp((const char*)param[4], "Ж")) { printf_s("Строка файла %u:nПол ошибоченn", num); fclose(f); return false; }
        man.sex = param[4][0];
        if ((man.eval[0] = test_num(param[5], "оценка по физике", 2, 5)) == 0) return false;
        if ((man.eval[1] = test_num(param[6], "оценка по математике", 2, 5)) == 0) return false;
        if ((man.eval[2] = test_num(param[7], "оценка по информатике", 2, 5)) == 0) return false;
        if ((man.grants = test_num(param[8], "стипендия", 0, 10000)) == 0) return false;
        group.push_back(man);
    }
    fclose(f);
    if (group.size() == 0) { printf_s("Файл не содержит информацию о студентахn"); return false; }
    return true;
}

void print(void) {
    int i; size_t w1; MAN man; string line;
    w1 = strlen("ФИО");
    for (i = 0; i < group.size(); ++i) { man = group[i]; if (man.fio.length() > w1) w1 = man.fio.length(); }
    line = "+"; for (i = 0; i < w1; ++i) line += '-'; line += "+------------+---+------+----------+-----------+---------+";
    printf_s("nСписок всех студентовn%sn", line.c_str());
    printf_s("|%-*s|Год рождения|Пол|Физика|Математика|Информатика|Стипендия|n%sn", (int)w1, "ФИО", line.c_str());
    for (i = 0; i < group.size(); ++i) {
        man = group[i];
        printf("|%-*s|    %u    | %c |   %u  |     %u    |     %u     |%9u|n", (int)w1, man.fio.c_str(), man.year, man.sex, man.eval[0], man.eval[1], man.eval[2], man.grants);
    }
    printf_s("%snn", line.c_str());
}

bool best_group(void) {
    int i, j, ball, cnt_no_3, yes_3; MAN man;
    for (i = ball = cnt_no_3 = 0; i < group.size(); ++i) {
        man = group[i];
        for (j = yes_3 = 0; j < 3; ++j) {
            switch (man.eval[j]) { case 2: return false; case 3: yes_3 = 1; }
            ball += man.eval[j];
        }
        if (!yes_3) ++cnt_no_3;
    }
    return (double)ball / (3 * i) > 4.0 && cnt_no_3 > i / 2;
}

int main() {
    SetConsoleOutputCP(1251); printf(info);
    if (!input()) { system("pause"); return 0; }
    print();
    printf(best_group() ? "Группа попадает на конкурсnn" : "Группа не попадает на конкурсnn");
    system("pause"); return 0;
}

Оцените статью
Сессия под ключ дистанционно
Добавить комментарий

Заявка на расчет