Общие вопросы

  • Автор темы Автор темы @rtem
  • Дата начала Дата начала
@

@rtem

Всем привет, есть пара вопросов по С++, помогаю делать знакомому задания, вот хотелось бы спросить.

Первое:

Код:
#include <iostream>

using namespace std;

const int SLEN = 30;

struct student {
char fullname[SLEN];
char hobby[SLEN];
int ooplevel;
};

int getinfo(student pa[], int n);
void display1(student st);
void display2(const student *ps);
void display3(const student pa[], int n);

int main() {

cout << " Введите количество студентов : ";
int class_size;

cin >> class_size;

while (cin.get() != '\n')
continue;

student *ptr_stu = new student[class_size];

int entered = getinfo(ptr_stu, class_size);

for (int i = 0; i < entered; i++) {
display1(ptr_stu[i]);
display2(&ptr_stu[i]);
}

display3(ptr_stu, entered);

delete [] ptr_stu;

cout << " Готово." << endl;

return 0;
}

int getinfo(student pa[], int n) {

int i;

cout << " Заполните массив структур "Студент"" << endl;

for (i = 0; i < n; i++) {

cout << " Полное имя : ";
cin.getline(pa[i].fullname, SLEN);

//if (pa[i].fullname == '\n') { break; } // ----- в этом и есть ошибка мне нужно сделать так, чтобы при вводе пустой строки заполнение структуры прекращалось. 

cout << " Хобби : ";
cin.getline(pa[i].hobby, SLEN);

cout << " Уровень ООП : ";
(cin >> pa[i].ooplevel).get();

cout << endl << " Новый студент " << endl;
}

return i;
}

void display1(student st) {

cout << endl << " Полное имя студента : " << st.fullname << endl;
cout << " Хобби студента : " << st.hobby << endl;
cout << " Уровень ООП студетна : " << st.ooplevel << endl;
}

void display2(const student *ps) {

cout << endl << " Полное имя студента : " << ps->fullname << endl;
cout << " Хобби студента : " << ps->hobby << endl;
cout << " Уровень ООП студетна : " << ps->ooplevel << endl;
}

void display3(const student pa[], int n) {

cout << endl << "********** Вся структура **********" << endl;

for (int i = 0; i < n; i++) {

cout << endl << " Полное имя студента : " << pa[i].fullname << endl;
cout << " Хобби студента : " << pa[i].hobby << endl;
cout << " Уровень ООП студетна : " << pa[i].ooplevel << endl;
}
}

И второе

Код:
#include <iostream>

using namespace std;

int Fill_array(double ar[], int n);
void Show_array(const double ar[], int n);
void Reverse_array(double ar[], int n);

const int arrSize = 10;

int main() {

double newArray[arrSize];

int size = Fill_array(newArray, arrSize);
Show_array(newArray, size);

Reverse_array(newArray, size);
Show_array(newArray, size);

return 0;
}


int Fill_array(double ar[], int n) {

int i;
int tmp;

for (i = 0; i < n; i++) {

cout << " Enter a value #"<< (i + 1) << " : ";
cin >> tmp;

if (!cin) {

cin.clear();

while (cin.get() != '\n')
continue;

cout << " Bad input; input process terminated." << endl;
break;
}
else if (tmp < 0) {

cout << " Exit input process." << endl;
break;
}

ar[i] = tmp;
}

return i;
}

void Show_array(const double ar[], int n) {

cout << endl << " Array elements " << endl;

for (int i = 0; i < n; i++) {

cout << " Value of #" << (i + 1) << " " << ar[i] << endl;
}
}

void Reverse_array(double ar[], int n) {

double tmp[n];
int j = n - 1;

for (int i = 1; i < j; i++) {

tmp[i] = ar[j - i];
}

for (int i = 1; i < j; i++) {
ar[i] = tmp[i];
}
}

тут все работает но меня смущает эта функция void Reverse_array(double ar[], int n) необходимо сделать реверс элементов массива, кроме первого и последнего. Я сделал, но что то мне кажется что можно сделать красивее, так что если кто знает подскажите.

Всем спасибо.
 
Kmet как всегда многословен. Тут этот вариант применять рано, так как до изучения STL они(студенты, и тот остолоп которому я это делаю) не дошли еще. Я не думаю если он принесет такой вариант, препод его примет, так как от них требуют укрепить навыки работы с массивами, структурами, функциями.
 
так как от них требуют укрепить навыки работы с массивами, структурами, функциями.
вызов std:reverse как раз и укрепляет навыки работы с функциями =)
что косается твоей реализации, то дополнительный масив нафиг не нужен


Код:
void reverse(double *begin, double *end) {

size_t len = end-begin+1;

for (int i = 0; i < len/2; i++) {
double swap;
swap = begin[i];
begin[i] = end[-i];
end[-i] = swap;
}
}

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

Код:
void Reverse_array(double ar[], int n) {

double tmp;
int j = n - 1;
for (int i = 1; i < j / 2; i++) {

tmp = ar[i];
ar[i] = ar[j - i];
ar[j - i] = tmp;
}
}

а как на счет структуры нет предложений???
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!