Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
1

Двухмерный массив с разными типами данных

09.12.2014, 19:25. Показов 5469. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе время суток.
Есть задание
Задание №4. Двумерные массивы. (5 сотрудников)
Есть информация о фамилии сотрудника, табельном номере и з\п (в месяц).
Вводим кол-во отработанных дней каждым сотрудником и выводим сколько ему нужно заплатить.

Пример:
Введите фамилию сотрудника:
Иванов
Количество отработанных дней:
10
Иванов 3645 (таб.номер) - 10500 руб.
Задание поменять нет возможности, да и самому доделать хочется.

Есть кое какие наработки, и тут же есть проблемы которые не могу решить.
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
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL,"Russian");
    string group[5][3];
    string name,days;
    unsigned int flags;
    unsigned int i,j;                   //vars for for
 
    /* Input data*/
        for(i=0;i<5;i++)
            {
                cout<<"Введите имя >>";getline(cin,group[i][0]);
                cout<<"Введите ID >>";getline(cin,group[i][1]);
                cout<<"Введите Зарплату >>";getline(cin,group[i][2]);
                cout<<"=====================================================\n";
            }                                                                       
    /*Strat user dialogs*/
        //retry:                                                                    //GOTO else false
        cout<<"Введите имя >>";cin>>name;
        cout<<"Введите колличество дней>>";cin>>days;
            /*Search in massive*/
                for(i=0;i<2;i++)
                    {
                        int flags_str=name.compare(group[i][0]);
                        cout<<flags_str<<endl;
                        if(flags_str=0)
                                flags=i;
                        else
                            {
                                cout<<"Такого работника нет в массиве\n";
                                goto retry; 
                            }
                
                    }
            /*End search in massive*/
            /*Payroll
        unsigned int a = atoi(group[flags][2]);                                 //string->char->int
        unsigned int pr=(/31)*days;
        */
    /*Input data about persone*/
                cout<<group[flags][0]<<"\t"<<group[flags][1];
 
    system("Pause");
    return 0;
}
1)проверка в if всегда выдает что нет такого человека в массиве(даже если flags=0), и если вводить две переменных совпадающим в массиве, тогда первое значение принимает 0, а второе -1.
Как все таки пройти проверку?
2)Как string преобразовать в int (может кто-то уже сталкивался с этим, и может подсказать куда копать).
3)Не по теме:зачем в ЯП ввели константу, если число забитое вручную уже константа?



P.S:если есть идеи как решить по другому данное задание, поделитесь пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.12.2014, 19:25
Ответы с готовыми решениями:

Массив с разными типами данных
Нужно создать массив, с разными типами данных т.е., чтобы пользователь мог сам определить тип...

Сделать статический массив с разными типами данных
Задача такова, есть ровно 60 магазинов. У каждого магазина по 6 параметров: 1) Адрес типа char 2)...

Массив с разными типами через memcpy()
Здравствуйте! Подскажите пожалуйста, как через memcpy() организовать массив с разными типам? Я...

Матрица с разными типами данных в ней
Мне нужно создать матрицу, которая содержала бы разные типы данных, содержащиеся, в ней. По сути...

23
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 19:29 2
= это присваивание. сравнение - это ==.
0
 Аватар для Scythian
59 / 59 / 12
Регистрация: 01.01.2010
Сообщений: 222
09.12.2014, 19:30 3
2.
C++
1
2
3
4
#include<stdlib.h>
.....................
string st;
int t=atoi(st.c_str());
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
09.12.2014, 19:32 4
Цитата Сообщение от ftp13 Посмотреть сообщение
1)проверка в if всегда выдает что нет такого человека в массиве
Цитата Сообщение от ftp13 Посмотреть сообщение
if(flags_str=0)
Это не сравнение, а присваивание. Знак сравнения на равенство: ==.
0
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
09.12.2014, 19:39  [ТС] 5
DrOffset, если ставить сравнивать в if, результат не меняется см.изображение. Если заменить в строке flags=i, тогда компилятор выдает ошибку (мол flags не объявлен).
Миниатюры
Двухмерный массив с разными типами данных  
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 19:48 6
ftp13, на первой итерации он находит совпадение, а на второй нет, соответственно выводит «не найден». Логика потерялась. Вероятно нужно прервать цикл после того, как нашли совпадение.
1
8 / 8 / 5
Регистрация: 19.11.2012
Сообщений: 438
09.12.2014, 19:51 7
ftp13, у меня похожая задача, кажись была, только там со структурами.
0
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
09.12.2014, 19:59  [ТС] 8
qozyre, да я тоже склоняюсь, что было бы лучше через структуры, но написано двухмеры, а переговорить с преподавателем нет возможности.

Добавлено через 4 минуты
DrOffset, да действительно надо было прервать цикл. Огромное спасибо.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 20:03 9
ftp13, в общем вот я тут подредактировал слегка.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    string group[5][3];
    string name,days;
    int flags;
    unsigned int i,j;                   //vars for for
 
    const int Count = 2;
 
    /* Input data*/
    for(i=0; i<Count; i++)
    {
        cout<<"Введите имя >>";
        getline(cin,group[i][0]);
        cout<<"Введите ID >>";
        getline(cin,group[i][1]);
        cout<<"Введите Зарплату >>";
        getline(cin,group[i][2]);
        cout<<"=====================================================\n";
    }
    /*Strat user dialogs*/
    retry:                                                                    //GOTO else false
    cout<<"Введите имя >>";
    cin>>name;
    cout<<"Введите колличество дней>>";
    cin>>days;
    /*Search in massive*/
    flags = -1;
    for(i=0;i<Count;i++)
    {
        int flags_str = name.compare(group[i][0]);
        if(flags_str == 0)
        {
            flags = i;
            break;
        }
    }
    if(flags == -1)
    {
        cout<<"Такого работника нет в массиве\n";
        goto retry;
    }
    /*End search in massive*/
    /*Payroll
    unsigned int a = atoi(group[flags][2]);                                 //string->char->int
    unsigned int pr=(/31)*days;
    */
    /*Input data about persone*/
    cout<<group[flags][0]<<"\t"<<group[flags][1] << '\n';
 
    system("Pause");
    return 0;
}
0
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
09.12.2014, 20:11  [ТС] 10
DrOffset, спасибо за идею, это на много лучше, чем завершение программы если человек не найден
Пойду дальше с бубном и костылями танцевать на типах данных.
0
8 / 8 / 5
Регистрация: 19.11.2012
Сообщений: 438
09.12.2014, 20:15 11
ftp13,
Цитата Сообщение от ftp13 Посмотреть сообщение
Пойду дальше с бубном и костылями танцевать на типах данных.
я помню, правда давно уже, использовал, кажись, вот такую штуку
C++
1
2
3
4
5
6
7
8
9
10
11
#include <string>
#include <stdlib.h>
int main()
{ 
    string S="74";
    int N;
    
    n = atoi(S.c_str());
 
    return 0;
}
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 20:32 12
ftp13, да, не по теме добавлю: я не стал там исправлять, но использовать goto для прыжков назад по коду не очень хорошо. Для этого есть циклы.
Цитата Сообщение от ftp13 Посмотреть сообщение
Не по теме:зачем в ЯП ввели константу, если число забитое вручную уже константа?
Константа - это абстракция. Средство контроля кода. Чтобы возложить на компилятор сохранение целостности значения и предоставить возможность определенных оптимизаций. Именованная константа дает возможность оперировать именем, а не значением. Имя проще искать, менять значение тоже нужно будет только в одном месте и т.д. Это такое же средство упрощения программирования, как и остальные инструменты: функции, массивы и т.п.
0
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
09.12.2014, 20:51  [ТС] 13
DrOffset, при вашем варианте вылетает ошибка на уровне ниже (см.изображение 2).
qozyre. Спасибо, ваш вариант подошёл, не думал что такой костыльный подход будет таким легким.
Миниатюры
Двухмерный массив с разными типами данных  
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 21:00 14
Цитата Сообщение от ftp13 Посмотреть сообщение
при вашем варианте вылетает ошибка на уровне ниже (см.изображение 2).
А код такой же остался или ты его изменял?
0
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
09.12.2014, 21:16  [ТС] 15
DrOffset, и ваш вариант, и мой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(i=0;i<2;i++)
                    {
                        int flags_str=name.compare(group[i][0]);
                        if(flags_str==0)
                            {
                                flags = i;
                                break;
                            }
                    }
                        if((flags == -1)||(flags==1))
                            {
                                cout<<"Такого работника нет в массиве\n";
                                goto retry;
                            }
С чем это связано я не выявил, решается если вернуть обратно в цикл и заменой 2-ого if на else.
На счёт goto, я не совсем помню статью(помню что это не этично), но запретный плод так сладок.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 21:23 16
ftp13, давай-ка ты скинешь именно тот код, который падает (полностью) и заодно набор входных данных. Гадание оставим гадалкам
0
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
09.12.2014, 21:37  [ТС] 17
DrOffset,ок.
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL,"Russian");
    string group[5][3];
    string name;
    unsigned int flags,days;
    unsigned int i;                 //vars for for
 
    /* Input data*/
        for(i=0;i<2;i++)
            {
                cout<<"Введите имя >>";getline(cin,group[i][0]);
                cout<<"Введите ID >>";getline(cin,group[i][1]);
                cout<<"Введите Зарплату >>";getline(cin,group[i][2]);
                cout<<"=====================================================\n";
            }                                                                       
    /*Strat user dialogs*/
        retry:                                                                  //GOTO else false
        cout<<"Введите имя >>";cin>>name;
        cout<<"Введите колличество дней>>";cin>>days;
            /*Search in massive*/
                for(i=0;i<2;i++)
                    {
                        int flags_str=name.compare(group[i][0]);
                        if(flags_str==0)
                            {
                                flags = i;
                                break;
                            }
                    }
                        if(flags == -1)
                            {
                                cout<<"Такого работника нет в массиве\n";
                                goto retry;
                            }
 
            /*End search in massive*/
            /*Payroll*/
        unsigned int a = atoi(group[flags][2].c_str());                         //string->int
        unsigned int pr=(a/31)*days;
        
    /*Output data about persone*/
        system("cls");                                                          //clear screen
                cout<<"Имя="<<group[flags][0]<<";";
                cout<<"ID="<<group[flags][1]<<";";
                cout<<"Надо выплатить="<<pr<<";"<<endl;
 
    system("Pause");
    return 0;
}

Кликните здесь для просмотра всего текста

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
#include "stdafx.h"
#include <iostream>
#include <string>
 
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL,"Russian");
    string group[5][3];
    string name;
    unsigned int flags,days;
    unsigned int i;                 //vars for for
 
    /* Input data*/
        for(i=0;i<2;i++)
            {
                cout<<"Введите имя >>";getline(cin,group[i][0]);
                cout<<"Введите ID >>";getline(cin,group[i][1]);
                cout<<"Введите Зарплату >>";getline(cin,group[i][2]);
                cout<<"=====================================================\n";
            }                                                                       
    /*Strat user dialogs*/
        retry:                                                                  //GOTO else false
        cout<<"Введите имя >>";cin>>name;
        cout<<"Введите колличество дней>>";cin>>days;
            /*Search in massive*/
                for(i=0;i<2;i++)
                    {
                        int flags_str=name.compare(group[i][0]);
                        if(flags_str==0)
                            {
                                flags = i;
                                break;
                            }
                    }
                        if((flags == -1)||(flags == 1))
                            {
                                cout<<"Такого работника нет в массиве\n";
                                goto retry;
                            }
 
            /*End search in massive*/
            /*Payroll*/
        unsigned int a = atoi(group[flags][2].c_str());                         //string->int
        unsigned int pr=(a/31)*days;
        
    /*Output data about persone*/
        system("cls");                                                          //clear screen
                cout<<"Имя="<<group[flags][0]<<";";
                cout<<"ID="<<group[flags][1]<<";";
                cout<<"Надо выплатить="<<pr<<";"<<endl;
 
    system("Pause");
    return 0;
}

1-ый ваш вариант,2-ой мой.
Вх.данный:
1)lion 5 31000
2)sergey 6 9000
3)dmitriy 5(пять количество отработанных дней)
Диалоговое окно:
Первый этап обработки исключения по адресу 0x002756F6 в task_4.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x34102C64.
P.S:юзаю Visual Studio Ultimate 2012 v.11.0.61030.00 Update 4.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 21:52 18
ftp13, все ясно. Конечно же мой вариант тут не при чем. В нем все правильно.
flags = -1; перед циклом-то ты забыл поставить?
0
 Аватар для ftp13
3 / 3 / 2
Регистрация: 18.10.2012
Сообщений: 101
09.12.2014, 22:04  [ТС] 19
DrOffset я не уверен, но возможно ошибка не в этом, а в том что мы запутались в переменных.
flags_str - переменная для проверки на совпадения, а flags - переменная указывающая элемент в массиве, а так как мы указываем на положение в массиве оно не может быть отрицательным, поэтому я объявил её без знаковым. А тут еще и проверка которая пытается проверить её на отрицательное число.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
09.12.2014, 22:21 20
Цитата Сообщение от ftp13 Посмотреть сообщение
я не уверен, но возможно ошибка не в этом, а в том что мы запутались в переменных.
Понимаешь ли. Ты невнимательно преписал мой пример. Я там произвел некоторые изменения, которые сделали этот код корректным, а ты часть изменений себе не внес. В этом и ошибка. Если я что-то там исправил, то это не просто так.
Посмотри еще раз внимательно на мой пример под спойлером. Переменная flags там - знаковая! Перед поиском мы выставляем ее в -1, обозначая признак отсутствия совпадений. Если по ходу цикла мы ни разу не вошли в if, то после цикла сработает проверка на -1 и мы вернемся к началу ввода. Таким образом проверка на -1 защищает дальнейший код от обращения по -1 индексу. Ты же нарушил это, не до конца переписав мой код, и получил это самое обращение в строке 46. Отсюда падение.
Естественно я проверял свой код перед тем как постить сюда, и уверен в нем на 300%.

Добавлено через 7 минут
Почему выставляем в -1? Потому что все остальные значения могут быть корректными индексами, и только -1 в данном случае не может. Можно было поступить другим образом, например брать индекс элемента, следующий за последним. Если всего элементов 3, то 3 - может обозначать некорректный индекс. Тогда можно оставить беззнаковый int. Но в этом случае все равно нужно выставить flags перед поиском, чтобы проверка после цикла могла срабатывать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
flags = 3;
for(.......) // цикл поиска
{
    if(проверка на совпадение имени)
    {
        flags = i;
    }
}
if(flags == 3)
{
   // отправляемся в начало ввода имени
}
0
09.12.2014, 22:21
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2014, 22:21
Помогаю со студенческими работами здесь

Реализация Fifo с разными типами данных
Доброго времени суток! Задача следующая: Есть абстрактный класс CData, от него наследуются...

Переписать программу с разными типами данных
Тема: Использование указателей для работы со сложными типами данных Вот я хочу чтобы мне помогли...

Работа с указателями на функции, разными типами данных
Здравствуйте. Согласно заданию, я создаю указатели на функции следующего вида: int (*func1)(int...

Список с разными типами данных, унаследованным от одного
Доброго времени суток! У меня имеются унаследованные классы от одного , так же имеется...

Работа с указателями на функции, разными типами данных
С++ Что означает запись: float float (*func4(double)(void));? Помогите пожалуйста! Дано такое в...

Итератор для двусвязного списка с разными типами данных
Задание было: составить двусвязный список с возможностью добавления,редактирования и удаления...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Когда лучше использовать LinkedList вместо ArrayList в Java
bytestream 28.01.2025
При разработке Java-приложений выбор правильной структуры данных играет ключевую роль в обеспечении эффективности и производительности программы. ArrayList и LinkedList являются двумя. . .
Какой ответ HTTP лучше использовать: 403 Forbidden или 401 Unauthorized, когда недостаточно прав
bytestream 28.01.2025
В современной веб-разработке правильная обработка ошибок и точное информирование клиентов о статусе их запросов играют критическую роль в создании надежных и безопасных приложений. Особое внимание. . .
Как получить список всех файлов коммита в Git
bytestream 28.01.2025
Система контроля версий Git представляет собой мощный инструмент для управления изменениями в программном коде и других файлах проекта. В основе работы Git лежит концепция коммитов - снимков. . .
Как записать только часть изменений файла в Git
bytestream 28.01.2025
В процессе разработки программного обеспечения часто возникает необходимость сохранить только определенные изменения из множества внесенных правок в файлах. Система контроля версий Git предоставляет. . .
[golang] 80. Remove Duplicates from Sorted Array II
alhaos 28.01.2025
В предоставленном упорядоченном по возрастанию целочисленном слайсе, оставить уникальные элементы полюс один возможный дубликат. Вернуть количество таких элементов. / / . . .
Что такое внедрение зависимостей и для чего оно применяется
bytestream 27.01.2025
В современной разработке программного обеспечения одной из ключевых проблем является управление зависимостями между различными компонентами системы. Внедрение зависимостей (Dependency Injection, DI). . .
Как установить cellpadding и cellspacing в CSS
bytestream 27.01.2025
При создании веб-страниц с табличными данными разработчики часто сталкиваются с необходимостью правильного оформления внутренних и внешних отступов в таблицах. В традиционной разметке HTML для этих. . .
Чем отличаются public, protected, package-private и private в Java
bytestream 27.01.2025
В языке программирования Java механизм модификаторов доступа играет ключевую роль в реализации одного из фундаментальных принципов объектно-ориентированного программирования - инкапсуляции. . . .
Зачем нужно explicit в C++. Преобразование типов
bytestream 27.01.2025
В мире программирования на C++ управление преобразованием типов данных играет crucial роль в создании надежного и безопасного кода. Язык C++ предоставляет множество механизмов для контроля над. . .
Как создать удалённую (remote) ветку в Git
bytestream 27.01.2025
Система контроля версий Git стала неотъемлемой частью современной разработки программного обеспечения, предоставляя разработчикам мощные инструменты для управления кодовой базой. Одним из ключевых. . .
Как создать утечку памяти в Java
bytestream 27.01.2025
Утечка памяти в Java представляет собой ситуацию, когда программа неэффективно использует доступную память, удерживая ссылки на объекты, которые больше не нужны для работы приложения. Несмотря на. . .
КуМир: как решать задачи на числа
bytestream 27.01.2025
КуМир (Комплект Учебных МИРов) представляет собой уникальную образовательную среду программирования, разработанную специально для обучения основам алгоритмизации и программирования. Эта система. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru