0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
|
||||||
1 | ||||||
Вопросы начинающего17.11.2010, 16:26. Показов 2423. Ответов 23
Метки нет (Все метки)
Здравствуйте.
Самостоятельно приступила к изучению Visual C++, т.к. наставников в шаговой доступности нет, а вопросы есть, решила обратиться сюда. Изучаю по книге Пахомова. В самом начале книги есть текст программы:
вопрос: getchar() - как я поняла, в буфер пишет символ, проверяет выполнение while и потом putchar(c) выводит на экран. Условие окончания выполнения - ввод символа Ctrl+Z. При выполнении программы этого не происходит. Например ввожу строчку 123с4^Z(Ctrl+z) //нажимаю <Enter> 123с4 стрелочка //программа продолжает выполняться, хотя по условию while, должна была завершиться. Объясните, пожалуйста функцию getchar(). По одному ли символу она берет на проверку условия, или сразу всей строчкой и почему не выполняется CTRL+Z? спасибо ))
0
|
17.11.2010, 16:26 | |
Ответы с готовыми решениями:
23
Вопросы начинающего C++ для начинающего! Вопрос начинающего Книга для начинающего |
9 / 9 / 2
Регистрация: 14.07.2010
Сообщений: 166
|
|
18.11.2010, 21:28 | 2 |
немного не по теме, зато из собственного опыта, Пахомов не лучший вариант для изучения языка, ну очень уж он не понятен. Пример это Ваш вопрос, читали бы Вы нормальную книгу, таких вопросов бы не возникало!!!
Джесс Либерти - Освой самостоятельно С++ за 21 день немного по сложней Брюс Эккель - Филосовия С++ 1 том и видеоуроки в помощь
0
|
0 / 0 / 1
Регистрация: 18.11.2010
Сообщений: 38
|
|
18.11.2010, 22:03 | 3 |
Пахомов для начала и правда не лучший вариант. Да и видеоуроков по С++ толковых не так много, так обрывки.
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
|
||||||
18.11.2010, 23:10 | 4 | |||||
Питоша, если это действительно из книжки программа строчка в строчку - закройте эту книгу и больше не открывайте!
Не вдаваясь в тонкости реализации getchar() читает один символ из стандартного ввода (с клавиатуры) и возвращает этот символ типом int. Вот Вам "классический" вариант того-же самого, а чтобы Ctrl Z сработал - его нужно в новой строке вводить - появится ^Z нажмёте enter - окно закроется.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||
18.11.2010, 23:23 | 5 | ||||||||||
Даже не знаю что и сказать. Вопрос поставлен правильно, не вина автора что книги друг от друга отличаются и реализации компиляторов тоже. Я когда-то писал для себя талмуты по этой теме. Потом стало всё равно. Так-то всё верно, вот упрощённый код (компилятор GCC)
1) Во-первых надо знать, что когда программа походит к функции getchar (строка 7), она проверяет- а не пустой ли буфер? (о буфере ниже) Если пустой, она останавливается (как в строке 7) и ждёт чё будет дальше. Если буфер непустой, она считывает с него символ 2) Буфер- область памяти, в которую вы всю эту херь запихиваете. Итак, мы подошли к строке 7, прога остановилась. Самое время запихать чё-нибудь в буфер. ПИшем: 1234<конец_потока><Enter> всю эту херь, все эти 6 символов Вы запихали в буфер (<конец файла> это символ -1). Щас буфер выглядит так: 00110001 00110010 00110011 00110100 <-1> 0001000 Сосредоточтесь и постарайтьесь самостоятельно определить, почему 1 выладит как 00110001 и для всех остальных символов тоже. Если не справитесь, спрашивайте. Как -1 представить в двоичном коде, я позабыл Последняя это число 10. ПРи нажатии на <Enter> в буфер попадает число 10. 3) Так, вот как только в буфер попало число 10 (нажали на <Enter>) прога НАЧИНАЕТ СЧИТЫВАТЬ БУФЕР ПО ОДНОМУ СИМВОЛУ Сперва "1". После этого в переменную c попадает считанный символ "1" и там наверное внутри прожки есть двигатель-указатель какой-нибудь, который перемещается к следующему символу. А он "2" Так, потом прога снова подходит к getchar () (строка 11 или какая там.) Ага, проверяет, пуст или нет буфер. Не пуст. Следующий на очереди символ "2". ОНа его считывает и благополучно выводит И так далее. А когда она должна дойти до : ^Z, она должна выйти из цикла. Должна да не обязана, у меня тоже так происходит. Что можно сказать? Может, компилятор так реализован. Может, система НЕ КЛАДЁТ в буфер -1- не знаю. Но вот если вводить <^Z><Enter> БЕЗ СИМВОЛОВ ВПЕРЕДИ, тогда прога РАСПОЗНАЕТ конец файла и не будет заходить в цикл а сразу напечатает, что там за циклом "gggggggg\n" Я всё же думаю, чо это постарались разработчики Windows То есть при 1234<^Z><Enter> ^Z в буфер не попадает (на консоль выводится, а в буфер не попадает) и поэтому прога при считывании просто не видит этого символа. По моему скромному опыту смею предположить что это так. Разбирайся давай. Пиши если чё. Добавлено через 4 минуты Да, и ещё. Если тебе нужно будет сделать, чтобы всё-таки прога распознавала как-нибудь конец входного потока ты можешь вместо EOF использовать ту же десятку. То есть вот так:
0
|
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
|
|
19.11.2010, 11:19 [ТС] | 6 |
насколько я прочитала, то 00110001 - это что-то связано с переводов систему ASCII кодов. Честно скажу, как именно это происходит я пока не поняла. Если не сложно, можете объяснить? Что происходит остановка считывания и конец файла только когда перед комбинацией CTRL+Z нет символов, это я заметила, было интересно именно, почему в самой строчке остановка не действует? Ну да Бог с ним, как говорит мой начальник "это особенности". И спасибо за развернутый ответ. ) Добавлено через 59 секунд А какие книги посоветуете? Добавлено через 1 минуту И можно тогда уж совсем глупый вопрос? Насколько сильно Visual C++ отличается от C++?
0
|
Kastaneda
|
19.11.2010, 14:27
#8
|
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
|
|
19.11.2010, 14:28 | 9 |
Для начала: Microsoft Visual C++ - это среда разработки ПО, а С++ - язык программирования, на который имеется соответствующий стандарт, и компилятор, прилагаемый к MS Visual C++ этому стандарту можно сказать соответствует. То есть программа, написанная на С++ в полном соответствии со стандартом, скорее всего скомпилируется с помощью компилятора от MS. Другое дело - мелкомягкие разработчики выдумали целую кучу макросов/функций/классов/etc... которые в стандарт не входят и соответственно другим компилятором не скомпилируются.
0
|
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
|
|
23.11.2010, 09:56 [ТС] | 10 |
Здравствуйте.
Это снова я. Начала изучать книгу "С++ за 21 день". И тут же столкнулась с проблемой. В чем собственно писать? почему-то Microsoft visual studio как-то не откликается на то, что пишу из книги. В чем ещё можно писать? Или просто у меня кривые руки? Помогите, пожалуйста.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
23.11.2010, 15:03 | 11 |
Чё случилось-то?
И сразу: автор книги писал свои примеры для одной среды и компилятора. ОНи не обязаны сразу же компилиться в другой среде. Но ты не боись.
0
|
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
|
||||||
23.11.2010, 17:21 [ТС] | 12 | |||||
Вот как раз с этим и столкнулась. ошибки выдает.. вот код
Вопросы в комментариях. Я как-то запуталась немного. Добавлено через 12 минут как я поняла, то cout входит в iostream. Вопрос: является ли iostream аналогом stdio.h? Что правильнее использовать и в каких ситуациях? писала-писала... заменяла, выдает ошибку "cout".
0
|
3 / 3 / 0
Регистрация: 24.04.2010
Сообщений: 37
|
|
23.11.2010, 17:22 | 13 |
stdafx-это Precompiled Header, что бы его не было-кликни на название проекта(в данном случае на Hello)правой кнопкой, выбери Properties->C/C++->Precompiled Headers и рядом со строкой Precompiled Header выбери Not Using Precompiled Headers.
а что бы было проще, просто когда создаёшь проект-не выбирай сразу Finish а нажми Next и выбери Empty Project. iostream-это с++ а stdio.h - это с cout-оператор вывода cin-оператор ввода
0
|
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
|
|
23.11.2010, 17:33 [ТС] | 14 |
Спасибо за советы.
А в c++ используется iostream всегда, все программы начинаются с этого? Используется ли stdio.h?При изучении по Пахомову фигурировал как раз stdio.h. Извините если задаю глупые вопросы, просто пока не пойму, что к чему.
0
|
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
|
||||||
25.11.2010, 15:12 [ТС] | 16 | |||||
всем доброго дня.
Появился вопрос. КОД:
Если вводить #include <iostream.h> то также выдает ошибку. Почему? Всегда ли нужно, если пишем #include <iostream> писать ниже using namespace std;. может просто нужно что-то подписать в iostream?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||||||||||||
25.11.2010, 15:19 | 17 | |||||||||||||||
Питоша, iostream трогать не стоит. Это хедер и можно там такого переправить, что ничего не станет работать.
А про std - почитайте ка вы про пространства имен. std - пространство имен. Стандартное как заметно по названию. Можно явно указывать.
1
|
5056 / 3116 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
25.11.2010, 15:24 | 18 |
ForEveR, я тоже вариант с явным указание пространства предпочитаю.
1
|
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
|
|
25.11.2010, 15:41 [ТС] | 19 |
ForEveR, пока я до пространства имен не дошла, в книге просто написано.. впишите и будет работать, подробнее расскажем потом
А в явном виде получается нужно каждый раз перед cout писать std, а я как поняла написав единожды using namespase std; далее уже определять, что cout находится в std не нужно? (пишу так, как поняла я значение пространства имен, не изучая его пока, если не права-поправьте)
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
25.11.2010, 16:00 | 20 |
Питоша, Приблизительно верно. Но не надо вестись на простоту) Я бы посоветовал писать std:: (туда естественно включен не только cout). Или хотя бы писать using namespace std в локальной области видимости
0
|
25.11.2010, 16:00 | |
25.11.2010, 16:00 | |
Помогаю со студенческими работами здесь
20
Подскажите для начинающего! Opengl и С++ для начинающего Книга для начинающего по С++ вопрос от начинающего програмиста :) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |