TiPo Опубликовано 4 мая, 2013 Жалоба Поделиться Опубликовано 4 мая, 2013 Решал лёгкую задачу, решил, но код получился, мне кажется, не очень хорошим. Потом посмотрел решение другого человека, так у него решение оказалось в два раза короче.Пожалуйста посмотрите решения и укажите на ошибки.Условие задачи:В небольшом островном государстве действовали забавные законы относительнотранспортных средств – автобусов, грузовиков, легковушек.Во-первых, общее количество автомобилей на острове не должно было превышать256. Автомобилям назначались номера с 0 до 255, при этом соблюдались следующиеправила.Номера, делившиеся без остатка на 7, назначались автобусам. Те, что делились безостатка на 5, назначались грузовикам, а все прочие – легковушкам. Так, например, номера35 и 70 доставались автобусам, а не грузовикам, хоть и делились на 5.Похожие правила применялись и к окраске автомобилей, а именно.Если номер авто делился на 4, его красили красным, если на 3 – желтым, если на 2 –белым, а остальные автомобили красили черным.· Сформируйте три множества по классам автомобилей – автобусы, грузовики илегковушки. Вычислите количество машин каждого класса (Ответ: 37, 44, 175).· Сформируйте четыре множества по цвету автомобилей – красные, желтые, белые ичерные. Определите количество машин каждого цвета (Ответ: 64, 64, 43, 85).· Столица того государства – деревня Кокосовка – страдала от пробок. Для борьбы сними ввели ограничение на въезд транспорта. Так, в один из дней недели в столицупускали только красные легковушки, белые грузовики и все автобусы. Найдитеномера всех этих машин. Сколько всего автомобилей могло въехать в столицу в тотдень?Моё решение: TSet = set of byte;var i:byte; Bus, Truck, Car, Red, Yellow, White, Black, Sets:TSet;function ReadType(aI:byte):TSet;var n:byte;begin ReadType:=[]; for n:=0 to 255 do if n mod aI=0 then ReadType:=ReadType+[n];end;procedure SetOfType(var aBus, aTruck, aCar:TSet);var i, j:byte;begin i:=7; repeat case i of 7:aBus:=ReadType(i); 5:aTruck:=ReadType(i)-aBus; else for j:=0 to 255 do if not (j in aBus+aTruck) then aCar:=aCar+[j]; end; i:=i-2; until i<3;end;function ReadColor(aI:byte):TSet;var n:byte;begin ReadColor:=[]; for n:=0 to 255 do if n mod aI=0 then ReadColor:=ReadColor+[n];end;procedure SetOfColor(var aRed, aYellow, aWhite, aBlack:TSet);var i, j:byte;begin i:=4; repeat case i of 4:aRed:=ReadColor(i); 3:aYellow:=ReadColor(i)-aRed; 2:aWhite:=ReadColor(i)-(aRed+aYellow); else for j:=0 to 255 do if not (j in aRed+aYellow+aWhite) then aBlack:=aBlack+[j]; end; dec(i); until i=0;end;procedure WriteSets(aSet:TSet);var j, k:byte;begin k:=0; for j:=0 to 255 do begin if j in aSet then inc(k); end; write(k, ' ');end;begin //Множества типов автомобилей Bus:=[]; Truck:=[]; Car:=[]; //Множество цветов Red:=[]; Yellow:=[]; White:=[]; Black:=[]; SetOfType(Bus, Truck, Car); SetOfColor(Red, Yellow, White, Black); for i:=1 to 7 do begin case i of 1:Sets:=Bus; 2:Sets:=Truck; 3:Sets:=Car; 4:Sets:=Red; 5:Sets:=Yellow; 6:Sets:=White; 7:Sets:=Black; end; WriteSets(Sets); if (i=3) or (i=7) then writeln; end; Sets:=(Red*Car)+(White*Truck)+Bus; WriteSets(Sets); readln;end.typeРешение другого человека:procedure WriteSet(const aSet : TAuto);var k : integer;beginfor k:=0 to 255 do if k in aSet then Write(k:4);Writeln; Writeln('---');end;function Count(const aSet : TAuto): integer;var k, r : integer;beginr:=0;for k:=0 to 255 do if k in aSet then Inc(r);Result:=r;end;var Bus, Truck, Car : TAuto;Red, Yellow, White, Black : TAuto;i: integer;R: TAuto;beginBus:=[]; Truck:=[]; Car:=[];Red:=[]; Yellow:=[]; White:=[]; Black:=[];for i := 0 to 255 do beginif (i mod 7 = 0) then Bus:= Bus+[i]elseif (i mod 5 = 0) then Truck:= Truck+[i]elseCar:= Car+[i];end;for i := 0 to 255 do beginif (i mod 4 = 0) then Red:= Red+[i]elseif (i mod 3 = 0) then Yellow:= Yellow+[i]elseif (i mod 2 = 0) then White:= White+[i]elseBlack:= Black+[i];end;Writeln(Count(Bus)); WriteSet(Bus);Writeln(Count(Truck)); WriteSet(Truck);Writeln(Count(Car)); WriteSet(Car);Readln;Writeln(Count(Red)); WriteSet(Red);Writeln(Count(Yellow));WriteSet(Yellow);Writeln(Count(White)); WriteSet(White);Writeln(Count(Black)); WriteSet(Black);Readln;R:= Red*Car + White*Truck + Bus;Writeln(Count(R)); WriteSet(R);Readln;end.type TAuto = set of byte; Ссылка на комментарий
promises Опубликовано 5 мая, 2013 Жалоба Поделиться Опубликовано 5 мая, 2013 У тебя для того, чтобы сформировать очередное множество, каждый раз делается новый проход по циклу. Это в принципе неважно, когда машин всего 256, а если их будет несколько миллионов, то будет уже довольно затратно.Я бы, наверное, как во втором варианте сделал только все в одном цикле .Кстати, по-моему тут нулевой элемент неправильно назначается, вроде должен быть черный легковой автомобиль, а получается красный автобус Ссылка на комментарий
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти