Как найти количество символов в паскале

Михаил Малашенко



Профи

(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
Лучшему ответу посвящается

Похожие вопросы

Работа со строками в Pascal

По своей сути строки в паскале представляют собой одномерные массивы символов.

Для объявления переменной вида «строка» используется тип 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

Для образца посмотрите небольшую программу, по обработке строки разными способами:

Работа со строками в Pascal

И результаты работы этой программы.

Работа со строками в Pascal

Редактировать

Символы и основные операции над ними

Символы имеют тип 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.

Подсчет символов в строке:
Измерять длину очередной строки с помощью встроенный в язык программирования функции.

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

  1. Ввести счетчик слов и присвоить ему 0.
  2. Ввести флаговую переменную и присвоить ей 0 (сигнал нахождения вне слова).
  3. Пока не будет достигнут конец строки:
    1. Если очередной символ не пробел и флаг указывает на нахождение вне слова, то увеличить счетчик слов и присвоить флаговой переменной 1 (сигнал нахождения внутри слова).
    2. Если же очередной символ пробел, то присвоить флагу 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 += 1

flag = 0
word = 0
for j in i:
if j != ' ' and flag == 0:
word += 1
flag = 1
elif j == ' ':
flag = 0

print(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
endwhile

print s$ + length(s$) + ", " + word
endwhile
close

print "Строк: " + 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. Операции над строками символов
  • Логические типы. Символьные типы. Строчные типы

 


Добавить комментарий