Редактировать
Символы и основные операции над ними
Символы имеют тип char, занимают 2 байта и хранятся в кодировке Unicode (UTF-16).
var c1: char;
var c2 := 'z';
Для преобразования символа c
в код используется функция Ord(c)
, для обратного преобразования кода i в символ используется функция Chr(i)
.
begin
var c := 'ю';
Print(Ord(c)); // 1102
Print(Chr(1102)); // ю
end.
Классический способ определить символ, следующий за данным в кодовой таблице, — это преобразовать символ в код, прибавить к коду число и потом преобразовать полученный код снова в символ:
Аналогично определяется предыдущий символ
Методы типа char
Методы, встроенные в тип char, делятся на две категории:
- проверяющие, принадлежит ли символ указанной категории:
c.IsDigit
,c.IsLetter
,c.IsLower
,c.IsUpper
- преобразующие символ:
c.ToUpper
,c.ToLower
,c.ToDigit
.
Отметим, что c.IsDigit
эквивалентно (c >= '0') and (c <= '9')
и эквивалентно c in '0'..'9'
Для c.IsLower
, c.IsLower
, c.IsUpper
такой простой аналогии нет. Дело в том, что в этих методах проверяются все символы, являющиеся буквами в каком-то алфавите народов мира (в частности, английские и русские)
Отметим также, что c.IsLower
возвращает True
только если это буква в нижнем регистре — для не букв возвращается False
.
Строки
Введение
Отметим, что для строк имеется много операций и методов, не все из которых мы рекомендуем для школьников.
Основная причина — многие методы строк в .NET считают, что строки индексируются с нуля, а в Паскале строки индексируются с 1.
Для устранения этой дилеммы при работе со школьниками мы не используем методы строк, которые работают с индексами, индексируемыми с нуля. Для них существуют эквивалентные замены внешними функциями, которые предполагают, что строки индексируются с 1.
Индексация строк
Строки в Паскале индексируются с 1. К символам строк можно обращаться по индексам — s[i]
.
Например:
begin
var s: string;
s := 'тор';
Print(s[1],s[2],s[3]);
end.
Символы строк можно менять:
begin
var s := 'пир';
s[1] := 'м';
Print(s); // мир
end.
Можно использовать индексацию с конца: s[^i] обозначает i-тый символ с конца
begin
var s := 'мир';
s[^1] := 'г';
Print(s); // миг
end.
Циклы по строкам
begin
var s := 'привет';
for var i:=1 to s.Length do
s[i] := Chr(Ord(s[i])+1);
Print(s);
end.
foreach var c in s do
Print(c);
Операции +, *n и in
Строки можно складывать и умножать на целое положительное число
Пример. Генерация строки ‘abcdefghijklmnopqrstuvwxyz’
Идея. Начать с пустой строки. Всякий раз в цикле добавлять к строке символы от ‘a’ до ‘z’
Код
begin
var s := '';
for var c := 'a' to 'z' do
s += c;
end.
Методы Count, CountOf, Where
Чтобы посчитать количество символов в строке, удовлетворяющих определённому условию, используется метод Count. Если нужно посчитать, сколько раз встречается определенный символ, используется более простой метод CountOf
begin
var s := 'абракадабра';
s.CountOf('а').Print;
s := 'а123бр45а67к89адабра';
s.Count(c -> c.IsDigit).Print;
end.
Если в строке надо отфильтровать только определенные символы, используется метод Where. Он возвращает последовательность символов, которую можно назад преобразовать к строке, используя метод JoinToString:
begin
var s := 'а123бр45а67к89адабра';
s := s.Where(c -> c.IsLetter).JoinToString;
end.
s.ToWords и разбиение строки на слова
Метод s.ToWords разбивает строку на массив слов, используя пробел в качестве разделителя. Полученный массив можно преобразовать и слить в строку, используя метод JoinToString:
begin
var s := 'как однажды жак звонарь головой сломал фонарь';
var a := s.ToWords;
Sort(a);
s := a.JoinToString
end.
По умолчанию JoinToString разделяет слова пробелами
Функция Pos и процедуры Delete, Insert
Pos(subs,s)
возвращает позицию первого вхождения подстроки subs
в сторке s
или 0 если подстрока не найдена
Pos(subs,s,from)
начинает искать подстроку в строке с позиции from
.
Следующий код выводит позиции всех вхождений s1 в s:
begin
var s := 'абракадабра';
var s1 := 'бра';
var p := Pos(s1,s);
while p>0 do
begin
Print(p);
p := Pos(s1,s,p+s1.Length);
end;
end.
Для подсчета количества каких-либо символов, имеющихся в строке, можно использовать функции:
- countof
- count
В чем разница этих функций, и как их применить к решению задач, разберём в этой публикации.
Функция countof
Пусть дана строка
s:='231привет2432';
Вычислим количество цифр ‘2’:
d:=s.countof('2');
Функция s.countof(‘2’) подсчитывает количество цифр 2 в строке s, и в качестве своего аргумента использует символ 2, заключенный в апострофы.
Пример задачи 1
С клавиатуры вводится строка. Найти количество символов ‘Z’.
Программа решения на языке Паскаль
var s:string;k:integer;
begin
readln(s);
k:=s.Countof(‘Z’);
println(k);
end.
Пример задачи 2
С клавиатуры вводится строка. Верно ли, что строка содержит символ ‘9’?
Программа решения на языке Паскаль
var s:string;k:integer;
begin
readln(s);
k:=s.Countof(‘9’);
if k>0 then writeln(‘Строка содержит цифру 9’)
else writeln(‘В строке нет цифр 9’);
end.
Функция count
Пусть дана строка
s:='flower555';
Вычислим количество цифр ‘5’:
d:=s.count(c->c='5');
Функция s.count(c->c=’5′) в качестве своего аргумента принимает логическое выражение (условие). Переменная c в данном случае должна быть описана типом char в блоке var.
Преимуществом функции count перед функцией countof можно считать возможность применения сложных условий.
Пример задачи 1
С клавиатуры вводится строка. Найти количество символов ‘Z’ и ‘A’.
Программа решения на языке Паскаль
var s:string;c:char;k:integer;
begin
readln(s);
k:=s.Count(c->(c=’Z’)or(c<=’A’));
println(k);
end.
Результат выполнения программы
Пример задачи 2
С клавиатуры вводится строка. Найти количество символов цифр.
Программа решения на языке Паскаль
var s:string;c:char;k:integer;
begin
readln(s);
k:=s.Count(c->(c>=’0′)and(c<=’9′));
println(k);
end.
Результат выполнения программы
Пример задачи 3
Во введенной строке подсчитать все символы, кроме P.
Программа решения на языке Паскаль
var s:string;k:integer;c:char;
begin
readln(s);
k:=s.Count(c->not(c=’P’));
println(k);
end.
Результат выполнения программы
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 24 |
|
1 |
|
Подсчитать количество символов в слове23.06.2014, 23:47. Показов 9434. Ответов 12
Здравствуйте.
0 |
Cyborg Drone Модератор 9588 / 4908 / 3244 Регистрация: 17.08.2012 Сообщений: 15,334 |
||||
24.06.2014, 00:31 |
2 |
|||
Если строка s суть одно слово, то
0 |
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 24 |
|
24.06.2014, 06:56 [ТС] |
3 |
нет, строка не 1 слово, а предложение и нужно вывести то которое подходит условию.
0 |
Модератор 9588 / 4908 / 3244 Регистрация: 17.08.2012 Сообщений: 15,334 |
|
24.06.2014, 08:15 |
4 |
lakys, вот странность… Вы по неясной причине упомянутое Вами условие не указали…
0 |
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 24 |
|
24.06.2014, 09:14 [ТС] |
5 |
в любом случае есть предложение и нужно вывести конкретное слово которое выполняет условие в цикле.
0 |
1 / 1 / 0 Регистрация: 19.08.2013 Сообщений: 7 |
|
24.06.2014, 09:15 |
6 |
Какое условие то? По которому то или иное слово мы будем выбирать.
0 |
Sergio Leone 2509 / 1130 / 582 Регистрация: 07.06.2014 Сообщений: 3,286 |
||||
24.06.2014, 09:32 |
7 |
|||
Какое условие то? По которому то или иное слово мы будем выбирать. автор темы постом выше вашего ответил на этот вопрос… lakys, всё просто. на форуме сотни примеров кода, как разобрать строку на отдельные слова. И ещё, если нужно выделить слова, которые начинаются или заканчиваются на определённую букву, можно не выделять всё слово.
0 |
bormant Модератор 7534 / 4394 / 2785 Регистрация: 22.11.2013 Сообщений: 12,586 Записей в блоге: 1 |
||||
24.06.2014, 09:38 |
8 |
|||
Сообщение было отмечено lakys как решение Решение> есть предложение и нужно вывести конкретное слово которое выполняет условие в цикле.
1 |
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 24 |
|
24.06.2014, 09:52 [ТС] |
9 |
Sergio Leone, как определить это слово я понимаю а вот с тем как именно его вывести, а не всё предложение проблема. Просто у меня выводит слова начинающееся с «не» т.е. идет предложение в 1 момент стоит не и после выводит все до конца как бы мне определить конечный по счёту символ слова? Добавлено через 9 минут
0 |
Sergio Leone 2509 / 1130 / 582 Регистрация: 07.06.2014 Сообщений: 3,286 |
||||
24.06.2014, 09:58 |
10 |
|||
lakys, такой пример устроит?
0 |
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 24 |
|
24.06.2014, 10:29 [ТС] |
11 |
(ссылка на сторонний ресурс удалена) невеста я извеняюсь за ссылку если что. (ссылка на сторонний ресурс удалена) слово:
0 |
bormant Модератор 7534 / 4394 / 2785 Регистрация: 22.11.2013 Сообщений: 12,586 Записей в блоге: 1 |
||||
24.06.2014, 10:39 |
12 |
|||
Сообщение было отмечено lakys как решение Решение
как выводить более одного слова? Вопрос не понял.
Код немама немыла нераму Вроде бы больше одного слова выведено, нет? Тогда в чем именно вопрос?
1 |
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 24 |
|
24.06.2014, 11:39 [ТС] |
13 |
bormant выводится только 1ое слово с «не» а как сделать что бы выводило все слова с не? текст: Добавлено через 10 минут
0 |
Перейти к содержанию
Посчитать количество строк в файле и количество слов и символов в каждой строке
Просмотров 8.1к. Обновлено 15 октября 2021
В текстовом файле посчитать количество строк, а также для каждой отдельной строки определить количество в ней символов и слов.
Подсчет строк:
Ввести счетчик, присвоить ему 0.
Пока не будет достигнут конец файла, считывать очередную строку файла и увеличивать счетчик на 1.
Подсчет символов в строке:
Измерять длину очередной строки с помощью встроенный в язык программирования функции.
Подсчет слов в строке:
- Ввести счетчик слов и присвоить ему 0.
- Ввести флаговую переменную и присвоить ей 0 (сигнал нахождения вне слова).
- Пока не будет достигнут конец строки:
- Если очередной символ не пробел и флаг указывает на нахождение вне слова, то увеличить счетчик слов и присвоить флаговой переменной 1 (сигнал нахождения внутри слова).
- Если же очередной символ пробел, то присвоить флагу 0.
Pascal
var
f: text;
s: string;
line, chr, wrd: word;
i: byte;
flag: boolean;
begin
assign(f,'text.txt');
reset(f);
line := 0;
while not EOF(f) do begin
readln(f,s);
write(s, ' - ');line := line + 1;
chr := length(s);
write(chr, ' симв., ');wrd := 0;
flag := false;
for i:=1 to chr do
if (s[i] <> ' ') and (flag = false) then begin
wrd := wrd + 1;
flag := true;
end
else
if s[i] = ' ' then flag := false;
writeln(wrd, ' сл.');
end;
close(f);
writeln(line,' стр.');
end.
Hello world! - 12 симв., 2 сл.
Привет мир! - 20 симв., 2 сл.
One, two, three - 15 симв., 3 сл.
Один, два, три - 24 симв., 3 сл.
4 стр.
Файл выполнен в среде GNU/Linux, компилятор FreePascal. Русские символы считаются за 2 символа. Например, в данном примере во второй строке 9 кириллических символа, пробел и восклицательный знак: 18 + 2 = 20 символов.
Язык Си
посчитать количество строк в файле си
#include < stdio.h>
#include < string.h>
#define N 255
main() {
FILE *f;
char s[N];
unsigned short line, word, flag, i;
line = 0;
f = fopen("text.txt","r");
while (fgets(s, N, f) != NULL) {
line += 1;word = 0;
flag = 0;
for (i=0; i < strlen(s); i++)
if (s[i] != ' ' && flag == 0) {
word += 1;
flag = 1;
} else
if (s[i] == ' ') flag = 0;printf("%st%ld симв., %d сл.n",s,strlen(s),word);
}
printf("%d стр.n", line);
fclose(f);
}
Hello world!
13 симв., 2 сл.
Привет мир!
21 симв., 2 сл.
One, two, three
16 симв., 3 сл.
Один, два, три
25 симв., 3 сл.
4 стр.
Тот же «эффект», что и в Паскале: кириллический символ считается за 2.
Функция fgets() считывает строку вместе с символом перехода на новую строку. Аргумент N не позволяет считать больше указанного количества символов, но длина строки определяется по количеству считанных (т.е. фактической длиной строки).
Python
python количество строк в файле
f = open('text.txt')
line = 0
for i in f:
line += 1flag = 0
word = 0
for j in i:
if j != ' ' and flag == 0:
word += 1
flag = 1
elif j == ' ':
flag = 0print(i,len(i),'симв.',word,'сл.')
print(line,'стр.')
f.close()
Hello world!
13 симв. 2 сл.
Привет мир!
12 симв. 2 сл.
One, two, three
16 симв. 3 сл.
Один, два, три
15 симв. 3 сл.
4 стр.
Символ перехода на новую строку учитывается.
КуМир
использовать Файлы П
алг
нач
цел f, line, word, char, in, i
лит s
line := 0
word := 0
char := 0
f := открыть на чтение ("текст.txt")
нц пока не конец файла (f)
Фввод f, s
line := line + 1
вывод s, нс
char := char + длин(s)
in := 0
нц для i от 1 до длин(s)
если s[i] <> " " и in = 0 то
word := word + 1
in := 1
иначе
если s[i] = " " то in := 0 все
все
кц
кц
закрыть(f)
вывод нс, "строк - ", line, нс
вывод "слов - ", word, нс
вывод "символов - ", char
кон
Привет, Мир!
Hello World!
5, 4 ...строк - 3
слов - 7
символов - 32
Здесь считается общее количество слов и символов.
Basic-256
open "text.txt"
ln = 0
while not eof
ln = ln + 1
s$ = readline
i = 1
word = 0
flag = 0
while i <= length(s$)
c$ = mid(s$,i,1)
if c$ <> " " and flag = 0 then
word = word + 1
flag = 1
else
if c$ = " " then flag = 0
endif
i = i + 1
endwhileprint s$ + length(s$) + ", " + word
endwhile
closeprint "Строк: " + ln
Hello world!
13, 2
Привет мир!
12, 2
One, two, three
16, 3
Один, два, три
15, 3
Строк: 4
Переход на новую строку учитывается как символ.
Раздел: Стандартные функции Паскаля
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее… |
Функция Length в Паскале определяет длину строки. Синтаксис:
function Length(S : AStringType) : Integer;
Второй вариант для динамических массивов:
function Length(A : DynArrayType): Integer;
Функция возвращает длину
строки S, которая ограничена значением 255 для коротких строк (в классическом Паскале — это максимальная длина строки). Если S — это пустая строка, то функция возвращает 0.
Функция Length может вычислять длину строки для типов AnsiString и WideString.
Для динамических массивов функция возвращает количество элементов в массиве.
Функция определения длины строки Length также поддерживает параметры типа PChar
и PWideChar. В этом случае она работает также, как функции StrLen и WStrLen
соответственно. В этом случае функция вычисляет длину строки с нулевым
окончанием (с завершающим нулём), а время её выполнения пропорционально длине
строки, потому что завершающий нулевой символ ищется путём последовательного
перебора всех символов строки.
Как определить длину строки в Паскале
Думаю, уже понятно, что сделать это можно с помощью функции Length. Например, так:
str := '0123456789'; n := Length(str);
Однако есть и другой способ, о котором мало кто знает. Правда, этот способ можно использовать только с типом ShortString. Но в большинстве случаев этого строкового типа вполне достаточно.
Этот способ позволяет немного сэкономить процессорное время, так как для его использования не требуется тратить это время на вызов функции.
А суть его проста. Дело в том, что в типе ShortString длина строки хранится в нулевом элементе строки. Как известно, в Паскале отсчёт символов в строке начинается с единицы. Однако в типе ShortString есть и нулевой элемент, в котором и хранится длина строки:
ch := str[0]; //Здесь хранится длина строки типа ShortString WriteLn(Ord(ch), ' (', ch, ')');
Проблема только в том, что эта длина строки хранится как ASCII-код символа, и
получить этот элемент можно только как символ. Но это не беда, потому что мы уже
умеет преобразовывать символ в его код с помощью функции Ord.
Пример программы см. в конце статьи.
Как задать длину строки в Паскале
В некоторых случаях для экономии памяти можно задать фиксированную длину строки.
Делать это можно, когда вы точно уверены, что для ваших нужд в вашей программе потребуется, например, строка, в которой будет не более какого-то определенного количества символов.
Задать длину строки в Паскале можно так:
s04 : string[4]; //Строка из 4-х символов s20 : string[20]; //Строка из 20-ти символов
Затем с этими переменными можно работать как с обычными строками. Только следует помнить, что при попытке поместить, например, в s04 строку длиной более 4 символов, в эту строку будут помещены только первые четыре символа, а остальные будут отброшены.
Ниже приведён пример программы, где рассмотрены все вышеописанные случаи:
program lengthfunc; var i, n, x : integer; ch : Char; str : ShortString; s04 : string[4]; //Строка из 4-х символов s20 : string[20]; //Строка из 20-ти символов begin Randomize; str := ''; n := Length(str); //n = 0 WriteLn(n); str := '0123456789'; n := Length(str); //n = 10 WriteLn(n); for i := 1 to n do if i = n then Write(str[i]) else Write(str[i] + '-'); WriteLn; x := Random(26) + 1; str := ''; for i := 1 to x do str := str + Chr(i+64); WriteLn(str); ch := str[0]; //Здесь хранится длина строки типа ShortString WriteLn(Ord(ch), ' (', ch, ')'); str := '0123456789'; s04 := str; s20 := str; WriteLn('str = ', str, //Выведет 0123456789 ', s04 = ', s04, //Выведет 0123 ', s20 = ', s20); //Выведет 0123456789 ReadLn; end.
|
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… |
|
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение — ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. |