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

  • Автор темы @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) необходимо сделать реверс элементов массива, кроме первого и последнего. Я сделал, но что то мне кажется что можно сделать красивее, так что если кто знает подскажите.

Всем спасибо.
 
@

@rtem

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

Kmet

Well-known member
25.05.2006
904
8
BIT
0
так как от них требуют укрепить навыки работы с массивами, структурами, функциями.
вызов 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;
}
}

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

@rtem

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;
}
}

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

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