Помощь - Поиск - Пользователи - Календарь
Полная версия: 3 несложные задачи
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
azi
Всем привет! Признаюсь сразу - с Паскалем я не в ладах, а для вас это раз плюнуть smile.gif Бьюсь над этими задачами уже не первую неделю - чё-то никак.
Помогите, кому не лень. Заранее благодарен
1.Два отрезка на плоскости заданы координатами своих концов. Определить, имеют ли эти отрезки общие точки.
Замечание. Необходимо рассмотреть различные случаи взаимной ориентации отрезков: на одной прямой, на параллельных или пересекающихся прямых.
2.Просуммировать элементы матрицы A(n,n) по каждой из линий, параллельных главной диагонали. Напечатать полученные суммы.(читал в FAQ'е - не выходит...)
3.Натуральное число в p-ичной системе счисления задано своими цифрами, хранящимися в массиве K(n). Проверить корректность такого представления и перевести число в q-ичную систему (возможно, число слишком велико, чтобы получить его внутреннее представление; кроме того, p 10, q 10).
и может быть ещё одну:Заданный список русских фамилий (вместе с именами и отчествами) упорядочить по алфавиту. Проверить (и исправить, если нужно) написание собственных имен с прописных букв: Заданный список русских фамилий (вместе с именами и отчествами) упорядочить по алфавиту. Проверить (и исправить, если нужно) написание собственных имен с прописных букв.
Хотя бы намекните как делать, плиз-з-з-з!!!!
azi
[quote=Ozzя,18.05.05 7:18]
Спасибо вам огромное. Не могли бы с остальными помочь?
Ozzя
№ 4
Вот похожая программка: Сортирует список студентов по ФИО. Лишнее можно убрать.

Проверка фамилии
If not Upcase(Imia[1]) then Upcase(Imia[1]);
имени:
следующий символ после пробела и опять
If not Upcase(Imia[k]) then Upcase(Imia[k]);

Функция upcase (с поддержкой русского языка) есть в книге Фаронова
azi
Спасибо!
volvo
Цитата(Ozzя @ 18.05.05 10:35)
Функция upcase (с поддержкой русского языка) есть в книге Фаронова

:p2: Здесь тоже есть...
azi
Благодарю за помощь. 1-ую задачу решил (не решить после этого было тяжело<_< ) А есть ли какие-то варианты насчёт матриц. FAQ не помогает!!! там с индексами матрицы какая-то путаница. Помогите, пожалуйста.
azi
и ещё пожалуйста подскажите - как сортировать по алфавиту (есть ли в Паскале встроенная сортировка?), т.е. по какому критерию выбирать следующее значение - это же не числа больше-меньше?.. huh.gif
Ozzя
Цитата(azi @ 18.05.05 12:50)
и ещё пожалуйста подскажите - как сортировать по алфавиту (есть ли в Паскале встроенная сортировка?), т.е. по какому критерию выбирать следующее значение - это же не числа больше-меньше?.. huh.gif

для строк и символов допустимы операции сравнения < > и т.д, так как
сравнение идет по коду символа, и можно смело писать:
if 'a' < 'b' ...
azi
ни фига себе! никогда бы не подумал... huh.gif
Ozzя
Цитата
Операции отношения =, о, >, <, >=, <= выполняются над двумя строками посимвольно, слева направо с учетом внутренней кодировки символов (см. табл.4.1 и прил.2). Если одна строка меньше другой по длине, недостающие символы короткой строки заменяются значением СНR(0) .

Следующие операции отношения дадут значение TRUE:

'''' < ' . '

'А' > '1'

'Turbo' <' Turbo Pascal'

'Паскаль' >'Turbo Pascal'
volvo
Цитата(azi @ 18.05.05 12:32)
FAQ не помогает!!! там с индексами матрицы какая-то путаница.

А вот с этого места я попрошу поподробнее. В каких именно местах в FAQ-е есть путаница с индексами матрицы? Я все-таки проверяю КАЖДУЮ программу на нескольких примерах перед занесением ее в FAQ... Так что я жду ссылку...
azi
ну не то, чтобы путаница...
Сумма элементов, стоящих выше главной диагонали:
CODEs:=0;
for i:=1 to n do
for j:=i to n do s:=s+a[i,j];

Сумма элементов, стоящих ниже побочной диагонали:
CODEs:=0;
for i:=1 to n do
for i:=n-i+1 to n do s:=s+a[i,j];

тут что-то не то со счётчиками - суммируются не те элементы... может быть надо to n-i?!! Я же говорю, что в Паскале не совсем соображаю, но тут явно не получается. И ещё: как заносить суммы по линиям, параллельным диагонали в отдельные массивы?
Бродяжник
Со счетчиками все как будто в порядке, если не считать, что есть опечатка в строке
Код
for i:=n-i+1 to n do s:=s+a[i,j];
Вместо "for i" должно быть "for j". Но это, видимо, опечатка Azi. Возможно, проблема в ориентации матрицы? Данные циклы предполагают, что
а) первый индекс - это номер строки, а второй - номер столбца, и что
б) выражение "элементы выше главной диагонали" надо читать, как "элементы выше главной диагонали и элементы самой главной диагонали". Т.е.
Цитата
1111
1110
1100
1000

Если же имелось в виду
Цитата
1110
1100
1000
0000

т.е. НЕ ВКЛЮЧАЯ саму диагональ, тогда надо циклы переделывать.
А ввобще пользуйтесь старым добрым способом:
Код
s:=0;
for i:=1 to n do
for j:=i to n do
  begin
     s:=s+a[i,j];
     writeln('i=',i,' j=',j,' s=',s,' a=',a[i,j]);
  end;

и сразу увидите, какие элементы суммируются. Глядишь, и разберетесь. Удачи!
volvo
azi,
"учите матчасть" (С)
Проверка. Матрица задана так
Цитата
11  12  13
21  22  23
31  32  33

1. Выше главной диагонали (включая главную диагональ !!!):
i = 1; j = 1, 2, 3
i = 2; j = 1, 2
i = 3; j = 3
Все работает

2. Ниже побочной диагонали (включая и саму диагональ !!!)
i = 1; j = 3
i = 2; j = 2, 3
i = 3; j = 1, 2, 3
Тоже не вижу ошибки.
Я надеюсь не нужно напоминать, что есть главная диагональ, а что - побочная?
Так что давайте оставим FAQ в покое. Еще раз повторяю - ничего просто так туда не добавляется...
volvo
Цитата(azi @ 17.05.05 19:14)
3.Натуральное число в p-ичной системе счисления задано своими цифрами, хранящимися в массиве K(n). Проверить корректность такого представления и перевести число в q-ичную систему (возможно, число слишком велико, чтобы получить его внутреннее представление; кроме того, p<10, q<10).

Все просто...
вначале проверяем корректность представления:
i := 1; isCorrect := true;
while (i <= n) and isCorrect do begin
isCorrect := (K[i] <= p);
inc(i)
end;
{ если здесь isCorrect = True то число корректно, иначе - нет }


далее, с помощью процедур из FAQ: Общие вопросы по математике преобразуем число из p-ичной системы в q-ичную:
var
s: string;
...
if isCorrect then begin
s := '';
for i := 1 to n do s := s + chr(K[i] + 48);
writeln('q-th system: ', FromDec(ToDec(s, p), q))
end
else writeln('invalid data');


Ну, а проверить не слишком ли велико число, я предоставляю тебе...
azi
Volvo, спасибо тебе огромное. Буду за тебя молиться!!! :D
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.