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

Шаблонный ввод - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.08.2013, 21:21     Шаблонный ввод #1
Здорова господа!

Есть задачка: "Разработайте и реализуйте операцию ввода по шаблону. Используйте форматирующие строки в стиле функции printf() для задания шаблона ввода. Должна иметься возможность применения к одному и тому же вводу разных шаблонов для установления истинного формата. Можно реализовать класс как производный от istream."

и еще одна: "Придумайте и реализуйте наилучший вид шаблона для шаблонного ввода. Уточните в чем именно состоит его преимущество. "

Тут понятно что не printf нужно сделать а вроде как scanf() потому что ввод, но что бы она работала так же как scanf()???

Как вы думаете что здесь от нас требуют, что бы мы создали, поделитесь мнением?!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 21:21     Шаблонный ввод
Посмотрите здесь:

C++ Шаблонный класс
C++ шаблонный стек.
C++ Шаблонный стек
Шаблонный массив C++
Шаблонный класс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xSCJx
23.08.2013, 22:08
  #2

Не по теме:

ninja2, если не секрет откуда задачка?

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.08.2013, 17:08  [ТС]     Шаблонный ввод #3
Цитата Сообщение от SERUYBKR Посмотреть сообщение
если не секрет откуда задачка?
С книги Страуструпа.

Добавлено через 18 часов 11 минут
Здорова! От пытаюсь свою scanf сделать, но не получается ничего, символ передается по значению, а мне нужно по ссылке или через указатель, как это можно сделать для функции с множественным числом аргументов?
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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <stdarg.h>
#include <cstring>
using std::strlen;
 
void myscanf(char* s, ...)
{
    va_list ap;
    va_start(ap, s);
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]=='%'&&s[i+1]=='c')
        {
            char d=va_arg(ap,char);
            cout <<"mu tyt d= "<<d<<endl;
            cin >>d;i++;
        }
    }
    va_end (ap);
}
 
 
/*void myscanf(char* s, int& n){cin >>n;}
void myscanf(char* s, char* s1){cin >>s1;}
*/
int main()
{
    char c='k';
    myscanf("%c",c);
    cout <<"c= "<<c<<endl;
 
    return 0;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.08.2013, 17:15     Шаблонный ввод #4
ninja2, можно сделать как в scanf - передавать адреса переменных.

Добавлено через 1 минуту

Не по теме:

Можно ещё variadic templates )))

Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.08.2013, 18:43     Шаблонный ввод #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
#include <iostream>
 
void scanf() {}
 
template <class T, class... Args>
void scanf(T ptr, Args ...args)
{
    std::cin >> *ptr;
    scanf(args...);
}
 
int main()
{
    int a, b, c;
    double z;
    std::string str;
    scanf(&z, &a, &b, &str, &c);
    std::cout << z << std::endl
              << a << std::endl
              << b << std::endl
              << str << std::endl
              << c << std::endl;
    return 0;
}
добавить форматирование не составит труда

Добавлено через 40 секунд
http://ideone.com/wu9jC1
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.08.2013, 19:03     Шаблонный ввод #6
Olivеr, так уж лучше по ссылке аргументы передавать.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.08.2013, 19:14     Шаблонный ввод #7
gray_fox, можно и по ссылке)
http://ideone.com/JDrTms
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
24.08.2013, 19:49     Шаблонный ввод #8
Вариадики - это круто, конечно, только при чем тут вообще темплейты? Я так понял, что по заданию нужно реализовать самый обычный сишный scanf.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.08.2013, 20:17  [ТС]     Шаблонный ввод #9
Вообще нужно по заданию scanf реализовать, мне нужно что бы при передаче в myscanf("%c",c); я допустим ввел символ 'r' и у меня с вернулось со значением 'r'. От я написал свою функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void myscanf(char* s, ...)
{
    va_list ap;
    va_start(ap, s);
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]=='%'&&s[i+1]=='c')
        {
            char d=va_arg(ap,char);
            cout <<"mu tyt d= "<<d<<endl;
            cin >>d;i++;
        }
    }
    va_end (ap);
}
Я записываю в d число , но оно не возвращается, потому что аргументы как то по значению передаются, а мне нужно по ссылке.
Отут от:
C++
1
2
3
4
5
6
7
8
int main()
{
    char c='k';
    myscanf("%c",c);
    cout <<"c= "<<c<<endl;
 
    return 0;
}
Переменная с как было со значением 'k' так и остается, потому что функция принимает не ссылку, если я определю отак: void myscanf(char* s, char& c) то у меня все нормально вернется, но мне нужно чтобы я мог передать допустим не одну переменную, а три или две допустим.

Olivеr, gray_fox, господа щас посмотрю ваше решение, но что то оно не понятное, я с таким синтаксисом не сталкивался, да мб. оно и не то.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
24.08.2013, 20:19     Шаблонный ввод #10
ninja2, передавай адреса и не грей голову...
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.08.2013, 20:21  [ТС]     Шаблонный ввод #11
0x10, А как? Щас попробую, я вроде пробовал не получалось.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.08.2013, 20:24     Шаблонный ввод #12
ninja2, varargs с сылками не подружить, делай, как в scanf - передавай адреса.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.08.2013, 20:27  [ТС]     Шаблонный ввод #13
gray_fox, Отак от вызываю myscanf("%c",&c); не получается все рамно c не меняется и в функции я менял на ссылку char& d=va_arg(ap,char); щас попробую на указатель поменять.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.08.2013, 20:29     Шаблонный ввод #14
ninja2, ну так там же указатель)
C++
1
char * d = va_arg(ap, char *);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 20:42     Шаблонный ввод
Еще ссылки по теме:

Шаблонный класс C++
C++ Шаблонный класс
C++ шаблонный класс

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

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.08.2013, 20:42  [ТС]     Шаблонный ввод #15
gray_fox, Отак она вылетает:
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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <stdarg.h>
#include <cstring>
using std::strlen;
 
void myscanf(char* s, ...)
{
    va_list ap;
    va_start(ap, s);
    for(int i=0;i<strlen(s);i++)
    {
        if(s[i]=='%'&&s[i+1]=='c')
        {
            char* d=va_arg(ap,char*);
            cout <<"mu tyt d= "<<*d<<endl;
            cin >>d;i++;
        }
    }
    va_end (ap);
}
 
 
/*void myscanf(char* s, int& n){cin >>n;}
void myscanf(char* s, char* s1){cin >>s1;}
*/
int main()
{
    char c='k';
    myscanf("%c",&c);
    cout <<"c= "<<c<<endl;
 
    return 0;
}
Добавлено через 1 минуту
Похоже на то как будто где то указатель недействительный.

Добавлено через 3 минуты
пишет стек вокруг переменной с был поврежден.

Добавлено через 2 минуты
Я кажется понял где ошибка нужно cin >>*d; а у меня cin >>d; щас проверю, визуал студио думает по пол часа, пока скомпилит ппц.

Добавлено через 1 минуту
Все заработало как нужно. Всем кто помогал спасибо!
Yandex
Объявления
24.08.2013, 20:42     Шаблонный ввод
Ответ Создать тему
Опции темы

Текущее время: 11:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru