Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ комбинированные типы данных

Автор: -Dimanez- 11.12.2007 5:49

не в тему: почему не могу создавать новые темы будучи пользователем, а гостем без проблем...? дескриминация)



есть программа....где описывается массив записей,которые содержит информацию о нескольких деталях(наименование, масса, габаитные размеры: длина, ширина,высота: материал).
опеределиьт массу всех деталей.
вот сам текст программы:

program zapisi;
const
nmax=10;
type
plant=record
name:string[10];
massa:integer;
gr:record
dl:integer;
sh:integer;
vis:integer;
end;
mtl:string[10]
end;

var
summary; array [1..nmax] of plant;
i,k,n,s:integer;

begin
writeln('введите количество деталей');
readln(n);

{ввод записей}

for i;=1 to n do
with summary[i] do
begin
writeln('введите данные о',i,'-ой детале:');
writeln('наименование');
readln(name);
with gr do
writeln('длина');
read(dl);
writeln('ширина');
read(sh);
writeln('высота');
read(vis)
end;
writeln('материал');
readln(mtl);
end;

{вывод заголовка таблицы}
... ...

{формирование и вывод итоговой строки}
s:=0;
for I:=1 to n do
with summary[i] do
begin
s:=s+massa;
end;
with summary[n+1] do
begin
name:='сумма масс';
massa:=s;
begin
for k:=1 to 80 do
write('_');
writeln;
end;
writeln('|',name,'':12-length(name),'|':2,s:8,'|':2);
end;
for k:=1 to 80 do
write('_');
writeln;
end.



затрудения:
- при вводи строк, игнорирует строку-материал....
- не хочет считать сумму масс..оставляет поле пустым....возможно вывод итоговой строки неправильно оформил...


наедеюсь на помощб)))


Автор: volvo 11.12.2007 5:57

Цитата
при вводи строк, игнорирует строку-материал....
При вводе строк надо пользоваться ReadLn вместо Read, если нужно объяснение, почему - в поиск, уже неоднократно объяснялось... Поменяй все Read-ы на ReadLn...

А вот со вторым вопросом - разбираться надо, что там у тебя накручено, но поскольку текст не оформлен тегами (и, естественно, потерял все форматирование - если оно и было), то этого я делать не буду...

Добавлено через 3 мин.
По поводу
Цитата
не могу создавать новые темы будучи пользователем, а гостем без проблем
- идешь сюда: http://forum.pascal.net.ru/index.php?showforum=9
поднимаешь глаза наверх, и в разделе объявление видишь заголовок... Смотришь, в чем дело...

Автор: neic 11.12.2007 6:06

1. Вот ты-то уморил =).
for i;=1 to n do
with summary[i] do
begin
writeln('введите данные о',i,'-ой детале:');
writeln('наименование');
readln(name);
with gr do
begin
writeln('длина');
read(dl);
writeln('ширина');
read(sh);
writeln('высота');
read(vis)
end;
writeln('материал');
readln(mtl);
end;

А begin кто за тя вставлять будет? Кот Вася из первого подъезда?

2. А я в коде вообще не вижу чтобы ты массу заполнял blink.gif blink.gif

Автор: Dimanez 11.12.2007 6:10

черт..правда))..спасибо...сейчас испробуем)
насчет begin - не первый его пропуск в прогрмме((

Автор: neic 11.12.2007 6:12

Пиши сразу же форматом. А так сам путаешься и других в заблуждение вводишь. ;)
Будут вопросы стучи в тему ;)

Автор: Dimanez 21.12.2007 2:36

вот текст программы...с выводом таблицы итд...есь один момент...
при вводе более одной детали, программка выводи ток первую строку ..но ! подсчет суммы (что и требуется от программы) идет со всех данных о деталях..

то есть..выводит только одну первую строку...

помогите разобраться..

program lab7; 
nmax=10;
type
plant=record
name:string[10];
massa:integer;
gr:record
dl:integer;
sh:integer;
vs:integer
end;
mtl:string[10]
end;

var
summary:array[1..nmax] of plant;
i,k,n,s:integer;
begin
writeln('введите количество деталей');
readln(n);

for i:=1 to n do
with summary[i] do
begin
writeln('введите данные о',i,'-ой детале:');
write('наименование ');
readln(name);
write('масса ');
readln(massa);

with gr do
begin
write('длина ');
read(dl);
write('ширина ');
read(sh);
write('высота ');
readln(vs)
end;
write('материал ');
readln(mtl);
end;
{вывод заголовка таблицы}
for k:=1 to 80 do
write('_');
write('|','|':15,'|':10,'габаритные размеры':30,'|':10,'|':14);
write('|','наименование |':13,' масса |':10,'длина |':13,
'ширина |':13,'высота |':14,'материал |':14);
for k:=1 to 80 do
write('_');


{вывод строк таблицы}
for i:=1 to n do
with summary[i] do
begin
write('|',name:10,'':3-length(name),'|':3,
massa:7,'|':3,
gr.dl:10,'|':3,
gr.sh:10,'|':3,
gr.vs:11,'|':3,
mtl:10,'':4-length(mtl),'|');
for k:=1 to 80 do
write('_');
write;

{формирование и вывод итоговой строки}
s:=0;
for i:=1 to n do
with summary[i] do
begin
s:=s+massa;
end;
with summary[n+1] do
begin
name:='общая сумма';
massa:=s;
write('|',name:12,'':3-length(name),'|':3,s:7,'|':3,'|':54);
end;
for k:=1 to 80 do
write('_');
writeln;
end;
readln;
end.

Автор: volvo 21.12.2007 3:10

{формирование и вывод итоговой строки}
s:=0;
for i:=1 to n do { <--- !!! }
with summary[i] do
begin

Отмеченное место является ошибкой... У тебя там присутствует вложенный цикл, причем по той же переменной I, что и внешний, "Вывод строк таблицы"...

Отформатируй исходник как положено - сам все увидишь...

Автор: Dimanez 21.12.2007 5:37

спасиб)...помогло)...всроду не догадался бы)

{формирование и вывод итоговой строки}
s:=0;
for i:=1 to m do { <--- !!! }
with summary[i] do
begin


ввел новый парметр цикла...

но возник дургой вопрос...теперь после каждой строки записи он выдает итоговую строк с суммой масс...а не в самом конце...исправить так и не получилось...
результат один и тот же...или после каждой строки или макси-шоу ввиде бесконечного вывода строк...



Автор: volvo 21.12.2007 5:56

Видимо, ты так и не переформатировал исходник. И не видишь, где у тебя один цикл, а где - другой... Вот же они:

  {вывод строк таблицы}
for i:=1 to n do
with summary[i] do begin
{ используем WriteLN }
writeln('|',name:10,'':3-length(name),'|':3,
massa:7,'|':3,
gr.dl:10,'|':3,
gr.sh:10,'|':3,
gr.vs:11,'|':3,
mtl:10,'':4-length(mtl),'|');

end; { <--- Все, вывод данных закончился... Осталась только итоговая строка }

{ Разделитель }
for k:=1 to 80 do write('_');
writeln;

{ формирование и вывод итоговой строки }
s:=0;
for j:=1 to n do
with summary[j] do begin
s:=s+massa;
end;

with summary[n+1] do begin
name:='общая сумма';
massa:=s;
writeln('|',name:12,'':3-length(name),'|':3,s:7,'|':3,'|':54); { <--- Опять writeLN }
end;

{ и еще разделитель }
for k:=1 to 80 do write('_');
writeln;

Можно здесь ошибиться?