Задать вопрос
@DarkFatal1ty

Как сравнивать значения строки в структуре на языке С++?

Здравствуйте.
В данный момент, Я активно изучаю плюсы и столкнулся с проблемой в ходе решения институтской задачи: требуется из структуры выбрать сотрудников с высшим образованием, и рассчитать их процент от общего количества. Там еще несколько функций в программе, которые работают нормально. Имею проблему только с решением этой части. И проблема заключается в том, что результат после прохождения цикла негативный, и все сотрудники без высшего образования. Что я делаю не так? Или я попросту неправильно выполняю сравнение строк?
Собственно код:

#include "stdafx.h"
#include "iostream"
#include "math.h"
#include "string"
#include "stdio.h"

using namespace std;



int main()
{

	struct employees {
		char surname[20], position[10], education[20];
		int birth, salary;
	};

	int count = 0;
	cout << "Input the quantity of employees - " << endl;
	cin >> count;
	employees *z = new employees[count];
	cout << "Input rows with information about of " << count << " employees:" << "\nSurname Position Education Age Salary" << endl;
	for (int i = 0; i < count; i++)
		scanf("%s %s %s %i %i", z[i].surname, z[i].position, z[i].education, &z[i].birth, &z[i].salary);

	//under30 
	cout << "Employees under age 30: " << endl;
	int age30 = 0;

	for (int i = 0; i < count; i++)

		if (z[i].birth <= 30) {
			age30++;
			printf("%s %s %s %i %i\n", z[i].surname, z[i].position, z[i].education, z[i].birth, z[i].salary);

		}
	cout << endl << "Amount of employees under 30: " << age30 << endl;

	<b>//highedu
	int percent = 0;
	int masters = 0;
	int dumbs = 0;

	for (int i = 0; i < count; i++) {
		if (z[i].education == "master" || z[i].education == "specialist" || z[i].education == "bachelor") {
			masters = masters + 1;
		}
		else if (z[i].education != "master" || z[i].education != "specialist" || z[i].education != "bachelor") {
			dumbs++;
		}
	}
		
	percent = (count * 100) / masters;
	
	cout << "Percent of the employees with the high education: " << percent << "%" << endl;
	cout << "Count of the employees with the high education: " << masters << endl;;
	cout << "Count of the dumb employees: " << dumbs << endl;</b>
	//oldyoung
	char nameoldest[22];
	char nameyoungest[22];
	int ageoldest = 0;
	int ageyoungest = 30;

	for (int i = 0; i < count; i++) {
		//young
		if (z[i].birth >= ageyoungest) {
			ageyoungest = z[i].birth;
			strcpy(nameyoungest, z[i].surname);
		}
		else if (z[i].birth >= ageoldest) {
			ageoldest = z[i].birth;
			strcpy(nameoldest, z[i].surname);
		}
	}

	cout << endl << "Oldest employee: " << nameyoungest << " with age:" << ageyoungest << endl;
	cout << endl << "Youngest employee: " << nameoldest << " with age:" << ageoldest << endl;

	//salary
	int avgsalary = 0;
	int savg = 0;

	for (int i = 0; i < count; i++) 
	savg = (savg + z[i].salary) / count;
	
	cout << "Average salary: " << savg << endl;;
	cout << "Employees, with the salary more than average" << endl;
	
	
	for (int i = 0; i < count; i++)
			if (z[i].salary >= savg) {
			printf("%s %s %i\n", z[i].surname, z[i].position, z[i].salary);
		}

	

	system("pause");
	return 0;
}


Жду советов по решению данной проблемы. Заранее всем спасибо.
  • Вопрос задан
  • 630 просмотров
Подписаться 1 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 3
GavriKos
@GavriKos
Строки как массив char-ов в с/с++ сравниваются функцией strcmp. У вас я ее не вижу.
А вообще использовать строку для образования - ну как то странно. Используйте например enum - у вас же набор значений все равно четко определен.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
1. У вас неверное условие (z[i].birth >= ageyoungest).
2. Никакой защиты от переполнения буфера в scanf.
3. Идентификатор birth реально означает возраст. Плохо.
4. Неверное условие
if (z[i].education == "master" || z[i].education == "specialist" || z[i].education == "bachelor")
. Для массивов это просто сравнение адреса массива с адресом вкомпилированной в программу строчки, что автоматически даёт false. Используйте str(n)cmp.
5. Излишнее условие
else if (z[i].education != "master" || z[i].education != "specialist" || z[i].education != "bachelor")
. Оно автоматически выполнено.
6. Отсутствует delete[] employees;
Ответ написан
Комментировать
@DarkFatal1ty Автор вопроса
Я решил отказаться от столь массивной проверки, и теперь при помощи переменной и указателя добился ее работы. Но что-то я наблюдаю порчу данных в проверка на младшего и старшего. Что там может быть не так?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы