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

Тема в разделе "Общие вопросы по С и С++", создана пользователем @rtem, 7 июн 2010.

  1. @rtem

    @rtem Гость

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

    Первое:

    Код (Text):
    #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;
    }
    }
    И второе

    Код (Text):
    #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) необходимо сделать реверс элементов массива, кроме первого и последнего. Я сделал, но что то мне кажется что можно сделать красивее, так что если кто знает подскажите.

    Всем спасибо.
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
  3. @rtem

    @rtem Гость

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    вызов std:reverse как раз и укрепляет навыки работы с функциями =)
    что косается твоей реализации, то дополнительный масив нафиг не нужен


    Код (Text):
    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;
    }
    }
    как то так, правильность не гарантию, но подход думаю должен быть понятен. передавать соотвественно нужно указатель на второй и соотвественно предпоследний эедементы массива
     
  5. @rtem

    @rtem Гость

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

    Код (Text):
    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;
    }
    }
    а как на счет структуры нет предложений???
     
Загрузка...

Поделиться этой страницей