Михаил Малашенко
Профи
(528),
закрыт
12 лет назад
Дополнен 12 лет назад
…спасибо. вопрос закрыт
Лучший ответ
Сергей Куксенков
Просветленный
(41944)
12 лет назад
var s:string;
i,kol:integer;
begin
writeln(‘vvedite stroky’);
readln(s);
kol:=0;
for i:=1 to length(s) do
kol:=kol+1;
writeln(kol);
readln;
end.
Остальные ответы
Gennady
Гений
(59292)
12 лет назад
n := Length(S);
Рокер Рокер
Знаток
(390)
7 лет назад
http://govnokod. ru/?page=1688
Лучшему ответу посвящается
Похожие вопросы
По своей сути строки в паскале представляют собой одномерные массивы символов.
Для объявления переменной вида «строка» используется тип string , для символов – char .
Максимальная длина строки составляет 255 символов. Если вам необходимы для работы более короткие строки, то их длину в квадратных скобках указывают при описании переменной типа string . Если длина не указана, то по умолчанию ее длина будет максимально возможной, т.е. 255 символов.
Var s : string; s1 : string [10]; c : char;
Объявлены переменные типа «строка»: s – длиной 255 символов и s1 длиной 10 символов.
Переменная c – типа «символ».
Для присвоения значения типа строка переменной используются апострофы.
S :=’Привет, мир!’;
Для присвоения «нулевого» значения переменной типа «строка» используются два апострофа подряд, что означает, что в строке нет символов.
S :=’’;
У каждого символа в строке, как у элемента одномерного массива, есть индекс. Со строкой и ее символами можно работать, как с одномерным массивом.
S[ 10]:=’ э’;
Write ( s );
Выведет на экран: Привет, мэр!
Для соединения нескольких строк в одну используется “+ ” либо Concat (s1, s2,…,sn)
Например, последовательность команд
s1:=’ Привет’;
s2:=’, ‘;
s3:=’ мир ! ‘;
write (s1+s2+s3);
write (concat(s1,s2,s3));
Выведет на экран: Привет, мир ! Привет, мир !
Чтобы выделить подстроку из строки используется функция Copy (S, poz, n) , где S – строка, из которой, начиная с позиции poz , копируем подстроку, состоящую из n символов.
s1:=’Привет, мир!’;
write (copy(s1,9,3)); // выделить подстроку, начиная с 9 позиции, длиной 3 символа
Выведет на экран: мир
Для поиска в строке подстроки используется функция Pos (subS, S) , которая определяет с какой позиции подстрока subS входит в строку S (возвращает целое число, равное индексу в строке первого символа искомой подстроки). Если искомой подстроки не обнаружено, то функция вернет 0.
Например:
s :=’Привет, мир!’;
write ( pos (‘мир’,s )); // найти с какой позиции в строке находятся символы ‘мир’
Выведет на экран: 9
s:=’Привет, мир!’;
write (pos(‘ мэр’,s));
Выведет на экран: 0
Для определения длины строки (количества символов в строке) используется функция Length(s).
Например:
s:=’Привет,мир!’;
write (Length(s));
Выведет на экран: 12
s:=”;
write (Length(s));
Выведет на экран: 0
Для удаления из строки символов используется процедура Delete (s ,poz ,n ), которая из строки s , начиная с позиции poz , удаляет n символов. При этом длина строки уменьшается на n .
Например:
s:=’ Привет, мир !’;
writeln (length(s));
Delete (s,5,2); // удалить из строки 2 символа, начиная с 5
writeln (s,’ ‘,length(s));
Выведет на экран:
11
Прив, мир! 9
Для добавления в строку символов/подстроки используется процедура Insert (s ubs ,s ,poz ).
Подстроку subs вставить в строку s с позиции poz . Соответственно длина строки увеличивается на n.
Например:
s:=’ Привет, мир !’;
writeln (length(s));
Insert (‘мой ‘,s,9);
writeln (s,’ ‘,length(s));
Выведет на экран:
12
Привет, мой мир! 16
Строки можно сравнивать между собой, используя математические символы: =,<>,>,<,<=,>=. Сравнение строк производится слева направо посимвольно до первого несовпадающего символа, большей считается та строка, в которой первый несовпадающий символ имеет больший код в таблице кодировки ASCII. Если строки имеют различную длину, но в общей части символы совпадают, считается, что короткая строка меньше. Строки равны, если они имеют равную длину и соответствующие символы совпадают.
В результате сравнений получаем логическое значение false или true.
Например, возьмем две строки одинаковой длины, но разного содержания и их сравним:
s:=’ удар’;
s1:=’ удав’;
writeln (s=s1);
writeln (s<s1);
Получим результат :
False // не совпадает последняя буква
False // буква «р» имеет числовое значение кода большее, чем буква «в»
Теперь возьмем строки разной длины:
s:=’ ударник’;
s1:=’ удар’;
writeln (s=s1);
writeln (s>s1);
Получим:
False // несмотря на совпадение первых 4 букв, длина строки больше
True
Для образца посмотрите небольшую программу, по обработке строки разными способами:
И результаты работы этой программы.
Редактировать
Символы и основные операции над ними
Символы имеют тип 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.
Перейти к содержанию
Посчитать количество строк в файле и количество слов и символов в каждой строке
Просмотров 8к. Обновлено 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
Переход на новую строку учитывается как символ.
Строки символов типа String. Функции работы со строками символов. Функции Concat, Copy, Delete, Insert, Length, Pos, Val, Str
Содержание
- 1. Функция Concat. Конкатенация (слияние) строк
- 2. Функция Copy. Получить копию подстроки из указанной строки
- 3. Процедура Delete. Удаление подстроки из строки
- 4. Процедура Insert. Добавить подстроку к строке
- 5. Функция Length. Получить текущую длину строки
- 6. Функция Pos. Поиск подстроки в строке
- 7. Процедура Val. Конвертировать строку в число
- 8. Процедура Str. Конвертировать число в строку
- Связанные темы
Поиск на других ресурсах:
1. Функция Concat. Конкатенация (слияние) строк
Для конкатенации (добавления, слияния) строк используется функция Concat. Общая форма использования функции следующая
ResStr := Concat(S1:string; S2:string [; ... SN:string])
здесь
- S1, S2, SN – строки, которые нужно объединить;
- ResStr – результирующая строка.
Для вызова функции нужно указывать как минимум одну строку-параметр. Результат выполнения функции – результирующая строка типа string.
Пример.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S1, S2, S3, ResStr : String; begin // Функция Concat() - конкатенация строк S1 := 'Hello'; S2 := ','; S3 := ' world'; ResStr := Concat(S1, S2, S3, '!'); Writeln(ResStr); // Hello, world! Readln; end.
Результат выполнения программы
Hello, world!
⇑
2. Функция Copy. Получить копию подстроки из указанной строки
Для выделения некоторого фрагмента из строки используется функция Copy, имеющая следующее использование
ResStr := Copy(S, Start, Len);
здесь
- S – строковая величина типа String, из которой выделяется фрагмент;
- Start – величина типа Integer, определяющая позицию начала выделяемого фрагмента;
- Len – величина типа Integer, определяющая количество символов фрагмента, которые нужно выделить.
- ResStr – результатом выполнения этой процедуры есть величина типа String.
Пример.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S1, S2, S3: String; begin // Функция Copy() - получить подстроку из строки S1 := '1234567890'; // исходная строка S2 := Copy(S1, 4, 3); // S2 = '456' Writeln(S2); S3 := Copy(S1, 8, 5); // S3 = '890' Writeln(S3); Readln; end.
Результат выполнения программы
456 890
⇑
3. Процедура Delete. Удаление подстроки из строки
С помощью процедуры Delete можно удалить некоторый фрагмент из строки. Общий вид процедуры:
Delete(S, Start, Len)
здесь
- S – строковая величина, из которой удаляется фрагмент;
- Start – порядковый номер первого символа удаляемого фрагмента;
- Len – количество символов фрагмента, которые нужно удалить.
Пример.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S : String; begin // 1. Исходная строка S := 'ABCDEF'; // 2. Удалить фрагмент CD delete(S, 3, 2); // S = 'ABEF' Writeln(S); // 3. Задать новую строку S := '123456789'; // 4. Удалить фрагмент '4' delete(S, 4, 1); Writeln(S); Readln; end.
Результат выполнения программы
ABEF 12356789
⇑
4. Процедура Insert. Добавить подстроку к строке
Для вставки в заданную строку другой подстроки используется процедура Insert. В общем случае использование этой процедуры следующее
Insert(S, S_new, Start);
здесь
- S – строковая величина – вставляемый фрагмент;
- S_new – строковая величина, в которую вставляется фрагмент S и где получается результат вставки;
- Start – порядковый номер символа в строке S_new, перед которым вставляется фрагмент S. Значение Start нумеруется с 1.
Пример.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S1, S2, S3: String; begin // Процедура Insert() - вставить подстроку в строку // 1. Вставка на начало строки S1 := 'ABCD'; Insert('000', S1, 1); Writeln(S1); // 2. Вставка посредине строки S1 := '12345678'; // Исходная строка S2 := 'ABC'; // Вставляемая строка // Вызов процедуры Insert Insert(S2, S1, 3); // S1 = 12ABC345678 Writeln(S1); // 3. Добавление в конец строки S1 := '12345678'; Insert('ABCD', S1, 9); // S1 = 12345678ABCD Writeln(S1); Readln; end.
Результат выполнения программы
000ABCD 12ABC345678 12345678ABCD
⇑
5. Функция Length. Получить текущую длину строки
Для определения длины строки используется стандартная функция Length. В наиболее общем случае использование функции может быть следующим
Len := Length(S);
здесь
- S – строка типа String;
- Len – количество символов в строке S (длина строки).
Пример.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S : String; Len : Integer; begin // Функция Length() - получить длину строки S := 'Hello, world!'; Len := Length(S); // Len = 13 Writeln(Len); Len := Length(''); // Len = 0 Writeln(Len); Readln; end.
Результат выполнения программы
13 0
⇑
6. Функция Pos. Поиск подстроки в строке
Для определения местоположения искомого фрагмента строковой величины можно воспользоваться функцией
position := pos(S_find, S);
здесь
- S_find – искомая подстрока;
- S – строка;
- Position – позиция, с которой начинается подстрока S_find в строке S. Значение Position есть типа Byte и нумеруется с 1. Если искомой подстроки в строке не существует, то Position = 0.
Пример.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S : String; Position : Byte; begin // Функция Pos() - определить позицию вхождения подстроки в строку // 1. Подстрока есть в строке S := '123456789'; Position := Pos('345', S); // Position = 3 Writeln(Position); // 2. Подстроки нету в строке Position := Pos('ABCD', 'ABC'); // Position = 0 Writeln(Position); // 3. В строке есть несколько вхождений подстроки Position := Pos('AB', 'ABCD ABC ABD BAB'); // Position = 1 Writeln(Position); Readln; end.
Результат выполнения программы
3 0 1
⇑
7. Процедура Val. Конвертировать строку в число
Процедура Val позволяет преобразовать строку в число. При этом считается, что строка является представлением числа в символьной форме (например, ‘2.85’, ‘1879’). Эта процедура производит обратную операцию по отношению к процедуре Str.
В наиболее общем случае использование процедуры Val имеет вид:
val(S, V, ErrCode);
здесь
- S – строковая величина;
- V – величина числового типа, которую нужно преобразовать;
- ErrCode – код результата выполнения процедуры. Если преобразование произошло успешно, то ErrCode=0. Если из строки S невозможно получить число V, то ErrCode равен номеру позиции в строке S, которую нельзя преобразовать. К примеру, для строки ‘123A56’ вызов процедуры Val вернет ErrCode = 4.
Пример.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S : String; V1 : Integer; V2 : Real; Code : Integer; begin // Процедура Val, // 1. Конвертировать String => Integer S := '286'; Val(S, V1, Code); // Обработать результат if Code = 0 then Writeln('Ok! V1 = ', V1) else Writeln('Error! ErrCode = ', Code); // 2. Конвертировать String => Real S := '-38.25'; Val(S, V2, Code); // Обработать результат if Code = 0 then Writeln('Ok! V2 = ', V2) else Writeln('Error! ErrCode = ', Code); // 3. Попытка конвертировать строку, содержащую недопустимые символы S := '18U7'; // здесь недопустимые символы Val(S, V2, Code); // Code = 3 if Code = 0 then Writeln('Ok! V2 = ', V2) else Writeln('Error! ErrCode = ', Code); Readln; end.
Результат выполнения программы
Ok! V1 = 286 Ok! V2 = -3.82500000000000E+0001 Error! ErrCode = 3
⇑
8. Процедура Str. Конвертировать число в строку
Процедура Str является обратной процедуре Val и позволяет конвертировать величину числового типа (Integer, Real и т.д.) в строку типа String. Общая форма использования процедуры
Str(V, S);
где
- V – величина числового типа, значение которой преобразуется в строковый вид;
- S – результат преобразования строкового типа.
Приклад.
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var S : String; V1 : Integer; V2 : Real; begin // Процедура Str, // 1. Конвертировать Integer => String V1 := 277; Str(V1, S); // S = '277' Writeln('S = ', S); // 2. Конвертировать Real => String V2 := 8.53; Str(V2, S); Writeln('S = ', S); Readln; end.
Результат выполнения программы
S = 277 S = 8.53000000000000E+0000
⇑
Связанные темы
- Тип String. Операции над строками символов
- Логические типы. Символьные типы. Строчные типы