download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Помощ за C++ задача

Автор
Съобщение
nik2009
Чет, 26.10.17, 23:09
Здравейте, занимавам се само със C#, но имам задача за домашна която е на C++ и моля за помощ, че там синтаксисът ми е труден и не съм се занимавал.
Условието е: Да се напише програма реализираща въвеждане от клавиатурата на броя присъстващи студенти на занятие за всеки от 30 поредни дни.
- Да се изведе с цифри денят с най-малко присъстващи студенти и минималния брой присъстващи студенти
- да се изведе общия брой студенти
- да се изведат дните , в които са присъствали над 12 студенти

Благодаря!
редактиран от nik2009 на 26.10.17 23:10
dreven
Пет, 27.10.17, 11:41
Аз също не се занимавам със C++, но на Visual Basic 6.0 тази задачка се решава елегантно с няколко реда сорс.
За реализацията е необходимо само едно текстово поле и 3 броя Label, за визуализация:

Ето го и целия сорс:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim masiv(1 To 30), den, Min

Private Sub Form_Load()
Min = 1
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) ' Въвеждаме студентите за 30 дни
    If KeyCode = 13 Then ' тоест при натискане на Enter
        den = den + 1 ' увеличаваме дните с един, започвайки от 0
        masiv(den) = Val(Text1.Text) ' Въвеждаме броя на студентите в масива
        Label1.Caption = den + 1 & " ден" ' Визуализираме следващия ден
        Me.Print den & " ден: " & Val(Text1.Text) ' Визуализираме въведените данни на формата
        Text1.Text = "" ' Изчистваме текстовото поле, подготвяйки го следващо въвеждане
        'определяме деня с най-малко студенти
        If masiv(den) <= masiv(Min) Then Min = den: Label2.Caption = "Минимален брой на " & Min & " ден"
        Label3.Caption = Val(Label3.Caption) + masiv(den) & " студенти общ брой" ' Общ брой студенти
        If masiv(den) > 12 Then Label4.Caption = Label4.Caption & den & "; "
        If den = 30 Then Text1.Visible = False: Label1.Visible = False 'скриваме полето за въвеждане и надписа за дните
        End If
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Ето и проекта на програмката, в който има и компилирано ехе:Primer.zip
След като напишеш задачката на C++ , бих се радвал да видя как изглежда сорса. Интересува ме от чисто академичен интерес.

редактиран от dreven на 27.10.17 11:48
dreamskill
Пет, 27.10.17, 16:51
 
#include <iostream>
 
using namespace std;
 
int main(int argc, char** argv) {
    int day = 0;
    int days[29];
    int min = 0;
    int min_day = 0;
    int total = 0;
    bool good_days[29];
 
    for (day = 0; day < 30; day++) {
        cout << "Въведете присъстващите студенти за ден " << day + 1 << endl;
        cin >> days[day];
        total += days[day];
        if (day > 0) {
            if (min > days[day]) {
                min = days[day];
                min_day = day;
            }
        } else {
            min = days[day];
        }
        if (days[day] > 12) {
            good_days[day] = true;
        } else {
            good_days[day] = false;
        }
    }
    cout << "Общо: " << total << endl;
    cout << "Най-малко студенти са дошли на ден " << min_day + 1 << " и са били " << min << " на брой." << endl;
    cout << "Дни с над 12 студенти: ";
    for (day = 0; day < 30; day++) {
        if (good_days[day]) {
            cout << day + 1 << ',';
        }
    }
 
    return 0;
}

Едно от решенията. От теб се изисква:
-да провериш дали въведеното е число, защото ако въведеш нещо друго освен int се прецаква;
-да промениш min_day в масив, за да може да показва повече дни, ако минималния брой студенти се повтаря;
-накрая като изброява дните с над 12 студенти, вместо последната запетая да се появи точка.

” Аз също не се занимавам със C++, но на Visual Basic 6.0 тази задачка се решава елегантно с няколко реда сорс.
За реализацията е необходимо само едно текстово поле и 3 броя Label, за визуализация:

Ето го и целия сорс:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim masiv(1 To 30), den, Min

Private Sub Form_Load()
Min = 1
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer) ' Въвеждаме студентите за 30 дни
    If KeyCode = 13 Then ' тоест при натискане на Enter
        den = den + 1 ' увеличаваме дните с един, започвайки от 0
        masiv(den) = Val(Text1.Text) ' Въвеждаме броя на студентите в масива
        Label1.Caption = den + 1 & " ден" ' Визуализираме следващия ден
        Me.Print den & " ден: " & Val(Text1.Text) ' Визуализираме въведените данни на формата
        Text1.Text = "" ' Изчистваме текстовото поле, подготвяйки го следващо въвеждане
        'определяме деня с най-малко студенти
        If masiv(den) <= masiv(Min) Then Min = den: Label2.Caption = "Минимален брой на " & Min & " ден"
        Label3.Caption = Val(Label3.Caption) + masiv(den) & " студенти общ брой" ' Общ брой студенти
        If masiv(den) > 12 Then Label4.Caption = Label4.Caption & den & "; "
        If den = 30 Then Text1.Visible = False: Label1.Visible = False 'скриваме полето за въвеждане и надписа за дните
        End If
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Ето и проекта на програмката, в който има и компилирано ехе:Primer.zip
След като напишеш задачката на C++ , бих се радвал да видя как изглежда сорса. Интересува ме от чисто академичен интерес. „

Твоята програма не показва минималния брой присъстващи студенти. Думата "студент" няма бройна форма за мн.ч. и се използва числителната форма ("студенти", а не "студента").
редактиран от dreamskill на 27.10.17 16:58
dreven
Пет, 27.10.17, 20:13
Да валидация на входните данни трябва да има, съгласен съм. Относно правописната грешка за думата студенти, също съм съгласен . Но не разбирам, защо трябва допълнителен масив? Нещо повече, чудя се защо изобщо съм използвал дори един масив, като масиви изобщо не са нужни. Навярно по инерция. Ето как виждам нещата още по-просто и елегантно. Без масиви, без цикли:
Dim den, Min, Student
 
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 13 Then
        On Error GoTo Alarm: If Text1.Text <> Int(Text1.Text) Then GoTo Alarm
        den = den + 1: Vavedeno = Val(Text1.Text)
        If den = 1 Then Student = Vavedeno: Min = 1: Label2.Caption = "Дни с минимално присъствие =>1;"
        Label1.Caption = den + 1 & " ден": Me.Print den & " ден: " & Vavedeno: Text1.Text = ""
        If Vavedeno < Student Then Min = den: Student = Vavedeno: Label2.Caption = "Дни с минимално присъствие =>" & Min & ";"
        If Vavedeno = Student And den <> Min Then Min = den: Student = Vavedeno: Label2.Caption = Label2.Caption & Min & ";"
        If Vavedeno > 12 Then Label4.Caption = Label4.Caption & den & "; "
        Label3.Caption = Val(Label3.Caption) + Vavedeno & " студенти общ брой."
        If den = 30 Then Text1.Visible = False: Label1.Visible = False
    End If
Exit Sub
Alarm: MsgBox "Трябва да въведете цяло число за брой студенти!", vbCritical, "Грешка при въвеждане": Text1.Text = ""
End Sub

Ето и новото по-просто проектче:Primer.zip

редактиран от dreven на 27.10.17 20:14
dinko89
Съб, 28.10.17, 12:11
Сега ти е нужно само да направиш Converter-ране :VB to C++ Converter
dinko89
Съб, 28.10.17, 12:19

RE: Помощ за C++ задача

#include <iostream>
 
using namespace std;
 
int main(int argc, char** argv) {
    int day = 0;
    int days[29];
    int min = 0;
    int min_day = 0;
    int total = 0;
    bool good_days[29];
 
    for (day = 0; day < 30; day++) {
        cout << "Въведете присъстващите студенти за ден " << day + 1 << endl;
        cin >> days[day];
        total += days[day];
        if (day > 0) {
            if (min > days[day]) {
                min = days[day];
                min_day = day;
            }
        } else {
            min = days[day];
        }
        if (days[day] > 12) {
            good_days[day] = true;
        } else {
            good_days[day] = false;
        }
    }
    cout << "Общо: " << total << endl;
    cout << "Най-малко студенти са дошли на ден " << min_day + 1 << " и са били " << min << " на брой." << endl;
    cout << "Дни с над 12 студенти: ";
    for (day = 0; day < 30; day++) {
        if (good_days[day]) {
            cout << day + 1 << ',';
        }
    }
 
    return 0;
}

А сега видях ,че дори го имаш и на С++
nik2009
Чет, 09.11.17, 09:06

RE: Помощ за C++ задача

” Ето и проекта на програмката, в който има и компилирано ехе:Primer.zip
След като напишеш задачката на C++ , бих се радвал да видя как изглежда сорса. Интересува ме от чисто академичен интерес. „
Ето и вариант на C++ който ми написаха.
#include <iostream>
 
using namespace std;
 
int main()
{
    int days[30];
 
 
    for (int i = 0; i < sizeof(days); i++)
    {
       cin >> days[i];
    }
 
    int minDay = days[0];
    int minimal = days[0];
    int attendance = 0;
    int over12 = 0;
 
    for (int i = 1; i < sizeof(days); i++)
    {
        if (days[i] < minimal)
        {
            minimal = days[i];
            minDay = i + 1;
        }
        else
        {
            minDay = 1;
        }
    }
 
    for (int i = 0; i < sizeof(days); i++)
    {
        attendance += days[i];
    }
 
    for (int i = 0; i < sizeof(days); i++)
    {
        if (days[i] > 12)
        {
            over12 += 1;
        }
 
    }
 
    cout << "Day with fewest attendance: Day " << minDay << " - " << minimal << " students" << endl;
    cout << "Attendance: " << attendance << endl;
    cout << "Days with over 12 students: " << over12 << endl;
    return 0;
}

Аз съм в началото още и изучавам C# и затова на C++ ми е мъгла. Благодаря на всички, за помощта, а пък за Конвертера чувам за пръв път и съм много благодарен, че ще върши работа за напред. Ще го пробвам.

dreven
Чет, 09.11.17, 18:52

RE: RE: Помощ за C++ задача

” Ето и вариант на C++ който ми написаха.
На пръв прочит на сорса виждам несъвпадения с условието на задачата.
- Да се изведе с цифри денят с най-малко присъстващи студенти и минималния брой присъстващи студенти
minDay трябва да ти даде денят с най- малко студенти. Представи си, че предпоследния ден са отишли най-малко студенти, а в последния най-много то IF-a ще ти даде minDay=1, а би трябвало да е 29.
В условието е написано: - да се изведат дните , в които са присъствали над 12 студенти
А при теб няма да се изведат конкретните дни, в които студентите са над 12, а ще се изведе колко на брой дни си имал студенти над 12.

Тези разсъждения ги правя само при четене на сорса и е възможно да греша. Все пак трябва да се стартира сорса и да се види реално какво прави.

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.