Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> getchar() и несложный алгоритм, не понимаю как работает (и работает ли) 
:(
    Опции темы
APXEOLOG
Дата 8.1.2009, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.4.2007
Где: Мурманск

Репутация: нет
Всего: 1



Начал учить си по учебнику Б. Кернигана и Д. Ритчи.
В разделе про ввод\вывод там приведен такой код:
Код

/*Следующая программа подсчитывает строки. Как упоминалось выше, стандартная библиотека обеспечивает такую
модель ввода-вывода, при которой входной текстовый поток состоит из последовательности строк, каждая из которых
 заканчивается символом новой строки. Следовательно, подсчет строк сводится к подсчету числа символов новой строки.

*/
#include <stdio.h>
/* подсчет строк входного потока */
main()
{
    int c, nl;
    nl = 0;
    while ((с = getchar()) != EOF)
        if (c == '\n')
            ++nl;
    printf(“%d\n”, nl);
}


И вот теперь вопрос: getchar() возвращает код символа. Как можно код символа сравнивать с '\n' ??

Еще вопрос: когда я запускаю программу то она так и не выдает результата, а все принимает и принимает  строки. Почему? я думал что While относиться только к разовому прохождению getchar по введенной строке...

Это сообщение отредактировал(а) APXEOLOG - 8.1.2009, 23:03
--------------------
Ученые долго не знали как назвать частоту.Потом так и назвали Hz.
PM MAIL ICQ   Вверх
pan2004
Дата 9.1.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 2
Всего: 9



Цитата(APXEOLOG @  8.1.2009,  22:58 Найти цитируемый пост)
 Как можно код символа сравнивать с '\n'

А что такое '\n', знаешь? Это символ новой строки. Впринципе, об этом недвусмысленно в комментариях и сказано.

Цитата(APXEOLOG @  8.1.2009,  22:58 Найти цитируемый пост)
Почему?

Наверное, ждет символа конца файла(EOF). Как он вводится с клавиатуры - не помню, Ctrl + чтототам smile 


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
APXEOLOG
Дата 9.1.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.4.2007
Где: Мурманск

Репутация: нет
Всего: 1



А правда что если писать "\n" - то это будет восприниматься как 2 симвоа (\n) а если писать '\n' - то это будет восприниматься как код новой строки?

И как сделать чтобы getchar() обрабатывал только 1 введенную строку (вписал строку нажал ентер и все)

С помощью чего можно узнать он нажатии кнопки (например стрелочек)?

Это сообщение отредактировал(а) APXEOLOG - 9.1.2009, 13:05
--------------------
Ученые долго не знали как назвать частоту.Потом так и назвали Hz.
PM MAIL ICQ   Вверх
yngwie19
Дата 9.1.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



pan2004, Ctrl^z
PM MAIL   Вверх
Avaj
Дата 9.1.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 14.7.2008
Где: Владивосток.

Репутация: 1
Всего: 3



Цитата

А правда что если писать "\n" - то это будет восприниматься как 2 симвоа (\n) а если писать '\n' - то это будет восприниматься как код новой строки?


Нет, всё что в  кавычках - строки, в данном случае, "\n" - строка из одного символа - '\n'.(ну возможно в конце ещё есть '\0')


Цитата

И как сделать чтобы getchar() обрабатывал только 1 введенную строку (вписал строку нажал ентер и все)


По-моему getchar() аргументом принимает символ (с клавиатуры), а не строку. Если тебе нужно строку, лучше gets().


Цитата

С помощью чего можно узнать он нажатии кнопки (например стрелочек)?


Я так подозреваю с помощью getchar(), но точно не знаю, тут в google можно обратиться, или подождать когда ответят знающие люди.

И ещё по языку Си есть учебник Подбельского, там по-моему по-подробней написано, хотя конечно "K&R" - "must read" smile .

Это сообщение отредактировал(а) Avaj - 9.1.2009, 14:12
PM MAIL   Вверх
seravr
Дата 9.1.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Объясняю все по пунктам:

1) писать надо либо

void main()
{    
    .
    .
    .
}

но лучше на первых порах пиши 
int main()
{
    .
    .
    .
    return 0;
}
со временем сам поймешь 

2) getchar()-(прототип int getchar(void))-считывает очередной символ из стандартного входного потока
3) у тебя в программе инициализируются 2 переменные типа int: c-в нее записывается очередной считанный символ из входного потока, nl-счетчик числа строк, т.е. сколько раз встречается '\n'-символ новой строки
4)в цикле while условием является строчка (с = getchar()) != EOF
советую тебе выучить наизусть приоритет операций языка С!!!

Давай разберем это условие, во-первых, истинно оно будет всегда, пока очередной символ,считанный из входного потока,не равен EOF(для Windows это комбинация клавишь Ctrl^z, как сказал это уже yngwie19)

(с = getchar()) != EOF

Покажем как это работает:

сначала работает с = getchar(), функция  читает символ из входного потока и возвращает его значение типа int, затем его мы присваиваем переменной с, затем мы проверяем !=(не равно) EOF, если не равно-значит истина и мы попадаем в тело цикла
Там стоит
if (c == '\n')
если  с не равно '\n', переходим к проверке условия в цикле.
а если с равно '\n', то увеличиваем счетчик ++nl, затем переходим опять к проверке условия, и так пока ты не введешь комбинация клавишь Ctrl^z

Когда наконец-то ты введешь комбинация клавишь Ctrl^z,условие в цикле с = getchar()) != EOF станет ложным, и мы покидаем цикл и переходим к следующей строчке printf(“%d\n”, nl);, где мы выводим значение счетчика, затем должна стоять строчка return 0, которая передает управление в твоем случае Windows

Мой совет тебе, почитай Подбельского, выучи таблицу приоритетов операций, уясни как работают циклы, что для них является ложью и истинной, и на последок, старайся всегда инициализировать все переменные в их объявлении, потому что в них храниться мусор и это может приводить к логическим ошибкам и т.д.

P>S> НА СИНТАКСИЧЕСКИЕ ОШИбКИ НЕ ОбРАЩАЙТЕ ВНИМАНИЯ 
PM MAIL   Вверх
APXEOLOG
Дата 9.1.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 12.4.2007
Где: Мурманск

Репутация: нет
Всего: 1



Спасибо, сажусь за теорию углубленно.

=====

Может ли функция возвращать массив значений? (Без использования указателей и изменения глобальных переменных)

Это сообщение отредактировал(а) APXEOLOG - 9.1.2009, 16:16
--------------------
Ученые долго не знали как назвать частоту.Потом так и назвали Hz.
PM MAIL ICQ   Вверх
pan2004
Дата 9.1.2009, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 2
Всего: 9



Цитата(APXEOLOG @  9.1.2009,  16:13 Найти цитируемый пост)
Может ли функция возвращать массив значений? (Без использования указателей и изменения глобальных переменных)

1. Используй ссылки(хотя все равно почти что указатели)
2. можно возвращать переменные любых типов, в тч классы и структуры. Туда можно что угодно запихнуть
Цитата(APXEOLOG @  9.1.2009,  13:03 Найти цитируемый пост)
А правда что если писать "\n" - то это будет восприниматься как 2 симвоа (\n) а если писать '\n' - то это будет восприниматься как код новой строки?

"\n" - строка из двух символов, '\n' и '\0'
эскейп последовательности типа \n \t usw компилятором всегда преобразуются в соответствующие символы.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
seravr
Дата 9.1.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



не забивайте человеку голову ссылками, пусть изучит сначала поглубже язык С

Стек то не резиновый

Это сообщение отредактировал(а) seravr - 9.1.2009, 17:48
PM MAIL   Вверх
vinter
Дата 9.1.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(seravr @  9.1.2009,  18:46 Найти цитируемый пост)
не забивайте человеку голову ссылками, пусть изучит сначала поглубже язык С

зачем? может еще какой язык посоветуешь перед С++?


--------------------
Мой блог
PM MAIL WWW   Вверх
seravr
Дата 9.1.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



что зачем?
если он указатели то не понимает, зачем ему про ссылки рассказывать

Это сообщение отредактировал(а) seravr - 9.1.2009, 23:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.