Задание №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;
}