IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Передача и возврат ссылок из функции, С++
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Объявил структуру Student, которая содержит четыре поля(фамилию, имя и отчество студента и год рождения), при этом строковые значения храню в виде массивов,а не указателей. Описал и инициализировал переменную st типа Student фамилией, именем и отчеством, не задавая год его рождения.


#include <iostream>
using namespace std;

struct Student {
char Surname;
char Name;
char Patronymic;
int Year;
} ;

Student& trunc(Student& X)
{
return X;
}

int main()
{ Student st;
st.Surname='Ivanov';
st.Name='Ivan';
st.Patronymic='Ivanovich';
trunc(st);
}



Проблемы возникли с написанием функции Student& trunc(Student& X), которая сокращает в структуре
имя и отчество до инициалов (с точкой) и возвращает структуру X. Помогите пожалуйста с реализацией этой функции! Проверка работы функции нужно осуществить, передав ей переменную st, и воспользоваться возвращаемым значением функции для задания года рождения.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
Возможно реализовать без использования конструктора?
"Возможно ездить на автомобиле задним ходом?" Возможно, но не все же время! Далеко не уедешь. Вот так же и здесь: если ты используешь С++ - так используй, его. А нужен непонятно как урезанный функционал - так пиши на чистых Сях, без конструкторов, ссылок и многих других вещей...

Цитата
Как работает "sprintf"?
Точно так же, как и printf, только печатает в строку, заданную первым параметром. В MSDN написано...

Цитата
Так нужно всё-таки реализовать финкцию "Student& trunc(Student& X)", и чтобы возращалась структура Х
Чтоб возвращалась "структура X" надо делать так, как я написал выше. А то, что хочешь ты - это сделать, чтобы возвращалась "ссылка на структуру X", пойми это наконец! Отсюда до ошибки - одно движение. Ну, извращайся, дело твое:
Student& trunc(Student& X)
{
sprintf(X.Name, "%c.%c", X.Name[0], (char)0);
sprintf(X.Patronymic, "%c.%c", X.Patronymic[0], (char)0);
return X;
}

int main()
{
Student st("Ivanov", "Petr", "Alekseevich");
st.Year = 1990;

trunc(st).Year = 1970; // Можно даже не запоминать результат...
cout << st.Surname << " " << st.Name << " " << st.Patronymic << " " << st.Year << endl;
return 0;
}



Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 16.03.2008 16:52) *

Отсюда до ошибки - одно движение. Ну, извращайся, дело твое:

Да так в задание написано. Тут ещё нужно проверить работу функции, если:
i) структура передается и возвращается по ссылке
ii) структура передается в функцию по ссылке, а возвращается по значению
iii) структура передается по значению, а возвращается по ссылке
iv) и передача, и возврат из функции производятся по значению


Student& trunc(Student& X)
{
sprintf(X.Name, "%c.%c", X.Name[0], (char)0);
sprintf(X.Patronymic, "%c.%c", X.Patronymic[0], (char)0);
return X;
}

int main()
{
Student st("Ivanov", "Petr", "Alekseevich");
st.Year = 1990;

trunc(st).Year = 1970; // Можно даже не запоминать результат...
cout << st.Surname << " " << st.Name << " " << st.Patronymic << " " << st.Year << endl;
return 0;
}

Это, надо понимать, первый пункт. Проблема в том, что не сокращается имя и отчество...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата(Rocket @ 16.03.2008 16:16) *
ii) структура передается в функцию по ссылке, а возвращается по значению
Это тоже уже было - см. четвертый пост.

Цитата(Rocket @ 16.03.2008 16:16) *
iii) структура передается по значению, а возвращается по ссылке
Вот тут будет засада:
Student& trunc3(Student X) // передаем по значению, возвращаем ссылку
{
cout << "just before return" << endl;
sprintf(X.Name, "%c.%c", X.Name[0], (char)0);
sprintf(X.Patronymic, "%c.%c", X.Patronymic[0], (char)0);
return X;
}
, потому как будет создаваться временный объект, и здесь-то точно не будет сокращаться имя и отчество. Для того, чтобы поймать создание временного объекта - опиши еще один конструктор:
struct Student {
// ...

Student(Student &s) { // вот этот
cout << "X(X&) constructor" << endl;
}

// ...
};
, и запусти программу с trunc3...

Цитата(Rocket @ 16.03.2008 16:16) *

Да так в задание написано. Тут ещё нужно проверить работу функции, если:iv) и передача, и возврат из функции производятся по значению
А здесь вообще дважды будет создаваться временный объект.

Я не понял, тебе что, нужны 4 разные функции, которые работали бы для 4-х пунктов задания? Или прото написать одну и проверить на ней остальные варианты?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 13:58
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name