Форум программистов, компьютерный форум CyberForum.ru

Написать программу, которая вводит информацию и печатает самое распространенное женское имя - C++

Восстановить пароль Регистрация
 
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
05.02.2014, 13:59     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #1
Прошу помощи, болит голова х)
Задача:
На основе таблицы, содержащей следующую информацию о группе студентов некоторого вуза (фамилия, имя, отчество, пол, возраст, курс) написать программу, которая вводит эту информацию и печатает самое распространенное женское имя.

Реализовал так:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <conio.h>
#include <locale.h>
#include <iostream>
#include <string>
using namespace std;
 
struct group
{
    string name;
    string surname;
    string father;
    char sex;
    int age;
    int course;
};
 
int main()
{
    int k=0, max=0, imax=0, i, j, n;
    setlocale(LC_ALL, "Rus");
    cout << "Введите количество студентов в группе: ";
    cin >> n;
    cout << endl;
    group *kit = new group [n]; // Массив структур со всеми описаниями для каждого ученика
    int *fnam = new int [n]; // Массив с количеством совпадений для каждого имени
    for (i=0; i<n; i++)
        fnam[i]=0;
    string *femnames = new string [n]; // Собственно массив с женскими именами, индексы которого будут
    for (i=0; i<n; i++)                // совпадать с индексами количества совпадений (массив выше)
    {
        cout << "Введите имя " << i+1 << " студента: ";
        cin >> kit[i].name;
        cout << "Введите фамилию " << i+1 << " студента: ";
        cin >> kit[i].surname;
        cout << "Введите отчество " << i+1 << " студента: ";
        cin >> kit[i].father;
        cout << "Введите пол " << i+1 << " студента (м или ж): ";     // Ввод данных
        cin >> kit[i].sex;
        cout << "Введите возраст " << i+1 << " студента: ";
        cin >> kit[i].age;
        cout << "Введите номер курса " << i+1 << " студента: ";
        cin >> kit[i].course;
        cout << endl;
        system("cls");
    }
    for (j=0; j<n; j++) // Как бы проходимся по массиву kit с описаниями учеников
    {
        if (kit[j].sex=='ж') // Если особь женского пола, то...
        {
            if (k>0)
            {
                for (i=0; i<k; i++) // Проходимся по массиву с женскими именами
                {
                    if (femnames[i]==kit[j].name) // Если очередное имя девушки из списка совпало с именем девушки в массиве "для девушек"
                        fnam[i]++; // То в массив, считающий совпадения, добавляем единицу
                    else
                    {
                        femnames[k]=kit[j].name; // Иначе, если не совпадает, то записать как новое имя в наш "женский" массив
                        fnam[k]=1; // И счётчику этого имени присвоить единицу
                    }
                }
                k++; // Прибавим "мнимую" размерность массиву с женскими именами
            }
            else
            {
                k=1; // Инициализация массива с женскими именами
                femnames[0]=kit[j].name;
            }
        }
    }
    for (i=0; i<k; i++) // Прочёсываем массив с женскими именами до мнимой размерности k
    {
        if (fnam[i]>max) // Ищем индекс максимального значения
        {
            max=fnam[i];
            imax=i;
        }
    }
    cout << endl << "Наиболее распространённое женское имя: " << femnames[imax] << endl;  // Выводим значение из масива женских имён с индексом
    system("pause");                                                                     // максимального значения из массива с количеством совпадений
    return 0;
}
Проблема:
Программа не выводит никакого значения.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2014, 13:59     Написать программу, которая вводит информацию и печатает самое распространенное женское имя
Посмотрите здесь:

C++ Составить программу, которая вводит с клавиатуры имя и год рождения лица и выводит на экран "Привет Имя, тебе Р лет:).
Напишите программу, которая вводит число из пяти цифр, разделяет число на отдельные цифры и печатает их отдельно друг от друга C++
C++ Структуры (вычислить самое распространенное женское имя)
написать программу, которая вводит число из 4 цифр, разделяет число на отдельные цифры и печатает их отдельно друг от друга. например если введенное ч C++
Написать программу, которая вводит номер некоторого года и печатает его название по старояпонскому календарю C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
05.02.2014, 14:28     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #2
Цитата Сообщение от G_ Посмотреть сообщение
(kit[j].sex=='ж')
'ж' русский символ, а как я понял sex это char и там нет рус.символов, надо unsigned char

Добавлено через 1 минуту
хотя бред
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
05.02.2014, 14:31     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #3
Вы запутались с кодировками.
setlocale(LC_ALL, "Rus");
устанавливает кодовую таблицу 1251 для вывода.
А данные вводятся в кодах 866 таблицы.
Поэтому, при выводе и сравнении таких данных надо использовать 866 таблицу
setlocale(LC_ALL, ".866");
Или переводить их в 1251 с помощью функции
BOOL OemToChar( LPCTSTR lpszSrc, LPSTR lpszDst );
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
05.02.2014, 14:31     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #4
Цитата Сообщение от aLarman Посмотреть сообщение
'ж' русский символ, а как я понял sex это char и там нет рус.символов, надо unsigned char

Добавлено через 1 минуту
хотя бред
Либо wchar_t, либо, что еще лучше, макрос TCHAR (tchar.h).
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
06.02.2014, 11:45  [ТС]     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #5
попробовал всё вышеперечисленное, не помогло... грешу на часть программы с условиями D:
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.02.2014, 12:35     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от G_ Посмотреть сообщение
грешу на часть программы с условиями
так и есть, немного исправил, прошу заметить пол вводить f - female или m - male
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <conio.h>
#include <locale.h>
#include <iostream>
#include <string>
using namespace std;
 
struct group
{
    string name;
    string surname;
    string father;
    unsigned char sex;
    int age;
    int course;
};
 
int main()
{
    int k=0, max=0, imax=0, i, j, n;
    setlocale(LC_ALL, "Rus");
    cout << "Введите количество студентов в группе: ";
    cin >> n;
    cout << endl;
    group *kit = new group [n]; // Массив структур со всеми описаниями для каждого ученика
    int *fnam = new int [n]; // Массив с количеством совпадений для каждого имени
    for (i=0; i<n; i++)
        fnam[i]=0;
    string *femnames = new string [n]; // Собственно массив с женскими именами, индексы которого будут
    for (i=0; i<n; i++)                // совпадать с индексами количества совпадений (массив выше)
    {
        cout << "Введите имя " << i+1 << " студента: ";
        cin >> kit[i].name;
        cout << "Введите фамилию " << i+1 << " студента: ";
        cin >> kit[i].surname;
        cout << "Введите отчество " << i+1 << " студента: ";
        cin >> kit[i].father;
        cout << "Введите пол " << i+1 << " студента (m или f): ";     // Ввод данных
        cin >> kit[i].sex;
        cout << "Введите возраст " << i+1 << " студента: ";
        cin >> kit[i].age;
        cout << "Введите номер курса " << i+1 << " студента: ";
        cin >> kit[i].course;
        cout << endl;
        system("cls");
    }
    for (j=0; j<n; j++) // Как бы проходимся по массиву kit с описаниями учеников
    {
        if (kit[j].sex=='f') // Если особь женского пола, то...
        {
            if(k>0)
            {
                bool bNameFinded = false;
                for (int i = 0; i<k; i++) // Проходимся по массиву с женскими именами
                {
                    if (femnames[i]==kit[j].name) // Если очередное имя девушки из списка совпало с именем девушки в массиве "для девушек"
                    {
                        fnam[i]++; // То в массив, считающий совпадения, добавляем единицу
                        bNameFinded = true;
                        break;
                    }
                }
                if(!bNameFinded)
                {
                    femnames[k]=kit[j].name; // Иначе, если не совпадает, то записать как новое имя в наш "женский" массив
                    fnam[k]=1; // И счётчику этого имени присвоить единицу
                    k++;
                }
            }
            else
            {
                femnames[k] = kit[j].name;
                fnam[i]++;
                k++;
            }
        }
    }
    for (i=0; i<k; i++) // Прочёсываем массив с женскими именами до мнимой размерности k
    {
        if (fnam[i]>max) // Ищем индекс максимального значения
        {
            max=fnam[i];
            imax=i;
        }
    }
    cout << endl << "Наиболее распространённое женское имя: " << femnames[imax] << endl;  // Выводим значение из масива женских имён с индексом
    system("pause");                                                                     // максимального значения из массива с количеством совпадений
    return 0;
}
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
07.02.2014, 04:41  [ТС]     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #7
aLarman, Спасибо, вы лучший!) всё работает, если вводить данные на английской раскладке!

Только вот в части с инициализацией массива с женскими именами
C++
1
2
3
4
5
6
else
            {
                femnames[k] = kit[j].name;
                fnam[i]++;
                k++;
            }
Должно быть:
C++
1
2
3
4
5
6
else
            {
                femnames[k] = kit[j].name;
                fnam[k]++;
                k++;
            }
потому что в переменной i остаётся n размерность массива и мы прибавляем к счётчику женских имён +1 в последнюю ячейку х)
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
07.02.2014, 09:23     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #8
G_,
Цитата Сообщение от G_ Посмотреть сообщение
Должно быть:
эх сплоховал хД
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
07.02.2014, 09:47     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #9
омг... сделайте поле пол булевым и не парьтесь
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
07.02.2014, 09:49     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #10
Firework, слишком просто
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
07.02.2014, 09:51     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #11
Цитата Сообщение от aLarman Посмотреть сообщение
Firework, слишком просто
а зачем всё усложнять?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
07.02.2014, 19:03     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #12
Ну и, наконец, чтобы русские имена выводились правильно, конец программы сделайте такой
C++
1
2
3
4
5
    cout << endl << "Наиболее распространённое женское имя: ";
    setlocale(LC_ALL, ".866");
    cout<< femnames[imax] << endl;
    system("pause");                                                                     
    return 0;
G_
0 / 0 / 0
Регистрация: 23.11.2013
Сообщений: 17
13.02.2014, 16:21  [ТС]     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #13
zss, спасибо, а не подскажете, как мне сделать так, чтобы в поле для пола можно было вводить не "f" или "m", а "ж" или "м"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 22:12     Написать программу, которая вводит информацию и печатает самое распространенное женское имя
Еще ссылки по теме:

C++ Написать программу, которая вводит две даты в формате «дд.мм.гг»
C++ Написать программу, которая будет добавлять в текстовый файл введенную с клавиатуры информацию.З клавиатуры вводится имя компании, год основания
Найти самое распространенное женское имя среди имен массива C++

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
13.02.2014, 22:12     Написать программу, которая вводит информацию и печатает самое распространенное женское имя #14
C++
1
OemToChar(stringfrom,stringto);
функция, которая переводит из кодировки 886(консоль) в 1251(windows).
Или, наоборот, вечно путаю с
C++
1
CharToOem(stringfrom,stringto);
Yandex
Объявления
13.02.2014, 22:12     Написать программу, которая вводит информацию и печатает самое распространенное женское имя
Ответ Создать тему
Опции темы

Текущее время: 07:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru