Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разбор решений
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
Страницы: 1, 2, 3, 4
Bourn
Цитата(Kshishtov @ 26 Apr 2006, 21:39)
Боурн, спасибо еще раз.

еще надо?(может по заказу допустим smile.gif)
Kshishtov
Пока нет,спасибо.Если можешь, реши ту задачку,что с типизироваными файлами.буду очень благодарен.
Druin
Kshishtov, обьясни мне одну вещчъ... тебе по твоей специльности програмирование пргодится?... бо такие вопросы простые задаешь...
Если нафик не надо, то кнечно подскажем... Но иесли нет, то имхо смому знать полезно... Почему?... Бо НАДО!!!
Kshishtov
Нафиг оно мне не нужно.У меня специальность техник/инженер чего-то там..Я с компами по специальности встречаться вообще не буду!Камеры там всякие, киноаппаратура - вот мое.
gamecreator
попробую сделать твою задачу. так, как я себе представляю.
Борн придет и перепишет на паскаль.
Код
#include<fstream.h>
void main
{
   int i, n;
   char mas[255][255];
   ifstream fin("H1");
   ofstream fout("H2");
   for(n=0;fin;n++)
       fin.getline(255,10,'\n');
   fin.close();
   fin.open("H1");
   for(i=0;i<n;i++)
       fin.getline(255,10,'\n');
   fout<<mas[0]<<' ';
   for(i=1;i<n;i++)
       fout<<mas[i]<<' '<<mas[i]<<' ';
   fout<<mas[0];
}
в корректности последних двух строк не уверен.
если прога под винду - размеры массива можно ставить хоть 30000х30000.

Добавлено ([mergetime]1146243187[/mergetime]):
на примере прикрепленного файла получится
1 2 3 4 2 5 6 7 8 1 5 6 7 8 1 9 10 11 12 1 9 10 11 12 1 3 3 2 2 2 3 3 2 2 2 1 2 3 4 2
Kshishtov
Боурн, глянь пожалуйста эту задачку, очень надо!!!Скоро зачетная неделя, а мне на нее без задачи этой не выйти(задача с тип-ми файлами,данная выше)
Ennin
а я так по наивности думал, что типизированные файлы через пробел не пишутся...
gamecreator
Цитата(Ennin @ 06 May 2006, 11:51)
а я так по наивности думал, что типизированные файлы через пробел не пишутся...

это ты к чему?
Darth_Beleg
Для textfile:
Код
program foo(input, output);
const
   N = 255;
var
   a0, ai: array[1..N] of integer;
   i, c0, j: integer;
begin
   assign(input, 'H1'); reset(input);
   assign(output, 'H2'); rewrite(output);
   i := 1;
   while not (seekeoln or seekeof and (i < N+1)) do
   begin
       read(a0[i]);
       write(a0[i], ' ');
       inc(i);
   end;
   dec(i);
   if (i > N) then halt(1); {Error - out of memory}
   c0 := i;
   if eof then
   begin
       for i := 1 to c0 do
           write(a0[i], ' ');
       halt(0);
   end;
   while not seekeof do
   begin
       i := 1;
       while not seekeoln and (i < N+1) do
       begin
           read(ai[i]);
           write(ai[i], ' ');
           inc(i);
       end;
       dec(i);
       if (i > N) then halt(1); {Error - out of memory}
       for j := 1 to i do
           write(ai[j], ' ');
   end;
   for j := 1 to c0 do
       write(a0[j], ' ');
   close(output);
end.
Ennin
gamecreator, типизированные файло (file of char) типа чар пишется строка. типа байт (file of byte) пишется цифрами побайтно. типа инт - по 2 байта. пробелы означают, что это #32, а не следующий элемент. etc.

darth beleg, я давненько не видал вот этакого разэтакого. помесь какая-то ужасная. или я не смыслю в паскале.
начиная c того, что параметры запуска передаются через paramstr,
c того, что read и write берут необязательным вообще, но нужным тут параметром файл, с того, что eoln и eof - это тоже функции, берущие параметром файл - и до того, что input и output - имена системные и зарезервированные
Zantetsuken
Действительно странный паскаль какой-то. Особенно меня eoln и eof смущают.
Shmatko
Эта, может дать кто прогу, которая перемножает большие числа? Потипу 237874845*38400000 ) А то мну интегера не хватает ) приходица импровизировать ) А писать лень, вдруг завалялась у кого )
gamecreator
я делал когда-то, но она потерялась sad.gif .
писать ее не трудно, трудно отлаживать.
orgus
для таких хватит и calc.exe
ЗЫ по поводу написания и отладки...
__int64 a,b,c;
a=237874845;
b=38400000;
c=a*b;
разве такое не катит?smile.gif
gamecreator
а 432164943502170946947659621*4309574375638756273 сколько будет?
этого твоя прога точно не посчитает
Bourn
186114316951656621266138316771191649135149781659158114141114133

Добавлено ([mergetime]1148055311[/mergetime]):
smile.gifя и больше могу считать smile.gif
gamecreator
написал прогу, которая считает через символьные массивы?
Kshishtov
end of line и end of file.

Я это только и знаю наверно..smile.gif
Bourn
угу массивы smile.gif, да там писать минут десять, из которых вспоминал как перемножить 2 числа минут 5:)
orgus
Шматко же привел примеры чисел, они вполне адекватныsmile.gif а умножение размерности N гыыыы
столбик не решаетsmile.gif правдо отлаживать опять же не нужно... остальные алгоритмы канули в лето ... слишком давно учился.
PS кстати не согласен с ответом ... код в студиюsmile.gif у меня получается
1862446966566326738467820650364979660582552533
Shmatko
Эту прогу писал и сам недавно, но потерял и ессена помню что это просто геморой в плане отладки, вот и спросил - може есть у кого, а то лень писать заново было )
ЗЫ: тока мне нужна была прога на ПАСКАЛЕ ) Думал из названия темы будет понятно ) Точнее фрагмент проги biggrin.gif
Danilych
Мы это делали через строки и перевод их посимвольно в числа. biggrin.gif
Правда это было сложение но алгоритмы схожи.
orgus
ну переведи в паскальsmile.gif два вложенных цикла и 5 действий думаю понятны гыыы
PS убей бог не понимаю в чем геморой то при отладке? хотя паскаль как средство отладки тоже не понимаюsmile.gif
Shmatko
Цитата(orgus @ 20 May 2006, 14:19)
ну переведи в паскальsmile.gif два вложенных цикла и 5 действий думаю понятны гыыы
PS убей бог не понимаю в чем геморой то при отладке? хотя паскаль как средство отладки тоже не понимаюsmile.gif

Ну кто то пишет сразу прально, тк шарит в программировании, я же пишу так, что пожизни приходица отлаживать )
ЗЫ: кто не понял - я шарю в паскале довольно посредственно )
ЗЗЫ: нифига мне там не понятно, я даж нинаю на каком там языке написано ) Я же не программист блин )
Bourn
Цитата(orgus @ 19 May 2006, 21:51)
PS кстати не согласен с ответом ... код в студиюsmile.gif у меня получается
1862446966566326738467820650364979660582552533

может быть, я проверку не делал sad.gif
orgus
ну я тем более паскаль не помнюsmile.gif ... извиняй
gamecreator
оргус прав. это 46-значное число.
Bourn
1862446966566326738467820650364979660582552533

Добавлено ([mergetime]1148148094[/mergetime]):
вот надо было проверку в конец забацать smile.gif
BreakMaster
Цитата(Bourn @ 20 May 2006, 21:03)
Цитата(orgus @ 19 May 2006, 21:51)
PS кстати не согласен с ответом ... код в студиюsmile.gif у меня получается
1862446966566326738467820650364979660582552533

может быть, я проверку не делал sad.gif

А проверка выполняется ручкой и бумагой? crazy.gif
Bourn
Цитата(BreakMaster @ 20 May 2006, 22:40)
А проверка выполняется ручкой и бумагой?  crazy.gif

ну несовсем smile.gif
orgus
а че проверять... кол-во знаков это сумма разрядов ну мэйби + 1 ... а правильность... ну можно перемножить на калькуляторе концевики этак разрядов 5-6 и посмотреть совпало ли.
Felis Ferus
да можно и полный... неужели ни у кого нет научного калькулятора?
Bourn
Цитата(orgus @ 21 May 2006, 00:36)
а че проверять... кол-во знаков это сумма разрядов ну мэйби + 1 ... а правильность... ну можно перемножить на калькуляторе концевики этак разрядов 5-6 и посмотреть совпало ли.

не кол-во знаков, проверять какое число записано в массив, если больше 10 то соответственно осуществляем преобразования...и тп
orgus
я тоже не делал.... скорость вычисления один фиг приемлима, так что почему бы и не делать перенос постоянноsmile.gif в случае < 10 перенесется 0...
Darth_Beleg
А зачем делать перенос постоянно, если достаточно только один раз???
orgus
ваш вариант кода в студиюsmile.gif пока я вижу тока свой
а то не понятен вопрос.
Необходимость переноса возникает при операции умножения или сложения... проверка делать перенос или не делать не актуальна если оптимизация не нужна. Что значит "достаточно только один раз"?smile.gif покажите где в коде убрать чаго нить лишнееsmile.gif
Bourn
вот мой код
Код
Private Sub Command1_Click()
Dim first() As Byte
Dim second() As Byte
Dim third() As Byte
Dim s1 As String
Dim s2 As String
Dim s3 As String
s1 = Trim(Text1.Text)
s2 = Trim(Text2.Text)
If Len(s1) > Len(s2) Then
m = Len(s1)
s2 = String(m - Len(s2), 48) + s2
Else
m = Len(s2)
s1 = String(m - Len(s1), 48) + s1
End If
ReDim first(1 To m), second(1 To m)
n = m
For x = 1 To m
first(x) = Val(Mid(s1, n, 1))
second(x) = Val(Mid(s2, n, 1))
n = n - 1
Next x
n = 1
ReDim third(1 To 2 * m)
For x = 1 To m
For y = 0 To m - 1
 third(x + y) = third(x + y) + (first(x) * second(y + 1)) Mod 10
 third(x + y + 1) = third(x + y + 1) + (first(x) * second(y + 1)) \ 10
 If third(x + y) > 9 Then h = third(x + y): third(x + y) = h Mod 10: third(x + y + 1) = third(x + y + 1) + h \ 10
Next y
Next x
s3 = ""
For x = 1 To UBound(third())
s3 = Trim(Str(third(x))) + s3
Next x
Do While Mid(s3, 1, 1) = "0"
s3 = Right(s3, Len(s3) - 1)
Loop
Text3.Text = s3
End Sub

в Text1.Text и Text2.Text перемножаемые числа в Text3.Text результат
orgus
ну тоже самое "If third(x + y) > 9 Then" если убрать ни чего страшного не будет если конечно бэйсик целочисленно делит а не округляет. А так код напоминает мой, разве что синтаксис глаза режетsad.gif Осталось найти того кто подобное на паскаль переведет для Шматко, если тот и бэйсика не знаетsmile.gif
Bourn
Цитата(orgus @ 21 May 2006, 18:26)
ну тоже самое "If third(x + y) > 9 Then" если убрать ни чего страшного не будет если конечно бэйсик целочисленно делит а не округляет.

всмысле ниче страшного не будет? будет тк допустим в одной ячейке будет число 15(от произведения 3*5) а в другой 3(те мы перемножали 15 и 3) и выйдет 315 вместо 45
Darth_Beleg
Код
program long_mult;
const MAX = 100;
type MyArray = array[1..MAX] of integer;
var
    a,b: MyArray;
    la, lb: integer;
    c: array[1..2*MAX+1] of integer;
    i,j,k: integer;
procedure readnum(var m: MyArray; var l: integer);
var
ch: char;
i, t: integer;
begin
    while not (ch in ['0'..'9']) do
 read(ch);
    while ch in ['0'..'9'] do
    begin
 inc(l);
    m[l] := byte(ch)-48;
 read(ch);
    end;
    readln;
    for i := 1 to l div 2 do
    begin
 t := m[i];
 m[i] := m[l-i+1];
 m[l-i+1] := t;
    end;
end;
begin
    {Input}
    assign(input, 'input.txt'); reset(input);
    assign(output, 'output.txt'); rewrite(output);
    readnum(a, la); readnum(b, lb);
    {Multiplication}
    for i := 1 to la do
 for j := 1 to lb do
     inc(c[i+j-1], a[i]*b[j]);
    {Normalize - one time}
    for i := 1 to 2*MAX do
    begin
 inc(c[i+1], c[i] div 10);
 c[i] := c[i] mod 10;
    end;
    {High-order digit and output}
    for k := 2*MAX+1 downto 2 do
 if c[k] > 0 then break;
    for i := k downto 1 do
 write(c[i]);
    writeln;
    close(output);
end.

Предполагаем, что числа в файле записаны по одному в строке.
Shmatko
О, сэнкс!
orgus
/*исправляюсь*/ решение верное обжалованию не подлежит ..

Добавлено ([mergetime]1148452518[/mergetime]):
Цитата(Bourn @ 21 May 2006, 17:58)
Цитата(orgus @ 21 May 2006, 18:26)
ну тоже самое "If third(x + y) > 9 Then" если убрать ни чего страшного не будет если конечно бэйсик целочисленно делит а не округляет.

всмысле ниче страшного не будет? будет тк допустим в одной ячейке будет число 15(от произведения 3*5) а в другой 3(те мы перемножали 15 и 3) и выйдет 315 вместо 45

не... убрать сам if оставив действие. При умножении ты же не проверяешь было ли число больше 9... просто оставляешь остаток а целую часть переносишь, точно так же можешь не проверять и потом.

PS позно отвечаю, приболелsmile.gif
Darth_Beleg
Цитата
лень паскаль ставить, что будет если число после сумирования "inc(c[i+j-1], a[ i ]*b[j])" превысит 99 ? странно смотрится последующяя попытка нормирования по модулю 10. Не берусь утверждать но на первый взгляд не верное решение.

Диапазон типа integer вообще-то до 32767 в досовском паскале и до 2147483647 в Delphi. Так что ничего не случится.
Нормализация - это наш нижегородский жаргонизм, по-видимому.
Решение проверено тремя поколениями олимпиадников.
orgus
не диапазон тут не при чем, решение верное. Непонимание вызвало то что допускаете ситуацию когда число перескакивает за приделы сотни и после div 10 получаем число > 9 (когда столбиком перемножаем на бумаге так не делаем), но это не страшно так как остаток от деления же остается а остальное потом все равно будет обработано, болею соображаю тугоsmile.gif гы у вас олимпиадники три поколения подряд одно и тоже пишут? (шутююю, просто задача не для олимпиад)
PS у меня и у Bourn столбик реализован так как будто его делают по всем правиламsmile.gif эт от того что пришлось вспоминать что это такое.
Darth_Beleg
Просто задача иногда в комбинаторных числах выплывает - а хороший код учится наизусть. Тем более, что и в чистом виде встречал.
Впрочем, вологодские олимпиадники пишут как вы (судя по книге Ф. Меньшикова) - я даже удивился.
orgus
я на олимпиадах не был ... эээээ ... ну лет 10:) ездил конечно, правдо было сложно что либо выйграть так как тяжеловато писать олимпиадные задачи зная лишь dbase3 Карат и Клиперsmile.gif учитель у нас был разработчиком баз данных... хотя теорию не плохо преподал. Да и образование подводило... забавно было сидеть и прямо на олимпиаде разбираться что же такое польская запись ибо в нашей школе такого как то не преподавали.
izrukvruki
Мне нужна помощь. Нужна программка на Паскале:
Есть построковый файл rasklad.txt
12345566 12 76
32211233 3 6
55443323 5 76
77675655 4 98
44333221 7 76
....
44333221 5 87
12345566 54 65

(структура такая: сначало восьмизначное число, пробел, короткое число (1-3 знака), пробел, короткое число (1-3 знака)

нужно проверить наличие двойных восьмизначных первых чисел и получить в результате файл error.txt

Дубли:
12345566 12 76 и 12345566 54 65
44333221 7 76 и 44333221 5 87

Спасибо за вникание
sergroj
Это тебе для себя или на проверку? Алгоритм попроще или пооптимальнее? А если дублей больше 2 че делать?
izrukvruki
Для себя. Алгоритм какой полегче реализовать. Ну пуст допишет в строку третий набор, т.е.
12345566 12 76 и 12345566 54 65 и 12345566 5 89

Первая восьмизначная цифра это наименование объекта (номер рекламного макета), вторые две ее координаты (рубрика и подрубрика, или страница и колонка), (на самом деле после восьмизначной цифры может стоять все что угодно, эти значения учитывать не надо, но привязку к восьмизначной цифры обязательно оставлять надо). Нельзя чтоб на плоскости было два одинаковых объекта в разных местах, это приводит к ошибке работы одной программы, которой я ежедневно пользуюсь. Исходный файл имеет около 8000 строк. Двойные объекты это конечно редкость, но все же иногда попадаются.

Rask.txt

a1 b1
a2 b2
....
a6000 b6000

(где ai возьмизначная цифра (может начинаться с нулей, 00005654), bi - строка.)

если ai=aj и aj=ak
то в файл error.txt записать

Дубли:
ai bi и aj bj и ak bk
sergroj
А Дельфи не подойдет? (по синтаксису есть мелкие расширения, я делать в нем буду, потом подправлю/ишь если че)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.