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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
fenix117
8 / 8 / 1
Регистрация: 16.03.2011
Сообщений: 249
#1

Как заполнить вектор в структуре? - C++

12.07.2011, 11:57. Просмотров 2148. Ответов 6
Метки нет (Все метки)

как заполнить вектор в структуре??
C++
1
2
3
4
struct pupil
{
   vector <string> a;
}
я делал так:
C++
1
pupil f; f.a.push_back("qwerty");
что не правильно, подскажите как надо
P.S. Пытался сделать массив строк
C++
1
2
3
4
struct pupil
{
   string a[5];
}
Но строка есть массив символов, я так понял, что я задал строку фиксированного размера, тк когда я присвоил нулевому элементу строку "qwerty" я ждал что будет a[0]=="qwerty" а стало a[0]=='q', a[1]=='w', a[2]=='e', a[3]=='r', a[4]=='t', a[5]=='y', где a[0,1,2,3,4,5] имели тип char
Тут у меня большая каша в голове, разъясните плиз, может я не прав.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2011, 11:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как заполнить вектор в структуре? (C++):

Как заполнить вектор с клавиатуры? - C++
#include&lt;iostream&gt; #include&lt;vector&gt; using namespace std; int main() { vector&lt;int&gt; myVector; int a; cin &gt;&gt; a; for (int i =...

Как через push_back заполнить вектор векторов? - C++
Как через push_back заполнить вектор векторов? просто вектор например так: for(int i=0;i&lt;100;i++) m.push_back(rand()/100);...

2d вектор , как заполнить, если он стоит в функции - C++
void findconnection(vector&lt;vector&lt;int&gt;&gt; &amp;distanceBetweenEachNodeInMinute, vector&lt;vector&lt;int&gt;&gt;&amp;matrix) - функция. for (int i = 0; i &lt;...

Вектор структур, как заполнить определенное поле - C++
Есть вектор структур. В структуре несколько элементов. Заполнил вектор нужными мне элементами, теперь нужно у одного элемента изменить...

Как заполнить вектор строк до выполнения функции main? - C++
Друзья! Выход-то есть, но он корявенький. Создаю класс, объект этого класса, и в конструкторе заполняю вектор. И всё это до вызова main ();...

Как рандомно заполнить вектор? Не могу найти ошибку - C++
Вот код, в консоли выдаёт &quot;Не является внутренней или внешней командой&quot; #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; ...

6
Alexanches
86 / 7 / 1
Регистрация: 04.06.2010
Сообщений: 80
12.07.2011, 12:00 #2
Так можно же сделать обычный двумерный массив?
1
olympian
2 / 2 / 0
Регистрация: 18.10.2008
Сообщений: 33
12.07.2011, 12:04 #3
Цитата Сообщение от fenix117 Посмотреть сообщение
Код C++
1
2
3
4
struct pupil
{
* *string a[5];
}
Но строка есть массив символов, я так понял, что я задал строку фиксированного размера, тк когда я присвоил нулевому элементу строку "qwerty" я ждал что будет a[0]=="qwerty" а стало a[0]=='q', a[1]=='w', a[2]=='e', a[3]=='r', a[4]=='t', a[5]=='y', где a[0,1,2,3,4,5] имели тип char
Тут у меня большая каша в голове, разъясните плиз, может я не прав.
покажи код, где выполняется присваивание. Это слегка странно
Цитата Сообщение от fenix117 Посмотреть сообщение
я делал так:
Код C++
1
pupil f; f.a.push_back("qwerty");
что не правильно, подскажите как надо
А что тебе тут не нравится? Вполне рабочий код. Разве что можешь убрать вектор в приват, и добавить классу функцию, для добавления строки. Но внутри она будет вызывать a.push_back();
1
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
12.07.2011, 12:06 #4
Цитата Сообщение от fenix117 Посмотреть сообщение
что не правильно, подскажите как надо
вроде правильно всё, весь код покажи
Цитата Сообщение от fenix117 Посмотреть сообщение
я ждал что будет a[0]=="qwerty"
так и есть, а вот f.a[0][0] будет q
1
fenix117
8 / 8 / 1
Регистрация: 16.03.2011
Сообщений: 249
12.07.2011, 12:44  [ТС] #5
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <ctime>
#include <iomanip>
using namespace std;
 
struct Questions
{ 
    string question;    // вопрос
    string answer[5];   // варианты ответов
    char right;         // номер эталонного ответа
};
 
//Настройка (выводим и переписываем содержимое файла настройки test.ini)
void options ()
{
    //выводим содержимое test.ini
    string a;
    ifstream test("test.ini");
    if (test.is_open())
    {
        getline (test, a);
        cout<<"Текущее количество вопросов для теста равно "<<a<<endl;
    }
    else
        cout<<"Файл test.ini не был открыт на чтение"<<endl;
    test.close();
    //заполняем файл test.ini
    ofstream test2("test.ini");
    int t;
    if (test2.is_open())
    {
        do
        {
        cout<<"Введите количество вопросов "; cin>>t;
        if (t<10)
            cout<<"Количество вопросов не может быть меньше 10"<<endl;
        }
        while (t<10);
        test2<<t;
    }
    else
        cout<<"Файл test.ini не был открыт на запись"<<endl;
    test2.close();
}
 
//Функции кодирования-декодирования
char Code(char ch) { ch ^= 0x57; return ch; }
char Decode(char ch) { ch ^= 0x57; return ch; }
 
//посимвольно кодирует строку и добавляет ее в поток
void zapis (ofstream &potok, const string &s)
{
     for (unsigned int i = 0; i < s.length(); ++i) 
         potok.put(Code(s[i])); 
}
 
//функция ввода вопросов
void create ()
{
    string question, otvet, otvet_etalon;
    int key, etalon;
    ofstream potok("question.bin", ios_base::app);//открывается на дозапись
    if (potok.is_open())
    {
        do
        {
            //ввод вопроса
            cout<<"Введите вопрос ";
            cin.get();//в буфере клавиатуры остаётся неизвлечённым разделитель (символ перевода строки). Извлекаем с помощью cin.get();
            getline (cin, question);
            zapis (potok, question);
            zapis (potok, "@");
            cout<<"Введите 5 вариантов ответа"<<endl;
            for (int i=1; i<=5; i++)
            {
                cout<<"Введите "<<i<<" вариант ответа "; getline (cin, otvet);
                zapis (potok, otvet); zapis (potok, "@");
            }
            do
            {
                cout<<"Введите номер правильного ответа "; cin>>etalon;
                if (etalon<1 || etalon>5)
                    cout<<"Вы ввели некорректный номер"<<endl;
            }
            while (etalon<1 || etalon>5);
            //перевод числа в строку
            switch (etalon)
            {
                case 1: otvet_etalon="1"; break;
                case 2: otvet_etalon="2"; break;
                case 3: otvet_etalon="3"; break;
                case 4: otvet_etalon="4"; break;
                case 5: otvet_etalon="5"; break;
            }
            zapis (potok, otvet_etalon); zapis (potok, "@");
            system("cls");
            //запрос на ввод еще одного вопроса в виде менюшки
            cout<<"\n\n\n\n\n\n\n";
            cout<<"\t\t\tМЕНЮ"<<endl<<endl;
            cout<<"\t\t\t0.Назад в главное меню"<<endl;
            cout<<"\t\t\t1.Ввести еще один вопрос"<<endl;
            //Защита от дурака
            do
            {
                cout<<"\t\t\tВведите пункт меню "; cin>>key;
                if (key<0 || key>1)
                    cout<<"\t\t\tВы ввели неправильный пункт меню"<<endl;
            }
            while (key<0 || key>1);
        }
        while (key);
        potok.close();
    }
    else
        cout<<"Файл question.bin не был открыт на запись"<<endl;
}
 
void read_questions (vector <Questions> &Q)
{
    string question, answer;
    Questions vopros;
    char simvol, etalon;
    int i;
    const bool key=true;//для вечного цикла, выход по окончании чтения файла
    ifstream potok("question.bin");
    if (potok.is_open())
    {
        while(key)
        {
            //читаем вопрос
            while (!potok.eof())
            {
                simvol=potok.get();
                simvol=Decode (simvol);
                if (simvol=='@')
                    break;
                question+=simvol;
            }
            if (potok.eof()) //защита на случай, если файл закончился, не встретив знак окончания вопроса ('@')
            {potok.close(); return;}
            vopros.question=question;
            question.clear();
            //читаем ответы
            i=0;
            while (i<5)
            {
                while (!potok.eof())
                {
                    simvol=potok.get();
                    simvol=Decode (simvol);
                    if (simvol=='@')
                        break;
                    answer+=simvol;
                }
                vopros.answer[i]=answer;//пробовал заменить на веткор в структуре а в этой строке написать vopros.answer.push_back(answer)-ошибка:выражение должно иметь тип класса
                answer.clear();
                i++;
            }
            //читаем номер правильного ответа
            etalon=potok.get();
            etalon=Decode(etalon);
            vopros.right=etalon;
            simvol=potok.get();//читаем последний символ вопроса, чтобы можно было читать следующий вопрос
            Q.push_back(vopros);
        }
    }
    else
        cout<<"Файл question.bin не был открыт на чтение"<<endl;
}
 
void expiriment ()
{
    Questions vopros;
    vopros.question="qwerty";
    vopros.answer[0]="qwerty";
 
}
 
void prosmotr ()
{
    vector <Questions> Q;
    //Читаем файл question.bin, создаем вектор структур
    read_questions(Q);
    //Выводим вектор структур на экран
 
    expiriment();//к проге не имеет отношения, просто экспериментировал
}
 
int main ()
{
    setlocale(LC_ALL, "Russian");
    int menu;
    const bool key=true;    //для выхода из программы нужно будет выбрать в меню выход
    do                      //после завершения любой функции программа выводит главное меню
    {
        //ВЫВОД МЕНЮ
        cout<<"\n\n\n\n\n\n\n";
        cout<<"\t\t\tГЛАВНОЕ МЕНЮ"<<endl<<endl;
        cout<<"\t\t\t0.Выход"<<endl;
        cout<<"\t\t\t1.Тестирование"<<endl;
        cout<<"\t\t\t2.Настройка"<<endl;
        cout<<"\t\t\t3.Ввод вопросов"<<endl;
        cout<<"\t\t\t4.Просмотр вопросов"<<endl<<endl;
        //ЗАЩИТА ОТ ДУРАКА (в switch нет необходимости употреблять default)
        do
        {
            cout<<"\t\t\tВведите пункт меню "; cin>>menu;
            if (menu<0 || menu>4)
                cout<<"\t\t\tВы ввели неправильный пункт меню"<<endl;
        }
        while (menu<0 || menu>4);
        //Переход к функциям в зависимости от выбора пункта меню
        switch (menu)
        {
            case 0: return 0;                               //выход
            case 2: options(); system("cls"); break;        //Настройка
            case 3: create(); system("cls"); break;         //Ввод вопросов
            case 4: prosmotr(); system("cls"); break;       //Просмотр вопросов
        }
    }
    while (key);
}
поставьте red point (не знаю как правильно называется, вообщем останавливает систему и показывает значения локальных переменных) на 159 строке, запустите, выберите в меню 3, введите вопрос и варианты ответов длиной больше одного (чтобы увидеть эту проблему с массивом) на английском (русские выдает кракозябрамми почему-то, еще одна моя проблемка) затем выберите 4 и когда система остановиться посмотрите на vopros->answer, там все увидите
0
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
12.07.2011, 13:38 #6
fenix117, брейкпоинты называется
1
fenix117
8 / 8 / 1
Регистрация: 16.03.2011
Сообщений: 249
12.07.2011, 14:14  [ТС] #7
кто-нибудь знает в чем проблема, я все излазил, ничего не пойму
0
12.07.2011, 14:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2011, 14:14
Привет! Вот еще темы с ответами:

как заполнить вектор векторов прямо в программе (самый быстрый метод) - C++
почему не работает? #include&lt;cstdio&gt; #include &lt;vector&gt; using namespace std; vector&lt;int&gt; a; int main(){ a={4,6}; ...

Заполнить массив в структуре элементами другого массива - C++
Не могу понять как сделать так, чтобы элементам массива в структуре присвоить значения простого массива. пробую и strcpy() и просто...

Заполнить вектор обьектами - C++
Проблема с решением, вот задание: Создать вектор и заполнить его не менее, чем двадцатью объектами класса Fish. Для заполнения вектора...

не получается заполнить вектор структур - C++
Есть вектор структур class Console { public: struct MyStruct { int begin_M; int end_M; }; std::vector &lt;MyStruct&gt;...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru