panth80
Новичок
|
помогите!!!!!!!!!!!!!!!!! очень срочно надо решить задачу!!!!! Дано действительную квадратную матрицу порядка n (n<10). Получить матрицу, развернутую на 90 градусов против часовой стрелки. Оформить введение и выведение матрицы.
|
Всего сообщений: 2 | Присоединился: май 2007 | Отправлено: 11 мая 2007 20:27 | IP
|
|
Ridge
Новичок
|
Мог бы и посидеть 5 минут, panth80. Но ладно, посидел я. ....... readln(n); for i:=1 to n do for j:=1 to n do readln(a[i,j]); for i:=1 to n do for j:=1 to n do begin write (' ',a[i,j]); if (j=n) then writeln; end; writeln; readln; for i:=n downto 1 do for j:=1 to n do begin write (' ',a[j,i]); if (j=n) then writeln end; readln; ......... надеюсь КМА не обидится (Сообщение отредактировал Ridge 12 мая 2007 0:00)
|
Всего сообщений: 19 | Присоединился: май 2007 | Отправлено: 11 мая 2007 23:38 | IP
|
|
KMA
Долгожитель
|
Ridge, у тебя код то не работает! Как ты это сделал? Приведи нормальный, работающий код, а я тебе тогда напишу как используя два одномерных. А с одним одномерным, придумаем что нибудь. Еще, у тебя дурная привычка, делать так
Code Sample:
if j=n then writeLn;
Вот ты выводишь матрицу, и у тебя считай каждый раз идет эта проверка. Скажем пусть матрица 5*5, тогда проверка будет сделана 25 раз. Как минимум одна из них это два такта, считай 50 тактов ты потерял, плюс читать такую программу хуже. Если тебе надо выделить участок когда j=n, т. е. достигает конца, то и напиши это в теле того цикла. В общем, чем говорить лучше приведу код:
Code Sample:
for i:=1 to n do begin for j:=1 to m do write (a[i, j], ' '); writeLn; end;
И ничего лишнего, не надо выдумывать, решение как правило всегда просто. И еще, я ни на что не обижаюсь, но транспонирование матрицы уже решалось на форуме, и есть код =) Если ты решил повторить, то молодец. Решать задачи или не решать дело личное каждого участника форума.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 12 мая 2007 1:10 | IP
|
|
Ridge
Новичок
|
Воть, тока что заново вспоминал. А тот пример реально не идет. некоторые ошибки + заполнение памяти мусором. Но и счас у меня в проге недочет есть. Попробуй сам uses crt; var i,j:integer; a: array [1..10,1..10] of integer; begin clrscr; a[1,1]:=1; for i:=1 to 10 do a[i,1]:=1; writeln (a[1,1]); for i:=2 to 10 do begin write (a[i,1]); for j:=2 to i do begin a[i,j]:=a[i-1,j]+a[i-1,j-1]; write ( ' ', a[i,j]); if (i=j) then writeln; end; end; readln; end. Вот все нормально. Сутра сел и на свежую голову доделал. КМА, скажи, почему в некоторых версиях TPascal заполнение памяти мусором либо не идет, любо проходит на 3-4 компиляцию? это странно. Вот я делал эту прогу до этого в 2 раза короче, не задавая почти значения а и не выводя отдельно строку а(i,1) (Сообщение отредактировал Ridge 12 мая 2007 10:59)
|
Всего сообщений: 19 | Присоединился: май 2007 | Отправлено: 12 мая 2007 3:34 | IP
|
|
Guest
Новичок
|
Передо мной стоит задача проверить пасовский файл на правильность или неправильность расстовления операторых скобок begin и end Вот мой код Program Primer_1; Uses crt; Var f:text; s,sbuf:string; summabegin,summaend:integer; posbegin,posend:byte; Begin clrscr; summabegin:=0; summaend:=0; Assign(f,'c:\sa.txt'); Reset(f); While not eof(f) do begin readln(f,s); posbegin:=pos('begin',s); posend:=pos('end',s); While posbegin<>0 do begin delete(s,posbegin,5); posbegin:=pos('begin',s); summabegin:=summabegin+1; end; While posend<>0 do begin delete(s,posend,3); posend:=pos('end',s); summaend:=summaend+1; end; if summaend>summabegin then begin writeln('Неправильно расставлены операторные скобки begin и end'); halt; end; end; close(f); if summabegin<>summaend then writeln('Неправильно расставлены операторные скобки begin и end') else writeln('Операторые скобки begin и end правильно расставлены'); readln; end. Почему то прога не проверяет последнюю строку я чего то непонимаю когда я вставляю строку в виде пробела между последней и предпоследней то все работает Помогите плиз
|
Всего сообщений: Нет | Присоединился: Never | Отправлено: 12 мая 2007 13:22 | IP
|
|
Ridge
Новичок
|
Да, и еще, КМА, как мне задать длину струки, тоесть так, чтобы я вводил 80 символов в строку, а не больше? подскажи плиз и для char u string.
|
Всего сообщений: 19 | Присоединился: май 2007 | Отправлено: 12 мая 2007 14:45 | IP
|
|
KMA
Долгожитель
|
КМА, скажи, почему в некоторых версиях TPascal заполнение памяти мусором либо не идет, любо проходит на 3-4 компиляцию? это странно. Вот я делал эту прогу до этого в 2 раза короче, не задавая почти значения а и не выводя отдельно строку а(i,1)
Не знаю, имеешь ли ты представление о том как работает сама программа, с точки зрения машинных кодов, но думаю, сейчас об этом расскажу. Видишь ли перед тем как исполнить программу ее помещают по какому либо адресу, скажем к примеру 0AAAA:0000. И сегмент данных как раз содержит твою информацию. Иногда бывает, что какая-нибудь другая программа до того сидела вот по этому же адресу, и оставила за собой данные. В случае когда ты объявляешь пременную, то в зависимости от того сколько места она будет занимать, столько памяти под нее отведется. Скажем для типа word или integer отводиться 2 байта. Значит и в этом сегменте данных она будет находиться со смещение в 2 байта. Если там до этого была какая-то информация, то твоя переменная будет вначале выдавать ее. Прошлая программа оставила за собой значение по адресу, где находиться твоя переменная было оставлено значение 21, значит и твоя переменная покажет значение 21. Поэтому хорошим тоном считается "обнуление" этой переменной, если ее начальное значение так важно.
а, и еще, КМА, как мне задать длину струки, тоесть так, чтобы я вводил 80 символов в строку, а не больше? подскажи плиз и для char u string.
К сожалению должен огорчить, но char это всего лишь один символ, и длина для него не задается. Чтобы ограничить длину строки надо заключить в квадртаные скобки максимальное значение (оно не должно превосходить 255). Например так
Code Sample:
VAR s: sting [80];
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 13 мая 2007 0:43 | IP
|
|
KMA
Долгожитель
|
ередо мной стоит задача проверить пасовский файл на правильность или неправильность расстовления операторых скобок begin и end
Вполне понятно почему он не будет читать, ты же вначале запоминмаешь позицию end еще в "нетронутой" строке. Теперь ты удалил, скажем тот же begin, строка укоротилась, а значит и позиция у enda сместилась. С такими вещами надо быть осторожным. Замени:
Code Sample:
posbegin:=pos('begin',s); posend:=pos('end',s); While posbegin<>0 do begin delete(s,posbegin,5); posbegin:=pos('begin',s); summabegin:=summabegin+1; end; While posend<>0 do begin delete(s,posend,3); posend:=pos('end',s); summaend:=summaend+1; end;
На следующее:
Code Sample:
posbegin:=pos('begin',s); While posbegin<>0 do begin delete(s,posbegin,5); posbegin:=pos('begin',s); summabegin:=summabegin+1; end; posend:=pos('end',s); While posend<>0 do begin delete(s,posend,3); posend:=pos('end',s); summaend:=summaend+1; end;
(Сообщение отредактировал KMA 13 мая 2007 1:15)
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 13 мая 2007 0:58 | IP
|
|
KMA
Долгожитель
|
Rigde, я обещаю, что посмотрю твою программу, но завтра... сегодня я уже устал.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 13 мая 2007 1:18 | IP
|
|
Ridge
Новичок
|
КМА! я на 2мерный сделал... по одномерным у тебя мысли есть? С длиной строки я имел ввиду массив типа Char, я не мог понять, почему я задаю его длину 80 а ввожу 150. Но сейчас уже разобрался. За обьяснение спасибо.
|
Всего сообщений: 19 | Присоединился: май 2007 | Отправлено: 13 мая 2007 1:44 | IP
|
|
|