Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 34

Нахождение наибольшего значения счётчика

27.12.2019, 13:30. Показов 2362. Ответов 8

Студворк — интернет-сервис помощи студентам
Задача такая:

Дано какое-то количество студентов. Каждую неделю они получают оценку по каждой трёх дисциплин. Всего недель 35. Нужно найти лучшего студента, то есть порядковый номер того, кто больше всех остальных недель подряд продержался без троек (получал оценку не ниже 4).

Вот моё видение реализации данной программы:

Получилось реализовать почти всё, кроме адекватного счётчика и нахождения лучшего студента. Работать счётчик должен так: к переменной прибавляется единица каждый раз, когда у студента за неделю все оценки выше 3. Когда же попадается неделя, когда у студента имеется тройка, счётчик сбрасывается, и нужно запомнить значение переменной, которая была до сброса. Потом все эти значения надо сравнить и выбрать наибольшее среди них - получается количество недель подряд у определённого студента, когда он получал хорошие оценки. Далее и эти значения нужно сравнить - но уже среди студентов. И вот тут мы и находим лучшего студента.

Если есть и более простой способ выполнения данной задачи - с радостью рассмотрю и его. Одно главное условие - массивы дисциплин должны сохранится.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "pch.h"
#include <iostream>
#include <locale>
#include <ctime>
#include <cstdlib>
 
using namespace std;
//using namespace System;
 
int main()
{
    setlocale(LC_ALL, "Rus");
    int programming[35]; //35 недель - длительность обучения студента
    int math[35];
    int physics[35];
    int good_score = 0; //переменная для будущего счётчика
    //int new_score = good_score; //временная переменная для счётчика
    for (int students = 1; students < 6; students++) //всего - 5 студентов. Порядковый номер от 1 до 5
    {
        cout << "Студент №" << students << endl;
        for (int week = 1; week < 36; week++) //цикл для каждой недели (всего - 35)
        {
        cout << "\n" << "Неделя " << week << ":" << endl;
        
        int pr = 0; //переменная для оценки по программированию
        cout << "Программирование: ";
        for (int new_prog = 0; new_prog < 1; new_prog++) //цикл по дисциплине программирование
        {
            programming[new_prog] = rand() % 4 + 2; //оценки ставятся рандомно - от 2 до 5
            cout << " " << programming[new_prog];
            int pr = programming[new_prog];
        }
 
        int ma = 0; //переменная для оценки по математике
        cout << " " << "Математика: ";
        for (int new_math = 0; new_math < 1; new_math++) //цикл по дисциплине математика
        {
            math[new_math] = rand() % 4 + 2;
            cout << " " << math[new_math];
            int ma = math[new_math];
        }
 
        int ph = 0; //переменная для оценки по физике
        cout << " " << "Физика: ";
        for (int new_phys = 0; new_phys < 1; new_phys++) //цикл по дисциплине физика
        {
            physics[new_phys] = rand() % 4 + 2;
            cout << " " << physics[new_phys];
             ph = physics[new_phys];
        }
        
        if ((pr && ma && ph) > 3) good_score++; //увеличиваем значение счётчика, при том условии, что студент получал по каждому предмету оценку выше тройки всю неделю   
                                                                                             
        else good_score = 0;//сбрасываем счётчик
        //else good_score = new_score - 1; //попытка реализации уменьшения счётчика на 1
    }
        cout << "\n" << "Количество недель подряд без плохих оценок: " << good_score << endl;
 
        cout << "\n\n\n\n" << endl;
        }
    //здесь нужно вывести порядковый номер студента, который дольше всего продержался без троек
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2019, 13:30
Ответы с готовыми решениями:

Нахождение наибольшего элемента дерева
Написать функцию, которая находит наибольший элемент дерева. Добавлено через 3 часа 56 минут помогитее((

Нахождение наибольшего элемента в последовательности
По структурам и алгоритмам дали задание, найти наибольшее число с помощью сложения чисел последовательности. Я набросал такой код. Но не...

Нахождение наибольшего общего делителя
Разработать и испытать рекурсивную функцию для вычисления наибольшего общего делителя двух введенных натуральных чисел.

8
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.12.2019, 13:52
Цитата Сообщение от Lexa_Biben Посмотреть сообщение
Получилось реализовать почти всё, кроме адекватного счётчика и нахождения лучшего студента. Работать счётчик должен так: к переменной прибавляется единица каждый раз, когда у студента за неделю все оценки выше 3.
C++
1
2
3
4
5
6
7
8
9
10
11
bool good_score[5][35];
for (int students = 1; students < 6; students++) //всего - 5 студентов. Порядковый номер от 1 до 5
{
    for (int week = 1; week < 36; week++)
    {
        .............
 
        good_score[students - 1][week - 1] = pr > 3 && ma > 3 && ph > 3;
 
  
}
1
1 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 34
27.12.2019, 14:13  [ТС]
Вставил как у вас в коде показано, в цикл weeks. Выдаёт вот такое вот, причём у каждого студента это значение одинаково:
Миниатюры
Нахождение наибольшего значения счётчика  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.12.2019, 14:20
Лучший ответ Сообщение было отмечено Lexa_Biben как решение

Решение

Цитата Сообщение от Lexa_Biben Посмотреть сообщение
Вставил как у вас в коде показано, в цикл weeks. Выдаёт вот такое вот, причём у каждого студента это значение одинаково:
Кто выдаёт?
Там надо пробежаться по этому массиву и подсчитать количество хороших недель подряд.

Добавлено через 4 минуты
Кстати, там можно без матрицы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int best_student = 0;
int best_scores = 0;
for (int students = 1; students < 6; students++) //всего - 5 студентов. Порядковый номер от 1 до 5
{
    bool good_score[35];
    for (int week = 1; week < 36; week++)
    {
        .............
 
            good_score[week - 1] = pr > 3 && ma > 3 && ph > 3;
 
 
    }
 
    int n = 0;
    //Здесь пробегаемся good_score и подсчитываем недели - результат в n
    for (size_t i =0; i < 35; ++i)
        if (good_score[i]) ///для примера. Нужно сделать правильно
            ++n;
 
    if (best_scores < n)
    {
        best_student = students;
        best_scores = n;
    }
1
1 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 34
27.12.2019, 14:21  [ТС]
Извиняюсь, я просто не особо силён в c++. Вставил
C++
1
good_score[students - 1][week - 1] = pr > 3 && ma > 3 && ph > 3;
в самый конец цикла week, а затем в пределах следующего цикла вывел good_score. Вот это и получилось при выводе. Я так понимаю, это в другое место впихнуть надо?

Добавлено через 49 секунд
Так, сейчас проверю. Сообщение только сейчас увидел.
0
1 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 34
27.12.2019, 14:34  [ТС]
for (int students = 1; students < 6; students++) //всего - 5 студентов. Порядковый номер от 1 до 5
{
cout << "Студент №" << students << endl;
for (int week = 1; week < 36; week++) //цикл для каждой недели (всего - 35)
{

.....................................


good_score[week - 1] = pr > 3 && ma > 3 && ph > 3;

}
int n = 0;
//Здесь пробегаемся good_score и подсчитываем недели - результат в n
for (size_t i = 0; i < 35; ++i)

if (good_score[i]) ///для примера. Нужно сделать правильно
++n;

if (best_scores < n)
{
best_student = students;
best_scores = n;
}


cout << "\n" << "Количество недель: " << best_scores << endl;

cout << "\n\n\n\n" << endl;
}
cout << "\n" << "Лучший студент: " << best_student << endl;

return 0;
}


Записал таким образом, результат:
Миниатюры
Нахождение наибольшего значения счётчика  
0
1 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 34
27.12.2019, 15:28  [ТС]
И какое условие сюда вписывать я так и не понял:
C++
1
2
 if (good_score[i]) ///для примера. Нужно сделать правильно
                ++n;
Добавлено через 50 минут
oleg-m1973, Всё нормально заработало, просто я затупил дико. Если вдруг знаете, как сделать количество хороших недель именно подряд, то буду премного благодарен.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.12.2019, 15:34
Лучший ответ Сообщение было отмечено Lexa_Biben как решение

Решение

Цитата Сообщение от Lexa_Biben Посмотреть сообщение
oleg-m1973, Всё нормально заработало, просто я затупил дико. Если вдруг знаете, как сделать количество хороших недель именно подряд, то буду премного благодарен.
Вот тебе третий вариант, надеюсь окончательный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int best_student = 0;
int best_scores = 0;
for (int students = 1; students < 6; students++) //всего - 5 студентов. Порядковый номер от 1 до 5
{
    int n1 = 0, n2 = 0;
    for (int week = 1; week < 36; week++)
    {
        .............
 
            if (pr > 3 && ma > 3 && ph > 3)
                ++n2;
            else
            {
                if (n1 < n2)
                    n1 = n2;
 
                n2 = 0;
            }
 
..........................
    }
 
    if (n1 < n2)
        n1 = n2;
 
    if (best_scores < n1)
    {
        best_student = students;
        best_scores = n1;
    }
.....................
}
1
1 / 1 / 0
Регистрация: 07.06.2019
Сообщений: 34
27.12.2019, 15:41  [ТС]
oleg-m1973, Супер! Спасибо вам огромное!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2019, 15:41
Помогаю со студенческими работами здесь

Нахождение наибольшего числа в массиве
Здравствуйте! У меня такая проблема: есть задача написать функцию, которая принимает в качестве аргумента адрес массива и количество...

Нахождение наибольшего общего делителя
Borland C++ Найти наибольший общий делитель двух натуральных чисел a и b.

Нахождение нечетного наибольшего числа в матрице
Дана матрица MXN. В ней надо найти нечетное наибольшее число среди случайных чисел в диапазоне от -27 до 38. #include...

Нахождение наибольшего общего делителя n чисел
Найти НОД (наибольший общий делитель) n чисел. Входные данные Первая строка содержит количество чисел n (1 &lt; n &lt; 101). Во...

нахождение наименьшего и наибольшего,,,,замена местами....
Задание.Дана действительная квадратная матрица порядка n. Найти наибольшее и наименьшее из значений элементов, расположенных в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru