0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
|
1 |
|
составить программу нахождения номера строки11.12.2015, 08:37. Показов 2152. Ответов 13
составить программу нахождения номера строки, в которой расположен максимальный элемент любого столбца двумерного массива. если элементов с максимальным значением в этом столбце несколько, то должен быть найден номер строки самого нижнего из них.
0 |
vint-81 охотник 1011 / 535 / 650 Регистрация: 29.09.2014 Сообщений: 1,083 |
||||
11.12.2015, 10:29 |
2 |
|||
Сообщение было отмечено BesEE как решение Решение
1 |
0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
|
11.12.2015, 14:30 [ТС] |
3 |
а почему везде n+1?
0 |
0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
|
11.12.2015, 14:41 [ТС] |
4 |
выходит вот как Код A: 0 4 7 5 1 8 0 8 2 3 10 8 0 8 7 6 8 0 3 6 9 5 10 7 7 8 9 3 1 3 2 7 6 6 9 2 7 5 4 7 HoMepa: 3 4 2 2 3 2 3 1
0 |
охотник 1011 / 535 / 650 Регистрация: 29.09.2014 Сообщений: 1,083 |
|
11.12.2015, 14:50 |
5 |
в Вашем примере:
0 |
0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
|
13.12.2015, 17:41 [ТС] |
6 |
что все таки из этого находит самый нижний? всмысле какая именно строчка?
0 |
vint-81 охотник 1011 / 535 / 650 Регистрация: 29.09.2014 Сообщений: 1,083 |
||||
13.12.2015, 18:02 |
7 |
|||
что все таки из этого находит самый нижний? всмысле какая именно строчка? самый нижний:
если бы неравенство было строгим, то был бы найден номер строки первого(“верхнего”) максимального элемента в столбце
0 |
0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
|
13.12.2015, 18:34 [ТС] |
8 |
всмысле строгим?
0 |
vint-81 охотник 1011 / 535 / 650 Регистрация: 29.09.2014 Сообщений: 1,083 |
||||
13.12.2015, 18:36 |
9 |
|||
0 |
0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
|
13.12.2015, 18:42 [ТС] |
10 |
объясните пожалуйста с 13 строчки совсем не понимаю как это вы находите максимальный элемент?
0 |
vint-81 охотник 1011 / 535 / 650 Регистрация: 29.09.2014 Сообщений: 1,083 |
||||
13.12.2015, 18:55 |
11 |
|||
0 |
BesEE 0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
||||
13.12.2015, 19:30 [ТС] |
12 |
|||
Спасибо большое за объяснения, вот я немного переделала, посмотрите в чем дело, строки находит не правильно
Код A: 6 5 7 1 7 2 9 4 7 4 8 4 0 0 0 7 номера строк: 3 1 3 4
0 |
vint-81 охотник 1011 / 535 / 650 Регистрация: 29.09.2014 Сообщений: 1,083 |
||||||||
13.12.2015, 20:08 |
13 |
|||||||
При заполнении матрицы Вы проходите по строкам и максимальный пытаетесь найти в строке…
ps сложно исправлять ошибки на картинке… Добавлено через 4 минуты
1 |
0 / 0 / 0 Регистрация: 07.12.2015 Сообщений: 17 |
|
14.12.2015, 09:00 [ТС] |
14 |
vint-81, ооо спасибо! вообще идеально
0 |
Александр Устименко
Просветленный
(24306)
6 лет назад
var i, j, n, min, c: integer;
a: array [1..100,1..100] of integer;
begin
write (‘n = ‘);
read (n);
c:=1;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=10+random (90);
write (a[i,j]:4);
if (i = 1) and (j = 1) then min:= a[1,1];
if a[i,j] < min then
begin
c:=i;
min:=a[i,j];
end;
end;
writeln;
end;
writeln (c);
end.
Dmitry
Оракул
(52381)
6 лет назад
циклом перебирай все строки массива, при нахождении нужной строки выводи ее индекс (индексом послужит шаг цикла)
пример
for I := 0 to 10(количество элементов массива) do
begin
выполняем код
end;
после выполнения кода смотрим какой индекс содержал наименьшее значение, то и выводим – принцип работы объяснил, а вот код пиши сам
Редактировать
Символы и основные операции над ними
Символы имеют тип 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.
Формулировка задачи:
В двумерном массиве А[6,5] найти номер строки, для которой среднеарифметическое значение её элементов максимально.
Код к задаче: «Номер строки.»
textual
for i:=1 to 6 do begin for j:=1 to 5 do begin sum:=sum+a[i,j];
Полезно ли:
6 голосов , оценка 4.000 из 5
На занятии будет рассмотрен Строковый тип данных в Паскаль и примеры работы с ним
Содержание:
- Символьный тип char в Паскале
- Основные функции для работы с символами
- Строковые переменные в Паскаль
- Функции работы со строками в Pascal
- Стандартные методы и запросы (pascalAbc.net)
- Посимвольный ввод до пробела
Символьный тип char в Паскале
Символьной переменной соответствует тип char:
Инициализация символьной переменной:
Основные функции для работы с символами
Функция преобразует целое число, имеющее тип BYTE, в один символ ASCII-кода:
Пример: распечатать двойную кавычку по ее коду в ASCII-таблице
1 2 3 4 5 6 7 |
var a:char; i:byte; begin i:=34; {код, соответствующей символу " в ASCII-таблице} a:=chr(i); writeln(a) end. |
Функция возвращает порядковый номер символа параметра в таблице ASCII:
Пример: Распечатайте часть таблицы ASCII, конкретнее — символы, соответствующие кодам 32-255
1 2 3 4 5 |
var i: integer; begin for i:=32 to 255 do write(chr(i):3); end. |
Примеры:
var c := 'Ю'; var n := Ord(c); // n := c.Code Print(n); // 1070 c := Chr(n); print(c); // Ю
Символьные константы: #код
– символ с определенным кодом:
#10 – новая строка (Linux) #13#10 – новая строка (Windows) #9 – tab Print('a'#10'b');
Методы класса типа char
char.IsLetter(с); // буква ли, boolean char.IsDigit(с); // десятичное ли число, boolean char.IsLower(с); // буква нижнего регистра, boolean char.IsUpper(с); // буква верхнего регистра, boolean char.IsPunctuation(с); // знак препинания, boolean с := char.ToLower(с) ; с := char.ToUpper(с);
Операции для типа char
c1 < c2;// сравнение по коду c1 > c2; с in ['a','e','i','o','u',’y’]; // c принадлежит гласным с in ['a'..'z','A'..'Z’]; // c принадлежит английским буквам
Задание:
Запросите ввести два символа. Определите, принадлежат ли символы английским буквам, и если да, то гласные ли это буквы. Преобразуйте в верхний регистр ту букву, код которой меньше.
Пример вывода:
Введите два символа: u z u - английская буква, гласная z - английская буква, не гласная Буква u в верхнем регистре U
Некоторые выражения:
//c принадлежит диапазону: c.InRange('a'..'z'); //Трансформация символа в цифру: var n := Ord(c) – Ord('0'); // Увеличение кода символа на n: c := Chr(Ord(c) + n); // или Inc(c,2);
Строковые переменные в Паскаль
Строковые переменные в Паскале имеют тип String
Объявление и инициализация строковой переменной:
1 2 3 4 5 var a:string; begin a:='Привет всем!'; writeln(a); end.Ввод значения строковой переменной с клавиатуры:
1 2 3 4 5 6 var a:string; begin writeln('Введите слово'); readln(a); writeln('Вы ввели слово ',a); end.Строка «рассматривается» компилятором, как массив букв:
для компилятора:
s[1]='Б' s[2]='а' s[3]='н' s[4]='к' s[5]='а'
Важно: Значения строковых переменных всегда заключаются в одинарные кавычки
Функции работы со строками в Pascal
Исходные данные | Операция | Результат |
---|---|---|
s1:='Мото'; s2:='роллер' |
s3:=s1+s2; |
s3=’Мотороллер’ |
s5:='Мотороллер'; |
k:=Pos('рол',s5); |
k=5 |
s3:='Мотороллер'; |
l:=Length(s3); |
l=10 |
s3:='астроном'; |
s4:=Copy(s3,3,4); |
s4= ‘трон’ |
s5:='Коробочка'; |
Delete(s5,4,2); |
s5=’Корочка’ |
s6:='Рука'; s7:='баш'; |
Insert(s7,s6,3); |
s6=’Рубашка’ |
x:=2.73284; |
Str(x:4:2,s8); |
s8=’2.73′ |
s8='2.73'; |
Val(s8,x,Osh); |
x=2.73 |
Пример: Подсчитать кол-во букв «f» в тексте.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Операции со строками:
s1 + s2 // конкатенация s1 и s2 s1 += s2 s1 < s2 // лексикографическое сравнение 'abcd' < 'aad' s * n // конкатенация n копий строки s s[a:b] // срез (индексация с 1) s[a:b:step] // срез с шагом s?[3:5] ; // безопасный срез (не вызывает ошибок) s?[a:b:step] // безопасный срез с шагом s1 in s
String 1. Дан текст. Удалить в нём все слова кот. Выполнить задание двумя способами: используя стандартные функции работы со строками, и, работая со строкой как с массивом символов.
Пример выполнения:
введите строку мой кот - хороший кот Результат: мой - хороший
* Задание повышенной сложности: запросить у пользователя ввести подстроку, которую требуется удалить из исходной строки.
String 2. Составить программу проверки, есть ли в тексте буква s. Выдавать true (если найдено) или false (если не найдено).
Примеры использования логического типа (true и false) смотрите здесь.
Пример выполнения:
Введите строку: Hello world Результат: false
Введите строку: Hello students Результат: true
String 3. Имеется строка текста. Требуется написать программу, которая зашифровывала бы ее в другую строку — заменяя каждый символ текста символом, следующим по порядку в таблице ASCII. Тогда слово КОТ превратится в слово ЛПУ. Требуется составить и программу дешифровки.
Использовать функции для работы с символами: chr и ord pascal.
String 4. Дано предложение, определить количество слов в нём.
Подсказка: считать количество слов по количеству пробелов в строке.
* усложненный вариант: предусмотреть, что в начале или в конце введенной строки введен пробел
Пример: Найти количество цифр в строке.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример: Определить является ли данное слово перевертышем (палиндромом).
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
String 5. Составить программу подсчета количества встречаемых в тексте сочетаний букв «ма».
String 6. Определить, встречается ли в тексте сочетание букв «ку».
Пример выполнения:
Введите строку: Кума Результат: да
Введите строку: Дед Результат: нет
String 7. Заменить данную букву в слове другой буквой (буквы вводит пользователь).
Пример выполнения:
Введите строку: Барабулька Введите букву, которую заменить: а Введите букву, на которую заменить: у Результат: Бурубульку
String 8. Дано предложение, определить количество слов, начинающихся с буквы «к».
String 9. Дано предложение, состоящее из букв и цифр. Определить слово с наибольшим количеством букв (не цифр). В качестве подсказки можете использовать предложенный ниже алгоритм:
Пример выполнения:
Введите строку: 1234567891011слово следующееСлово иСледСлово Слово с максимальным количеством букв: следующееСлово
Алгоритм:
for
.const letters=['a'..'z'];
), то этот символ прибавляется к первому элементу массива слов строки (... array [1..100] of string
).String 10. Дано предложение. Расположить слова в нем в порядке возрастания числа букв в словах. В качестве подсказки можете использовать предложенный ниже алгоритм:
Алгоритм:
arrayS: array[1..100] of string;
строковый массив — будущий массив из слов предложения). Добавляя каждую букву к элементу arrayS[k].String 11. Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы».
Пример: Введите имя, фамилию и отчество: Иван Алибабаевич Попов Результат: Попов И.А.
Примечание:
Использовать функции: Pos, Copy, Delete
String 12. Программа должна позволять ввести текст, и потом удалять в нем все восклицательные знаки, расположенные непосредственно перед запятой, и выводить измененный текст на экран.
Пример:
Входной текст: Алгоритм — это правила выполнения определенных действий!, предписание исполнителю! совершить последовательность действий!, набор команд для компьютера! Выходной текст: Алгоритм — это правила выполнения определенных действий, предписание исполнителю! совершить последовательность действий, набор команд для компьютера!
Трудность низкая:
Программа должна формировать в памяти вторую строковую переменную с измененным текстом, а потом выводить ее на экран.
Трудность высокая:
Программа должна преобразовывать исходную строку без использования дополнительных переменных, и затем выводить ее на экран.
А теперь рассмотрим олимпиадное задание по Паскалю:
Задача Цезарь: Шифр Цезаря заключается в том, что каждая буква исходной строки заменяется третьей после нее буквой в алфавите, который считается написанным по кругу (все символы текста латинские и прописные).
* Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k
, причем отрицательное значение является признаком сдвига влево, положительное — вправо.
Показать решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var a:char; i,n:byte; s,s1:string; begin s1:=''; readln(s); for i:=1 to length(s) do begin n:=ord(...); n:=n+3; if n=123 then n:=97; {в ASCII 120 - x, 97 - a} if ...; {в ASCII 121 - y, 98 - b} if ...; {в ASCII 122 - z, 99 - c} a:=chr(...); s1:=...; end; writeln(s1) end. |
Стандартные методы и запросы (pascalAbc.net)
CountOf
— количество вхождений'мама мыла раму'.CountOf('м').Print; // 4
Contains
— содержит ли (логическая)'мама мыла раму'.Contains('б').Print; // False
IndexOf
— индекс искомого вхождения'hello world'.IndexOf('w').Print; // 6
Remove
— удаление вхождения'hello world'.Remove(' ').Print; // helloworld
Replace
— замена вхождений символа на другой символ'hello world'.Replace('l','L').Print; // heLLo worLd
и другие…
Запросы LINQ со строками
* LINQ (Language Integrated Query) — язык интегрированных запросов
Where
— Фильтрация массива (последовательности) с условиемvar sArr:=Arr('aab','bcd','efg'); sArr.Where(w->w.Contains('b')).Print; // aab bcd sArr.Where(w->w.CountOf('a')=2).Print; // aab
Задания: Предыдущие задания выполнить с использованием стандартных методов и запросов фильтрации.
Посимвольный ввод до пробела
Посимвольный ввод удобен для «мгновенной» обработки символов в строке.
Пример: посимвольно считывать фамилию
Решение:
var name: array[1..n] of string; c:char; ...
Для организации массива символьных строк:
Пример: посимвольно считывать фамилии и заносить их в массив фамилий
Решение:
String 13. Программа должна позволять ввести предложение до точки (.
). Необходимо в введенном тексте вместо всех букв «ё» ставить буквы «е». Выполнить, работая со строкой посимвольно: программа должна формировать в памяти вторую строковую переменную с измененным предложением, а потом выводить ее на экран.
Пример:
Входной текст: Алгоритм — это правила выполнения определённых действий. Выходной текст: Алгоритм — это правила выполнения определенных действий.
String 14. с клавиатуры вводится число N, обозначающее количество студентов в группе, а затем – N строк, в каждой из которых – информация о студенте в формате:
<Фамилия> <год рождения> <оценка>
- Все данные разделяются одним пробелом. Нужно подсчитать, сколько студентов получили отметку 5.
- Вывести фамилии студентов, у которых оценка 2.
- Вывести фамилии студентов, родившихся в 1996 году.
Потренируйтесь в решении задач по теме, щелкнув по пиктограмме: