Язык си — Программа, считающая слова в предложении.


Содержание

Описание функций языка Си

All | _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

getw – чтение одного слова из указанного потока данных.

#include
int getw (FILE *stream);

stream – указатель на поток данных.

В случае успешного чтения слова возвращается код считанного слова.

Если достигнут конец файла, а данные не были считаны, то возвращается EOF и устанавливается признак конца файла.

Если при чтении слова произошла ошибка, то возвращается EOF, а переменной errno присваивается код ошибки.

Функция getw считывает одно слово из указанного аргументом stream потока данных.

Если достигнут конец файла или при чтении файла произошла ошибка возвращается код EOF (обычно -1). Для того, чтобы отличить конец файла от ошибки используются функции feof и ferror.

В примере из заранее созданного файла test.txt, располагающегося в одной папке с программой, считываются данные с помощью функции getw, пока не будет достигнут конец файла. В файле заранее сохранена строка: «тест чтения». Считанные данные и отчет о работе выводятся на консоль

Открытие файла: выполнено
Коды считанных символов:
0xD4D3C5D4 0xC5D4DE20 0xAD1C9CE
Чтение файла закончено
Закрытие файла: выполнено

Пример простой программы на языке Си

Программу на языке Си можно условно разделить на две части:

1. декларативную (описание);

2. императивную (исполняемую).

Часть I – директива препроцессора

– объект включения (прототипы функций стандартного ввода, вывода).

Компилятор получает директиву, ищет текст, берет копию и присоединяет ее к тексту программы.

Часть II – исполняемая.

main() – имя главной функции, т.е. выполнение программы начинается с этой функции. У функции есть имя и тело. В теле функции тоже может быть две части – декларативная и императивная.

Декларативная – int a,b;

Императивная – остальная часть тела функции.

Рассмотрим функцию вывода на стандартный терминал:

I – строка формата (в кавычках).

II – объекты вывода (через запятые).

%d – спецификатор вывода (целочисленное значение).

\n – управляющая последовательность, перевод курсора на начало следующей строки.

Замечание: Возможно задание в спецификаторе ширины поля:

Пример: /* Элементы программы */

char cStr[]=”Русский текст. ”;

/* Нотация Windows*/

Рассмотрим элементы ”венгерской нотации” (венгерский программист фирмы Microsoft Чарльз Симони) — имена переменных начинаются со строчной буквы или букв, описывающих тип данных переменных (префикс).

Префикс Соответствующий тип данных
b BOOL (целое число)
c Character (символ)
i Integer (целое число)
p Указатель
s Строка
v Void
w Word

При работе с компилятором Visual C++ существует проблема вывода на экран букв русского алфавита. Для решения этой проблемы обычно используют функцию CharToOem(), прототип которой описан в

Пример: /*Использование русского текста при выводе*/

Язык си — Программа, считающая слова в предложении.

M. УЭИТ С. ПРАТА Д. МАРТИН

Язык Си — руководство для начинающих

Книга: Язык Си — руководство для начинающих

ПРОГPAMMA ПОДСЧЕТА СЛОВ

ПРОГPAMMA ПОДСЧЕТА СЛОВ

Теперь у нас есть возможности для написания программы подсчета числа слов в тексте. (Она может также подсчитывать символы строки.) Решающим моментом является разработка способа, с помощью которого программа будет распознавать слова. Мы будем придерживаться сравнительно простого подхода и определим слово как последовательность символов, которая не содержит «пуcтых символов». Поэтому «glymxck» и «r2d2» — это слова. Пeременная word будет использоваться для хранения указания о том, является ли введенный символ частью данного слова или началом следующего. Появление «пустого символа» (которым может быть пробел, табуляция или «новая строка») служит признаком конца слова. Тогда следующий «непустой» символ будет означать начало нового слова, и мы сможем увеличить значение счетчика слов на 1.

Вот эта программа:

int ch; /* введенныйсимвол*/

long nc = 0L; /* число символов */

int n1 = 0; /* число строк */

int nw = 0; /* число слов */

int word = NO; /* = = YES, если содержимое ch — часть слова */

while((ch = getchar( )) != EOF)

nc++ ; / * подсчет символов * /

if (ch = = ‘n’ ) nl++; /* подсчет строк */

if (ch != ‘ ‘ && ch != ‘n’ && ch !=’t’ && word ==NO)

word = YES; /* начало нового слова */

if ((ch = = ‘ ‘ || ch = = ‘n’ || ch = = ‘t’ ) && word == YES)

word = NO; /* достигнут конец слова */

printf(» символов = %1d, слов = %d, строк = %dn», nc, nw, nl);

Цукерберг рекомендует:  Работа с переменными в JavaScript

Поскольку существуют три различных «пустых символа», мы должны использовать логические операции для проверки всех трех возможностей. Рассмотрим, например, следующую строку:

if(ch != ‘ ‘ && ch != ‘n’ && ch != ‘t ‘ && word == NO).

В ней говорится: «если содержимое chне пробел, и не новая строка, и не табуляция, и не первый символ слова». (Первые три условия эквивалентны проверке, не является ли содержимое ch пустым символом). Выполнение всех четырех условий служит признаком начала нового слова, и значение переменной nw увеличивается. Если мы в середине слова, то первые три условия оказываются вы полненными, но значением переменной word окажется признак YES, и значение переменной nw не увеличивается. Когда в процессе ввода встретится очередной «пустой» символ, переменной word будет вновь присвоен признак NO.

Просмотрите программу и проверьте, правильно ли она интерпретирует случаи, когда между словами находится несколько «пустых» символов подряд.

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

Количество слов в строке

Вводится строка, состоящая из слов, разделенных пробелами. Требуется посчитать количество слов в ней.

  1. Введем счетчик слов и переменную-флаг, сигнализирующую, находимся ли мы внутри слова или нет.
  2. Если очередной символ не пробел, и флаг показывает, что мы не внутри слова, то следует увеличить переменную-счетчик слов и изменить флаг.
  3. Иначе если текущий символ пробел, то установить флаг в значение «вне слова». (Когда символ не пробел, и мы находимся внутри слова, то ничего делать не надо.)

main ( ) <
char str [ 255 ] ;
int i , count , flag ;
gets ( str ) ;
count = 0 ;
flag = 0 ;
for ( i = 0 ; str [ i ] != ‘ \0 ‘ ; i ++ )
if ( str [ i ] != ‘ ‘ && flag == 0 ) <
count += 1 ;
flag = 1 ;
> else
if ( str [ i ] == ‘ ‘ ) flag = 0 ;
printf ( «%d \n » , count ) ;
>

# 1-й вариант («классический»):

s = input ( )
count = 0
flag = 0
for i in range ( len ( s ) ) :
if s [ i ] != ‘ ‘ and flag == 0 :
count + = 1
flag = 1
else :
if s [ i ] == ‘ ‘ :
flag = 0
print ( count )

# 2-й вариант (через преобразование в список):

s = input ( )
s = s. split ( )
l = len ( s )
print ( l )

Метод split() разбивает строку по пробелам (по умолчанию) или символам, которые передаются как аргументы. Возвращает список.

Подсчет количества слов в строке

Задача

Подсчитать количество слов во введенной пользователем строке.

Для упрощения задачи считаем, что слова разделяются исключительно одним пробелом, а первый и последний символы строки не являются пробелами.

Решение

str — строка;
i — счетчик;
count — подсчет количества слов.

Алгоритм решения задачи:

  1. Измеряем длину введенной пользователем строки.
  2. Если длина не нулевая, то это значит, что есть хотя бы одно слово.
  3. Перебираем каждый символ строки.
  4. Если очередной символ является пробелом, то увеличиваем счетчик слов.

Программа на языке Паскаль:

Программа не будет корректно работать, если слова разделены больше, чем одним пробелом.

Другой вариант задачи: подсчитать количество слов в строке и вывести длину каждого слова.

Решение задач «Программа на языке C, считающая количество слов в строке (предложении).»,
Программирование на языках высокого уровня, С++

Эта работа успешно выполнена на онлайн-сервисе помощи студентам «Всё сдал!».


  • Задание
  • Обсуждение

Программа на языке C, считающая количество слов в строке (предложении).

Код есть, но программу нужно переделать — добавить к ней ещё одну функцию (написать свою), чтобы функция посчитала количество слов во введённой строке. #include #include int main() < int i; char myString[40]; printf("Vvedyte stroku: "); gets(myString); int space=0; for ( i =1; i Подобной или другой работы

Программа для подсчета слов

DjCrazy

domny

DarkKnight

DjCrazy

DjCrazy

DarkKnight

OemToCharA(str,str); //Переведем строку в Ansi для совпадения кодов
Вот эта строка говорит об однозначности кодировки.

Добавлено: и кроме того:

нужно подсчитать количество разных слов которые разделены

ключевое слово разных не вижу где у вас проверка на уникальность слова в строке.

Разделители любые, так что это не вариант, «дом» «домовой» — разные слова как не крути. А ты сразу же скажешь — что слова не уникальны.

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

DarkKnight

Я прекрасно понял о чем вы говорили, в своем посте. Использование isspace(), ispunct() или еще проще isalnum (если исходить от противного по вашему методу), затрудняют логику и понимание. Подумайте сами, данный раздел форума носит в первую очередь педогогическую функцию. И человеку, куда нужнее понять, как в C++ хранятся строки типа char*, как компилятор инициализирует или определяет конец строки или как хранит строку всего с одним символом. Как не делает разницы между типами char-вроде бы символьным, и int. Как свободно преобразуется в целочисленную последовательность кодов русское слово.
Смысл написание программ в этом разделе, по моему мнению, это затрагивание того материала, который уже знает автор прозьбы. И написание как можно более понятного для него кода. А писать фразы, типо, обойти элементы массива лучше p++; (когда p — указатель на него); или ключевое слов, поверьте я тоже не плохо могу. Но когда подход написания я выбираю не для оптимизации или сужения кода, к критике подхожу резко.

Цукерберг рекомендует:  Вакансии Качественные Программные Решения

Как стать программистом

Обучение основам программирования на C для чайников.

Страницы

Последние новости

YoungCoder теперь и на Stepikе. Записывайтесь: https://vk.cc/75rISy

Чтобы записаться на курс, необходимо зарегистрироваться на Степике: https://vk.cc/75rIC4

Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS

воскресенье, 4 августа 2013 г.

Занятие 14. Строки и символьные массивы в языке Си.

Прочитайте улучшенную версию этого урока «Ввод и вывод символьных строк».

В новой версии:

  • Ещё более доступное объяснение
  • Дополнительные материалы
  • 12 задач на программирование с автоматической проверкой решения
Рис.1. Символьный массив
Рис 2. Символьная строка

Объявление и инициализация строк.

Рис.3. Символьный массив после объявления
  • Как и любая переменная, строка может быть инициализирована (т.е. ей присвоено некоторое значение) непосредственно при её объявлении.
  • Мы можем не задавать при инициализации размер массива.
Рис. 4. Вывод на экран символьного массива без нулевого элемента в конце

Ввод и вывод строк.

Рис.5 Ввод строки с использованием функции scanf().
Рис. 6. Ввод строки с использованием функции gets()
  1. Массив символов, в который необходимо записать вводимую строку.
  2. Количество символов, которые может считать функция с учетом символа конца строки. В нашем случае это 10, т.е. рабочих из них девять, и один зарезервирован для конца строки.
  3. Откуда читать данные. В нашем случае указан стандартный поток ввода.
Рис.7. Ввод с помощью функции fgets().
Рис.8. Иллюстрация особенностей ввода функции fgets().
Рис.9. Использование стандартных функций вывода строки puts(), fputs(). Особенности вывода.
  • На вход программе подается строка, длинной не более 100 символов. Напишите программу, которая определяет длину этой строки, без учета нулевого символа.
  • Напишите программу, которая переводит данную строку в нижний регистр. Т.е. и строки «Hello WorlD» должна получиться строка «hello world»
  • На вход программе подается строка, длинной не более 100 символов. Определить, является ли она перевертышем. Например, как слово «шалаш» или «топот». Учтите что строка может содержать пробелы, их учитывать не нужно. Например, строка «А роза упала на лапу Азора» будет являться перевертышем.
  • Пользователь вводит две строки. Необходимо сравнить их между собой, и вывести yes если строки полностью совпадают, или no в противном случае. Регистр учитывать не нужно. Т.е строки «Hello WorlD» и «hello world» считаются двумя одинаковыми строками.
  • Напишите программу, которая читает из файла строку, длинной не более 200 символов. И считает количество вхождения в строку всех используемых в ней символов,без учета регистра. На вход поступает строка состоящая из букв латинского алфавита и пробелов. Программа должна вывести в первой строке длину введенной строки. В следующих строках встречаемые символы и их количество. Например, для строки «hello world», вывод будет следующим.

11
d — 1
e — 1

h — 1
l — 3
o — 2
r — 1
w — 1
probel — 1

  • Капитан Флинт зарыл клад на Острове сокровищ. Есть описание, как найти клад. Описание состоит из строк вида: «North 5», где первое слово – одно из «North», «South», «East», «West», а второе целое число – количество шагов, необходимое пройти в этом направлении. Напишите программу, которая по описанию пути к кладу определяет точные координаты клада, считая, что начало координат находится в начале пути, ось OX направлена на восток, ось OY – на север. На вход подается последовательность строк указанного формата. На выходе программа должна вывести координаты клада – два целых числа через пробел

Например:
Вход:

North 5
East 3
South 1
Выход: 3 4.

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

123 комментария :

Самый непонятный урок для меня :(
Особенно с длинной строки.
«Количество символов, которые может считать функция с учетом символа конца строки. В нашем случае это 10, т.е. рабочих из них девять, и один зарезервирован для конца строки.»

Почему 9 да еще и минус один под конец строки и того 8? А на выводе все равно получается, что считали и вывели 9 символов. (Листинг 14.8)

Последний символ 100% записывается в конец строки и считается n-ным (последним) элементом массива? Как этот символ считать? т.е. как написать for (i = 0; i == конец строки; i++); (ага пока читал извилина шевельнулась. Не знаю только в правильную ли сторону :) Получается так сделать нельзя т.к. мы сначала i приравниваем к целому числу, а потом хотим проверить не равено ли он символу. Тогда все равно не понятно как сделать такой цикл, что бы он выполнялся до конца строки).

char str[];
Если я введу с клавиатуры ‘Hello world’ и жмакну enter.
gets(str) — считает Hello world\0
fgets(str,11,stdin) — считает Hello worl\0\n
И длинна массива в обоих случаях будет 12 символов? Так?
Ну и продолжая тему с функциями ввода вывода. Получается:
puts(str) — выведет Hello world\0\n
fputs(str,stdout) — выведет Hello world\0

Цукерберг рекомендует:  Тест по Алгоритмам и структурам данных. Алгоритмы и структуры данных на Python

Я наверное коряво написал. Смотрите 10 можете считать. Из них рабочих 9. А десятый, который не рабочий как раз и зарезервирован под конец строки.

Вы забыли, что тип char совместим с целым типом. каждому символу соответствует число, код этого символа в таблице ASCII. Вот символу конца строки соответствует число нуль. Поэтому конец строки мы можем проверять как str[i] != 0;

Длина массива и длинна строки это разные вещи ведь. Длинна массива может быть и 100 элементов, а вот длина строки, которая хранится в этом массиве может быть и меньше. Например, Литстинг 14.3
Длинна массива str 17 элементов, а длина строки, которую мы туда поместили всего двенадцать. Из них, как мы уже разобрались 11 рабочие и последний, двенадцатый символ конца строки. )

Теперь, с учетом этих пояснений попробуйте ответить на свои последние вопросы или переформулировать их. Если не получится, напишите я или отвечу или дам еще подсказку. )

Подсчет слов в строке

Я изучаю C ++ самостоятельно. Я написал эту программу для подсчета количества слов в строке. Я знаю, что это не лучший способ сделать это, но это было то, о чем я мог думать.

Я использую пробелы для подсчета количества слов. Здесь проблема.

p.s Я хочу, чтобы эта программа не считала символы типа «!», «?» как слова Вот мой код:

Решение

Ваша функция может быть уменьшена до этого:

Изменить: Чтобы прокомментировать комментарий:

Вот простой способ заменить других персонажей ‘ ‘ думал, что может быть метод сборки для этого:

Другие решения

Проблема с вашим ответом состоит в том, что вы подсчитываете количество слов, после которых стоит знак «». Я полагаю, что вы начинаете с Num = 1, потому что вы не будете считать последнее слово. Однако это происходит только тогда, когда анализируемая строка не заканчивается на ». В противном случае у вас будет еще 1 слово. Самый простой способ исправить это добавить

прямо перед возвращением ответа.

Ваше решение недостаточно. Это потерпит неудачу при применении с:

  • Ведущие пространства
  • Конечные пробелы
  • Только пробелы
  • Другие формы пробелов

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

Или вы можете не изобретать велосипед и использовать то, что стандартная библиотека уже предоставляет, например:

Вот std::istringstream а также std::istream_iterator используется для токенизации строки, и std::distance используется для получения количества извлеченных токенов.

Я нашел лучшее использование потока строк:

Входные данные: » Привет, мой дорогой друг «
Выход: 4

Он не потерпит неудачу, даже если он используется с:

  • Ведущие пространства
  • Конечные пробелы
  • Только пробелы
  • Другие формы пробелов

Это просто и быстро на моей машине. Он перебирает строку, используя bool выслеживать
будь то внутри слова или нет, и пробельные символы в качестве разделителей слов. Я проверил с isspace() функция библиотеки, но это switch Заявление было немного быстрее.

Это легко расширить или изменить для разных разделителей слов. Вот версия, которая рассматривает любой не алфавитный символ как разделитель. Изменение !isalpha() позвонить isspace() даст те же результаты, что и код выше.

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

И чтобы быть ясным, мы не хотим, чтобы такие символы, как, «,», «!» , «?», «.» «\ n» считается словами. Но очевидно, что «я» следует считать словом, как мы это считаем на языке. Я убедился во всем этом, заменив их пробелами. Дайте мне знать, если я что-то пропустил.

Добавьте следующие строки в код

это исключило бы количество пробелов в начале строки

Количество слов в предложении

Страница 1 из 2 1 2 >
Страдалецъ
Посмотреть профиль
Отправить персональное сообщение для Страдалецъ
Отправить Email для Страдалецъ
Найти все сообщения от Страдалецъ

Потому что scanf не предназначен для чтения строк с пробелами.

Ну вопервых tokenPtr = strtok(NULL, » «); ничего вам не даст. Икать пробел надо в строке, так как вы это делали выше tokenPtr = strtok(s, » «);
Во вторых, вы ничего не делаете со строкой в цикле и будет цикл у вас поэтому крутится до бесконечности.

Например, для каких не выполняется?
( )* — выполняется.
— выполняется.
— выполняется.
Все комбинации описанных правил тоже выполняются.
Однобуквенные слова обрабатываются верно.

Тестил на строках

Например, для каких не выполняется?
( )* — выполняется.
— выполняется.
— выполняется.
Все комбинации описанных правил тоже выполняются.
Однобуквенные слова обрабатываются верно.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих