Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 17.11.2010
Сообщений: 8
1

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

17.11.2010, 16:26. Показов 2423. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Самостоятельно приступила к изучению 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?

спасибо ))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2010, 16:26
Ответы с готовыми решениями:

Вопросы начинающего
Здравствуйте в С++ я еще новичок, поэтому, если позволите то я задам несколько вопросов -class A:...

C++ для начинающего!
Добрый день! Вопрос местным знатокам и гуру. Есть желание начать программировать на C++. Проблема в...

Вопрос начинающего
Здравствуйте. Мне сейчас 16 лет и в сентябре я пойду в 11 класс (я школота). В будущем я хочу стать...

Книга для начинающего
Посоветуйте книгу для первокурсника по c++. препод посоветовал гебрерда шилдта &quot;C++. Базовый курс&quot;....

23
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
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;
}
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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 / 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++?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
19.11.2010, 11:46 7
вот там книжка нарисована, есть на русском
0
Kastaneda
19.11.2010, 14:27
  #8

Не по теме:

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

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
19.11.2010, 14:28 9
Цитата Сообщение от Питоша Посмотреть сообщение
Насколько сильно Visual C++ отличается от C++?
Для начала: 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
Цитата Сообщение от 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".
0
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 / 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.
Извините если задаю глупые вопросы, просто пока не пойму, что к чему.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
23.11.2010, 17:49 15
Цитата Сообщение от Питоша Посмотреть сообщение
А в c++ используется iostream всегда, все программы начинаются с этого?
во многих консольных приложениях
Цитата Сообщение от Питоша Посмотреть сообщение
Используется ли stdio.h?
Можно использовать, но в С++ программах не желательно
0
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?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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<<;
Кто как. Но я предпочитаю первый вариант. А про пространство имен все-таки почитайте. Хорошая штука.
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2010, 16:00
Помогаю со студенческими работами здесь

Подскажите для начинающего!
Подскажите с чего лучше начать изучать программирование для начинающего? Какие книги нужны?С...

Opengl и С++ для начинающего
Приветствую всех! Можете пожалуйста подсказать хорошую книгу или видео урок по opengl и c++ для...

Книга для начинающего по С++
Скажите, какая книга доступно мне покажет программирование на С++??? вопрос от новичка, даже не...

вопрос от начинающего програмиста :)
есть определенная форама, с набросаными на нее лейбами баттонами радиобаттонами имейджами и еще...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru