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

Вопросы начинающего - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Питоша
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
17.11.2010, 16:26     Вопросы начинающего #1
Здравствуйте.
Самостоятельно приступила к изучению Visual C++, т.к. наставников в шаговой доступности нет, а вопросы есть, решила обратиться сюда.
Изучаю по книге Пахомова.

В самом начале книги есть текст программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#define eof -1
 
int _tmain(int argc, _TCHAR* argv[])
{
int c;
printf("Make input>\n");
c=getchar();
while (c !=eof)
{
putchar(c);
c=getchar();
}
_getch();
    
}

вопрос:
getchar() - как я поняла, в буфер пишет символ, проверяет выполнение while и потом putchar(c) выводит на экран.
Условие окончания выполнения - ввод символа Ctrl+Z.
При выполнении программы этого не происходит.

Например ввожу строчку
123с4^Z(Ctrl+z) //нажимаю <Enter>
123с4 стрелочка //программа продолжает выполняться, хотя по условию while, должна была завершиться.
Объясните, пожалуйста функцию getchar(). По одному ли символу она берет на проверку условия, или сразу всей строчкой и почему не выполняется CTRL+Z?

спасибо ))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2010, 16:26     Вопросы начинающего
Посмотрите здесь:

Работа с графикой начинающего C++
C++ вопрос от начинающего програмиста :)
C++ Вопросы начинающего
Вопрос начинающего C++
C++ 3D программирование для начинающего
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yardie
 Аватар для yardie
8 / 8 / 0
Регистрация: 14.07.2010
Сообщений: 166
18.11.2010, 21:28     Вопросы начинающего #2
немного не по теме, зато из собственного опыта, Пахомов не лучший вариант для изучения языка, ну очень уж он не понятен. Пример это Ваш вопрос, читали бы Вы нормальную книгу, таких вопросов бы не возникало!!!
Джесс Либерти - Освой самостоятельно С++ за 21 день
немного по сложней
Брюс Эккель - Филосовия С++ 1 том
и видеоуроки в помощь
pavelnt
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 38
18.11.2010, 22:03     Вопросы начинающего #3
Пахомов для начала и правда не лучший вариант. Да и видеоуроков по С++ толковых не так много, так обрывки.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
18.11.2010, 23:10     Вопросы начинающего #4
Питоша, если это действительно из книжки программа строчка в строчку - закройте эту книгу и больше не открывайте!
Не вдаваясь в тонкости реализации getchar() читает один символ из стандартного ввода (с клавиатуры) и возвращает этот символ типом int.
Вот Вам "классический" вариант того-же самого, а чтобы Ctrl Z сработал - его нужно в новой строке вводить - появится ^Z нажмёте enter - окно закроется.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int c;
 
    while ( ( c = getchar() ) != EOF )
        putchar(c);
 
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
18.11.2010, 23:23     Вопросы начинающего #5
Даже не знаю что и сказать. Вопрос поставлен правильно, не вина автора что книги друг от друга отличаются и реализации компиляторов тоже. Я когда-то писал для себя талмуты по этой теме. Потом стало всё равно. Так-то всё верно, вот упрощённый код (компилятор GCC)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "conio.h"
#include "stdio.h"
 
int main(){
 int c;
 printf("Make input>\n");
 c=getchar();
 while (c != EOF){
  printf("kkkkkkkkkkkk\n");
  putchar(c);
  c=getchar();
 }
 printf("ggggggggggg\n");
_getch();
  
}
Да, действительно, когда пишем 1234<конец файла><Enter> происходит следующее:
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 использовать ту же десятку.
То есть вот так:
C++
1
 while (c != 10)
Помни: в буфере окажется 10 по нажатию на <Enter>! Ну а Ctrl+Z можно не задействовать
Питоша
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
19.11.2010, 11:19  [ТС]     Вопросы начинающего #6
Цитата Сообщение от kravam Посмотреть сообщение
Даже не знаю что и сказать. Вопрос поставлен правильно, не вина автора что книги друг от друга отличаются и реализации компиляторов тоже. Я когда-то писал для себя талмуты по этой теме. Потом стало всё равно. Так-то всё верно, вот упрощённый код (компилятор GCC)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "conio.h"
#include "stdio.h"
 
int main(){
 int c;
 printf("Make input>\n");
 c=getchar();
 while (c != EOF){
  printf("kkkkkkkkkkkk\n");
  putchar(c);
  c=getchar();
 }
 printf("ggggggggggg\n");
_getch();
  
}
Да, действительно, когда пишем 1234<конец файла><Enter> происходит следующее:
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 использовать ту же десятку.
То есть вот так:
C++
1
 while (c != 10)
Помни: в буфере окажется 10 по нажатию на <Enter>! Ну а Ctrl+Z можно не задействовать


насколько я прочитала, то 00110001 - это что-то связано с переводов систему ASCII кодов. Честно скажу, как именно это происходит я пока не поняла. Если не сложно, можете объяснить?

Что происходит остановка считывания и конец файла только когда перед комбинацией CTRL+Z нет символов, это я заметила, было интересно именно, почему в самой строчке остановка не действует? Ну да Бог с ним, как говорит мой начальник "это особенности".
И спасибо за развернутый ответ. )

Добавлено через 59 секунд
Цитата Сообщение от easybudda Посмотреть сообщение
Питоша, если это действительно из книжки программа строчка в строчку - закройте эту книгу и больше не открывайте!
Не вдаваясь в тонкости реализации getchar() читает один символ из стандартного ввода (с клавиатуры) и возвращает этот символ типом int.
Вот Вам "классический" вариант того-же самого, а чтобы Ctrl Z сработал - его нужно в новой строке вводить - появится ^Z нажмёте enter - окно закроется.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int c;
 
    while ( ( c = getchar() ) != EOF )
        putchar(c);
 
    return 0;
}
А какие книги посоветуете?

Добавлено через 1 минуту
И можно тогда уж совсем глупый вопрос?
Насколько сильно Visual C++ отличается от C++?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.11.2010, 11:46     Вопросы начинающего #7
вот там книжка нарисована, есть на русском
Kastaneda
19.11.2010, 14:27
  #8

Не по теме:

Цитата Сообщение от kravam Посмотреть сообщение
0001000...
Последняя это число 10
10 это - 00001010, а то, что у вас это 8.
Не подумайте, я не придираюсь, просто в глаза бросилось)

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
19.11.2010, 14:28     Вопросы начинающего #9
Цитата Сообщение от Питоша Посмотреть сообщение
Насколько сильно Visual C++ отличается от C++?
Для начала: Microsoft Visual C++ - это среда разработки ПО, а С++ - язык программирования, на который имеется соответствующий стандарт, и компилятор, прилагаемый к MS Visual C++ этому стандарту можно сказать соответствует. То есть программа, написанная на С++ в полном соответствии со стандартом, скорее всего скомпилируется с помощью компилятора от MS. Другое дело - мелкомягкие разработчики выдумали целую кучу макросов/функций/классов/etc... которые в стандарт не входят и соответственно другим компилятором не скомпилируются.
Питоша
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
23.11.2010, 09:56  [ТС]     Вопросы начинающего #10
Здравствуйте.
Это снова я. Начала изучать книгу "С++ за 21 день".
И тут же столкнулась с проблемой. В чем собственно писать? почему-то Microsoft visual studio как-то не откликается на то, что пишу из книги.
В чем ещё можно писать? Или просто у меня кривые руки? Помогите, пожалуйста.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
23.11.2010, 15:03     Вопросы начинающего #11
Чё случилось-то?
И сразу: автор книги писал свои примеры для одной среды и компилятора. ОНи не обязаны сразу же компилиться в другой среде.

Но ты не боись.
Питоша
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
23.11.2010, 17:21  [ТС]     Вопросы начинающего #12
Цитата Сообщение от kravam Посмотреть сообщение
Чё случилось-то?
И сразу: автор книги писал свои примеры для одной среды и компилятора. ОНи не обязаны сразу же компилиться в другой среде.

Но ты не боись.

Вот как раз с этим и столкнулась. ошибки выдает..
вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Hello.cpp : Defines the entry point for the console application.
//
#include "stdafx.h" //выдавал ошибку пока не вписала эту строчку, она обязательна всегда?
#include <iostream> //Почему пишем это ПОСЛЕ stdafx.h?
 
using namespace std;
 
int main();
int main()
{
    cout<< "Hello world\n"; //что такое cout?
    return 0;
}

Вопросы в комментариях. Я как-то запуталась немного.

Добавлено через 12 минут
как я поняла, то cout входит в iostream.
Вопрос: является ли iostream аналогом stdio.h? Что правильнее использовать и в каких ситуациях?
писала-писала... заменяла, выдает ошибку "cout".
daemonik
 Аватар для daemonik
3 / 3 / 0
Регистрация: 24.04.2010
Сообщений: 37
23.11.2010, 17:22     Вопросы начинающего #13
Цитата Сообщение от Питоша Посмотреть сообщение
Вот как раз с этим и столкнулась. ошибки выдает..
вот код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Hello.cpp : Defines the entry point for the console application.
//
#include "stdafx.h" //выдавал ошибку пока не вписала эту строчку, она обязательна всегда?
#include <iostream> //Почему пишем это ПОСЛЕ stdafx.h?
 
using namespace std;
 
int main();
int main()
{
    cout<< "Hello world\n"; //что такое cout?
    return 0;
}


Вопросы в комментариях. Я как-то запуталась немного.
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
Регистрация: 17.11.2010
Сообщений: 8
23.11.2010, 17:33  [ТС]     Вопросы начинающего #14
Цитата Сообщение от daemonik Посмотреть сообщение
stdafx-это Precompiled Header, что бы его не было-кликни на название проекта(в данном случае на Hello)правой кнопкой, выбери Properties->C/C++->Precompiled Headers и рядом со строкой Precompiled Header выбери Not Using Precompiled Headers.
а что бы было проще, просто когда создаёшь проект-не выбирай сразу Finish а нажми Next и выбери Empty Project.
iostream-это с++ а stdio.h - это с

cout-оператор вывода
cin-оператор ввода
Спасибо за советы.
А в c++ используется iostream всегда, все программы начинаются с этого? Используется ли stdio.h?При изучении по Пахомову фигурировал как раз stdio.h.
Извините если задаю глупые вопросы, просто пока не пойму, что к чему.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.11.2010, 17:49     Вопросы начинающего #15
Цитата Сообщение от Питоша Посмотреть сообщение
А в c++ используется iostream всегда, все программы начинаются с этого?
во многих консольных приложениях
Цитата Сообщение от Питоша Посмотреть сообщение
Используется ли stdio.h?
Можно использовать, но в С++ программах не желательно
Питоша
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
25.11.2010, 15:12  [ТС]     Вопросы начинающего #16
всем доброго дня.
Появился вопрос.
КОД:
C++
1
2
3
4
5
6
7
8
9
10
11
12
// I love CPP.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int main()
{
    cout <<"I Love C++ \n";
    return 0;
}
Без using namespace std; выдает ошибку.


Если вводить #include <iostream.h> то также выдает ошибку.
Почему?

Всегда ли нужно, если пишем #include <iostream> писать ниже using namespace std;. может просто нужно что-то подписать в iostream?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.11.2010, 15:19     Вопросы начинающего #17
Питоша, iostream трогать не стоит. Это хедер и можно там такого переправить, что ничего не станет работать.

А про std - почитайте ка вы про пространства имен.
std - пространство имен. Стандартное как заметно по названию.

Можно явно указывать.

C++
1
std::cout<<;
Можно писать.

C++
1
2
using std::cout;
cout<<;
Можно писать.

C++
1
2
using namespace std;
cout<<;
Кто как. Но я предпочитаю первый вариант. А про пространство имен все-таки почитайте. Хорошая штука.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.11.2010, 15:24     Вопросы начинающего #18
ForEveR, я тоже вариант с явным указание пространства предпочитаю.
Питоша
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
25.11.2010, 15:41  [ТС]     Вопросы начинающего #19
ForEveR, пока я до пространства имен не дошла, в книге просто написано.. впишите и будет работать, подробнее расскажем потом

А в явном виде получается нужно каждый раз перед cout писать std, а я как поняла написав единожды using namespase std; далее уже определять, что cout находится в std не нужно? (пишу так, как поняла я значение пространства имен, не изучая его пока, если не права-поправьте)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2010, 16:00     Вопросы начинающего
Еще ссылки по теме:

C++ C++ для начинающего!
Opengl и С++ для начинающего C++
C++ Подскажите для начинающего!

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.11.2010, 16:00     Вопросы начинающего #20
Питоша, Приблизительно верно. Но не надо вестись на простоту) Я бы посоветовал писать std:: (туда естественно включен не только cout). Или хотя бы писать using namespace std в локальной области видимости
Yandex
Объявления
25.11.2010, 16:00     Вопросы начинающего
Ответ Создать тему
Опции темы

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