Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

23.08.2013, 21:21. Просмотров 601. Ответов 14
Метки нет (Все метки)

Здорова господа!

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

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

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

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

Шаблонный массив - C++
Здравствуйте, хотелось бы узнать одну вещь. Код оформить не могу тк с телефона. Я завел шаблонный массив размера 10. Заполняю его...

Шаблонный стек - C++
В книге С.Праты имеется следующий пример стека: #pragma once template <typename T> class Stack { private: enum{SIZE = 10}; ...

Шаблонный ostream - C++
Здравствуйте. Не линкуется программа - не пойму в чем дело. "Header.h" #include <iostream> using namespace std; template...

Шаблонный дек - C++
Задача реализовать шаблонный класс дека, и класс Итератора для навигации по деку. До добавления шаблонов все хорошо работало. Ныне такие...

шаблонный стек. - C++
надо написать стек объектом которого может быть list или vector или stack с STL и принимать любой тип чтоб в main можно было написать ...

Шаблонный стек - C++
Не понимаю, почему возникает ошибка, когда возвращаю значения из функции Pop (). выражение слева от ".x" должно представлять класс,...

14
xSCJx
23.08.2013, 22:08
  #2

Не по теме:

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

0
ninja2
231 / 187 / 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;
}
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.08.2013, 17:15 #4
ninja2, можно сделать как в scanf - передавать адреса переменных.

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

Не по теме:

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

1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.08.2013, 19:03 #6
Olivеr, так уж лучше по ссылке аргументы передавать.
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.08.2013, 19:14 #7
gray_fox, можно и по ссылке)
http://ideone.com/JDrTms
1
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
24.08.2013, 19:49 #8
Вариадики - это круто, конечно, только при чем тут вообще темплейты? Я так понял, что по заданию нужно реализовать самый обычный сишный scanf.
1
ninja2
231 / 187 / 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, господа щас посмотрю ваше решение, но что то оно не понятное, я с таким синтаксисом не сталкивался, да мб. оно и не то.
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
24.08.2013, 20:19 #10
ninja2, передавай адреса и не грей голову...
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.08.2013, 20:21  [ТС] #11
0x10, А как? Щас попробую, я вроде пробовал не получалось.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.08.2013, 20:24 #12
ninja2, varargs с сылками не подружить, делай, как в scanf - передавай адреса.
1
ninja2
231 / 187 / 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); щас попробую на указатель поменять.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
24.08.2013, 20:29 #14
ninja2, ну так там же указатель)
C++
1
char * d = va_arg(ap, char *);
1
ninja2
231 / 187 / 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 минуту
Все заработало как нужно. Всем кто помогал спасибо!
0
24.08.2013, 20:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2013, 20:42
Привет! Вот еще темы с ответами:

Шаблонный класс - C++
Подскажите как указать реализацию методов для шаблонного класса template &lt;class T_machine&gt; class hospital_room { ...

Шаблонный класс - C++
Ребят, прошу Вашей помощи.. Программу я написала.. Она работает. Но теперь мне нужно переделать ее , используя шаблонный класс. Я...

Шаблонный класс - C++
Создание шаблона класса с 1 параметром типа ( шаблонный класс ) По типу : Template&lt;Typename T&gt; Class... #include &lt;iostream&gt; ...

шаблонный класс - C++
реализован согласно &quot;Создание конструкторов и деструктора&quot; на шаблон класса с параметром -Тип данных в файле, редактируется (байт / слово /...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.