Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Информационные технологии
        Турбо Паскаль. Программирование на Pascal
Отметить все сообщения как прочитанные   [ Помощь ]
» Добро пожаловать на форум "Информационные технологии" «

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 ]
Модераторы: paradise, KMA
  

ploskatik


Удален

Добрый день люди добрые помогите решить пару задачек или хоть одну.

1. Дана таблица N*M.Найти наименьший элемент каждой четной строки.
2. Удалить лишние пробелы из строки.

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 25 мая 2006 12:37 | IP
VF



Administrator

ploskatik
1. Просто перебираешь четные строки таблицы: находишь наименьший элемент строки как для обычного массива и выводишь результат.
2. Проще всего - копируешь в другую строку посимвольно за исключением тех случаев, когда текущий и предыдущий символ - пробелы.

Всего сообщений: 3110 | Присоединился: май 2002 | Отправлено: 25 мая 2006 13:27 | IP
ploskatik


Удален

VF

С пробелами получилось благодарю!
а вот как найти наименьший в строке не могу допарить.

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 25 мая 2006 17:09 | IP
KMA



Долгожитель

VF, не мне конечно учить администратора программингу, но все же удаление лишних пробелов довольно стандартная задача, и думаю ее стоит оформить кодом здесь на форуме. Ваш метод, конечно правильный, но, чаще всего такого рода задачи решают по следующему алгоритму.

j:=1;
while j<length(s) do
if s[j]=' ' and s[j+1]=' '
   then delete (s, j, 1)
   else inc (j);

Этот метод более рационален, нежели ваш.

ploskatik
По поводу четной строки:

for i:=1 to n div 2 do
begin
 min:=a[i*2,1]
 for j:=2 to m do
    if a[i*2, j]<min
       then min:=a[i*2,j];
 writeLn (i*2, ' строки минимальный -', min)
end;

Guest, все это лишь отговорки. Мой преподователь всегда говорит -- "Если вы человек с нормальной психикой, то вы это поймете." Я тебе покожу, как делается для запись в шифрованные данные, а дальше попробуй сам.

s- строка, которую ввел пользователь, тебе ее надо зашифровать. Пусть дан файл f типизированный типа alfavit.

reWrite (f);
for j:=1 to length (s) do
write (f, symbolToshifr (s[j]))

Вот и все. А расшифровать уж попробуй сам, ну а если ничего не получиться, то приводи код, думаю, вместе разберем и справимся.


(Сообщение отредактировал KMA 25 мая 2006 19:19)

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 25 мая 2006 19:18 | IP
Mas


Новичок


Цитата: KMA написал 24 мая 2006 23:47
Итак теперь более или менее понятно. Очень важная вещь, которую хочу тебе сказать Mas, файл должен быть желательно типизированный.
Итак, записать файл в поток очень просто: пусть есть некая переменная f типа file of integer; Даже пусть он задан. Итак, вначале я узнаю размер матрицы, делаю я это очень хитро:
n:=trunc (sqrt (fileSize (f)));
Таким образом я узнал порядок данной матрицы. Это уже хорошо.
Итак, далее мне нужно найти периметр. Я точно должен знать только одно, как записывался в файл поток данных в виде твоей матрицы. Пусть он записывался по следующему алгоритму: [1,1] -первый элемент, [1,2] - второй элемент, [1,3] - третий элемент ну и так далее.
Итак ищу сумму элементов первой строки:
seek (f,0);
for i:=1 to n do
begin
  read (f, buf);
  perimetr:=perimetr+buf
end;
Нашел. Далее, вещь похожая, но только для последней строки:
seek (f, fileSize (f)-n-1);
for i:=1 to n do
begin
  read (f, buf);
  perimetr:=perimetr+buf
end;
Две стороны нашли, уже хорошо.
Итак, теперь самая сложная задача, найти боковые стороны, т. е. столбцы.
Решается должно в этом духе.
for i:=1 to n-2 do
begin
 seek (f, n*i);
 read (f, buf);
 perimetr:=perimetr+buf; {для первого столбца}
 seek (f, n*i+n-1);
 read (f, buf)
 perimetr:=perimetr+buf; {для второй}
end;

Еще раз говорю, не факт, что это самый рациональный и правильный метод. Не факт, что код у меня точен. Возможно, где-то напутал с единицами, или в координатах ошибся. Главное, я дал тебе алгоритм, а вот далее ты уже должен решить сам. Далее, как говориться - критическое программирование - исправление через анализ ошибок. Дерзай.




Спасибо большое!!! Буду думать дальше!

Всего сообщений: 8 | Присоединился: май 2006 | Отправлено: 25 мая 2006 19:18 | IP
kotenok


Удален

Тема: формальные и сюжетные задачи. Этапы решения задач на ЭВМ.
1. Решить задачу, соблюдая все этапы решения: «В Солнечном городе для перевозки грузов использовали транспортное средство марки «Перевозчик». Одно из них, нарушив правила, сбило велосипедиста Незнайку. Свидетелем данного происшествия оказался гражданин Знайка. Он запомнил, что бортовой номер грузовика является чётным числом, первые две цифры и сумму цифр в записи этого числа. На место происшествия приехал Инспектор. Он имел перед собой список владельцев и соответствующие номера всех транспортных средств города. Помогите ему найти нарушителя. Бортовой номер любого Перевозчика – натуральное четырёхзначное число»
2. Дано простое число. Определить следующее за ним простое число. Выделить 1 и 2 этапы решения. Дать словесное описание идеи решения.
(Этапы: 1.Работа над текстом задачи (выделить аргументы  результаты, определить их свойства, составить шапку алгоритма); 2.Поиск идеи решения ( а)попробовать разбить на простые задачи; б)вспомнить все определения, теоремы, формулы, относящиеся к данным задачи; ) 3.Составить алгоритм (на алгоритмическом языке); 4. Составить программу на Паскале; 5. Тестирование программы)

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 25 мая 2006 21:45 | IP
VF



Administrator

KMA, а как работает функция delete (s, j, 1)? Почему-то мне кажется, что она сдвигает все элементы дальше j на единицу. А это долгий процесс... Если уж оптимизировать дальше и не использовать другой массив, то нужно идти с конца (сразу сокращаем строку удалением лишних пробелов), а также считать сколько пробелов идут подряд и сдвигать на это_число-1.

PS: правила постораюсь сочинить. Можешь предлагать свой вариант в PM или аську

Всего сообщений: 3110 | Присоединился: май 2002 | Отправлено: 26 мая 2006 7:39 | IP
KMA



Долгожитель

VF, так то вы правы. Но копирование занимает еще более длительный процесс. Но delete (s, count, indx); удаляет из строки s count символов начиная с indx. Она работает довольно таки шустро, хотя, можно сделать и как предложили вы, тогда мы уже запишемся в фанаты оптимизации.

Я ведь ничего против вашего решения не имел. Просто такая задача имеет стандартное решение и его я озвучил. Вот и все.

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 26 мая 2006 9:50 | IP
VF



Administrator

KMA, в первом случае мы максимум скопируем всю строку в другую (если нет повторяющихся пробелов). А если функция delete основана на копировании (переносит элементы и изменяет размер строки), то в худшем случае (все элементы - пробелы) по твоему коду мы получим n! копирований элементов строки

Я тоже ничего против не имею - вопрос интересный, поэтому и написал. Можно на "ты".

Всего сообщений: 3110 | Присоединился: май 2002 | Отправлено: 26 мая 2006 10:03 | IP
KMA



Долгожитель

VF, тут дело в том, что delete основана на сдвиге, а не на копировании. Там, дикие Assemblerовские коды, но однозначно это не копирование, иначе код был бы максимально простым.  

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 26 мая 2006 10:09 | IP

Эта тема закрыта, новые ответы не принимаются

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 ]

Форум работает на скрипте © Ikonboard.com