1

Тема: Структури

Маю поставлене завдання: "Відібрати працівників, зарплатня яких більше середнього значення зарплатні всіх працівників".
Програма начебто працює, але виводить в кінці ще й сміття. Можете підказати, де допустила помилку?

#include <iostream>
#include <stdio.h>    
using namespace std;
struct Workers     //оголошення та визначення структури працівників
{
    char Surname[30]; //прізвище        
    char Position[30];    //посада    
    char Education[30]; //освіта
    int Year_Birth; //рік народження
    float Salary; //зарплата
};
int main()
{
    setlocale(LC_CTYPE, "ukr");
    Workers s[10];
    char c;
    int i, kol = 0;
    float k=0;
    printf("Ви починаєте заповнювати таблицю!\r\n");
    printf("Введiть кiлькiсть працiвникiв -  ");
    cin>>kol;
    cout << "Введiть почергово рядки з вiдомостями про " << kol<< " працiвники(iв):\nПрiзвище   Посада   Освiта   Рiк народження   Зарплата" << endl;
    setlocale(LC_ALL, ".OCP");
    for (i = 0; i < kol; i++)
    {
        cin>> s[i].Surname>> s[i].Position >> s[i].Education >> s[i].Year_Birth >> s[i].Salary;
        k+= s[i].Salary;
    }
    float SerSal = 0;
    setlocale(LC_CTYPE, "ukr");
    printf("\nВибранi працiвники:  \nПрiзвище   Посада   Освiта   Рiк народження   Зарплата");   
    setlocale(LC_ALL, ".OCP");
    SerSal = k / kol;
    for (int i = 0; i < kol; i++)
    {
        if (SerSal < s[i].Salary)
        {
            cout<< s[i].Surname<<"\t\t"<< s[i].Position << "\t\t" << s[i].Education << "\t\t" << s[i].Year_Birth << "\t\t" << s[i].Salary<<endl;
        }
        else
            cout << "Умова не задовiльняється"<<endl;
    }
    system("pause>>void");
    return 0;
}

2

Re: Структури

Можете показати це сміття? Ніби не має бути, ще й в _кінці_.

3

Re: Структури

https://replace.org.ua/uploads/images/9628/7a60928dbebf432cfe5e65b54defac46.png



і ще одне питання.. можна якось вирівняти ці стовпчики? чи це просто за допомогою \t?

4

Re: Структури

Це не сміття. Це "Умова не задовiльняється" в неправильному кодуванні.

Подякували: Akos_Bond1

5

Re: Структури

Загалом:
- залишіть або <cstdio> (<stdio.h> - це взагалі з мови C) і printf, або <iostream> і cout. Два одночасно - зло.
- якщо вам потрібно, використовуйте лише один виклик setlocale. Але краще забийте. Всі ці танці з бубном навколо кодувань у часи Unicode - однозначне зло. Щоб розібратися в роботі механізмів мови програмування, вистачить і англійської.
- не викладайтеся при розробці красивого інтерфейсу в консолі в навчальних завданнях. Якщо вам потрібна краса - робіть GUI, зараз 2020 рік на дворі.
= system("pause") - антипатерн. Одна ця команда виконує дії, значно складніші за весь ваш код. Не кажу вже про те, що в командному рядку Windows void - це просто ім'я файлу. Ви, мабуть, хотіли nul написати.

Подякували: leofun011

6

Re: Структури

koala написав:

Загалом:
- залишіть або <cstdio> (<stdio.h> - це взагалі з мови C) і printf, або <iostream> і cout. Два одночасно - зло.
- якщо вам потрібно, використовуйте лише один виклик setlocale. Але краще забийте. Всі ці танці з бубном навколо кодувань у часи Unicode - однозначне зло. Щоб розібратися в роботі механізмів мови програмування, вистачить і англійської.
- не викладайтеся при розробці красивого інтерфейсу в консолі в навчальних завданнях. Якщо вам потрібна краса - робіть GUI, зараз 2020 рік на дворі.
= system("pause") - антипатерн. Одна ця команда виконує дії, значно складніші за весь ваш код. Не кажу вже про те, що в командному рядку Windows void - це просто ім'я файлу. Ви, мабуть, хотіли nul написати.

Дуже дякую за такі поради. Знаєте, найбільше, що мене дивує, це те, що в методичках до лабораторних робіт в прикладах використовують одночасно  printf i cout. А про багаторазове застосування setlocale виділено декілька абзаців.

7 Востаннє редагувалося koala (15.04.2020 13:42:07)

Re: Структури

Командний рядок Windows переповнений старими невдалими концепціями та рішеннями; спроби змусити його працювати як слід я спостерігаю, скільки себе пам'ятаю, і так нічого без милиць не працює. Але те, що я тут бачу, не має працювати, окрім як у досить специфічних системах.

setlocale(LC_CTYPE, "ukr");

LC_CTYPE впливає, як випливає з назви, на функції з бібліотеки <ctype>. Якими тут не користуються. А рядка "ukr" немає в документації, і покладатися на те, що система його зрозуміє, не варто. Втім, можливо, що й не розуміє, ви ж не використовуєте тут <ctype>.

setlocale(LC_ALL, ".OCP");

Взагалі чудово - кодова сторінка OEM, виробника обладнання. Ця програма буде по-різному працювати на комп'ютері, купленому в Україні і в Польщі (якщо купували з системою). Більше багів для бога багів!
І при всьому цьому ви вживаєте в коді латинську "i". Чомусь всі ці танці з бубном не допомагають навіть кириличну літеру "i" вивести.

Подякували: leofun011