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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С. Подсчет количества символов. получается в 2 раза больше 
:(
    Опции темы
student80
Дата 24.6.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Абучю рускаму язаку
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 504
Регистрация: 18.4.2006

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



Вот такой код. на Си.
Код

#include <stdio.h>
main ()
    {
    int c;
    for (c = 0; getchar () != 'q'; ++ c)
        ;
    printf ("%d\n", c);
    }

и на печать выдается количество введенных символов ровно в 2 раза больше, чем было введено.
почему?
PM MAIL   Вверх
rrrFer
Дата 24.6.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



student80, 
наверно пробелы и <enter> тоже считаются smile
т.е. если ввести abcq<enter> то выведется 3- правильно
возможно вам так надо: ?
Код

#include <stdio.h>
main (){
    int c;
    char ch;
    for(c = 0;ch=getchar();){
        if(ch<11)
            break;
        if(ch==32||ch==9)
            continue;
        if(ch==8&&c!=0)
            c--;
        else
            c++;
    }
    printf ("%d\n", c);
}

комментировать надо?

Это сообщение отредактировал(а) rrrFer - 24.6.2008, 18:04
PM MAIL WWW ICQ   Вверх
student80
Дата 24.6.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Абучю рускаму язаку
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 504
Регистрация: 18.4.2006

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



Цитата

#include <stdio.h>
main (){
    int c;
    char ch;
    for(c = 0;ch=getchar();){
        if(ch<11)
            break;
        if(ch==32||ch==9)
            continue;
        if(ch==8&&c!=0)
            c--;
        else
            c++;
    }
    printf ("%d\n", c);
}

 smile я до такого еще не дочитал
наверное ентер считается...

в этом коде ch<11 и ch==32||ch==9 и ch==8&&c!=0 что означают?
PM MAIL   Вверх
rrrFer
Дата 24.6.2008, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



student80, 
вы перепечатали и я сразу нашел ошибку не зря говорят что в чужом коде виднее
надо так:
Код

#include <stdio.h>
main (){
    int c;
    char ch;
    for(c = 0;ch=getchar();){
     if(ch==10)
            break;
        if(ch==32||ch==9)
            continue;
        if(ch==8&&c!=0)
            c--;
        else
            c++;
    }
    printf ("%d\n", c);
}

getchar возвращает значение в формате int - ASCII код символа
Открываем таблицу ASCII кодов:
10 - символ новой строки, когда его встречаем -выходим из цикла:
Код

 if(ch==10)
            break;

9 - табуляция
32 - пробел
в таком случае символ не учитываем, т.е. не изменяя значение счетчика, начинаем новую итерацию чикла:
Код

if(ch==32||ch==9)
            continue;

8 - Backspace, если его нажали, значит удалили символ, а поэтому уменьшаем значение счетчика, однако, если уже стерли(или еще не ввели ни одного) символы, то уменьшать ничегь не надо, потому условие такое:
Код

  if(ch==8&&c!=0)
            c--;

ну а в инном случае увеличиваем значение счетчика.
----------
впринципе можно было бы использовать функцию iswspace из <ctype.h>, которая проверяет является ли символ разделительным, но Т.к. она возвращает 1 если символ является: пробелом, табуляцией, СИМВОЛОМ НОВОЙ СТРАНИЦЫ, то отдельно пришлось бы делать проверку на <enter>, а посему подключение библиотеки врядли будет оправданным
----
PS
В таблице ASCII кодов часто пишут например так код 10 символ lf так чтобы понять что это за символ такой глядим 
сюда например

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

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

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

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

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


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

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


 




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


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

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