Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2008, 18:04   #1
ReaktiV
Пользователь
 
Аватар для ReaktiV
 
Регистрация: 25.07.2008
Сообщений: 82
По умолчанию Проблема с работой с файлами (Паскаль)

Вот на каникулах решил изучать Паскаль, помогите решить задачу точнее я её уже решил просто как к этому подсоединить файлы чисто для примера помогите:
Вот условие задачи:
Цитата:
Имя входного файла tri.in
Имя выходного файла Tri.out

Фигура 1-ого уровня назовем обычный равносторонний треугольник. Фигура i-уровня получается из фигуры (i-1)-го уровня следующим образом. Каждый из маленьких равносторонних треугольников, кроме треугольников, образованных средними линиями треугольника большого размера, разбивается на 4 равносторонних с вдвое меньшей стороной. На рисуноке изображены фигуры первого, второго и третьего уровней:
Цитата:
Напишите программу, которая будет вычислять, сколько всего треугольников содержит фигурв N-ого уровня.
Формат входных данных Во входном файле находится единственно целое число N(1<=N<=35) уровнь фигуры.
Формат выходных данных
В выходной файл ваведите единственное число.количество треугольников в данной фигуре.
пример
1-1
2-5
3-17
Ну и вот как я её решил:
Цитата:
program tref;
var
n,i:integer;
k,m:real;
begin
writeln('n');
readln(n);
m:=1;
k:=(1/3);
if n=1 then writeln('1') else
begin
n:=n-1;
for i:=1 to n do {n - уровень фигуры}
begin
m:=m+4*(3*k); {колличество треугольников в фигуре}
K:=K*3 {k:=1}
end;
writeln(m:3:3);
end;
readln;
end.
Объясните пожалуйста и если можно покажите как прекрепить файлы и как можно эту задачу решить легче? Я просто сам учусь? пока всего не знаю, для примера хочу посмотреть.

P.S. Рисунок выложен внизу.
ReaktiV вне форума Ответить с цитированием
Старый 25.07.2008, 19:37   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

AssignFile
Reset/Rewrite
далее Read(ln)/Write(ln)
потом CloseFile
P.S. читай хоть немного учебники
rpy3uH вне форума Ответить с цитированием
Старый 25.07.2008, 21:40   #3
ReaktiV
Пользователь
 
Аватар для ReaktiV
 
Регистрация: 25.07.2008
Сообщений: 82
По умолчанию

Ты вроде что то переаутал с Delphi?
ReaktiV вне форума Ответить с цитированием
Старый 26.07.2008, 09:20   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

ну тогда вот так
Assign
Reset/Rewrite
далее Read(ln)/Write(ln)
потом Close
rpy3uH вне форума Ответить с цитированием
Старый 26.07.2008, 12:07   #5
ReaktiV
Пользователь
 
Аватар для ReaktiV
 
Регистрация: 25.07.2008
Сообщений: 82
По умолчанию

Чё то вроде как то не так, а куда Tri.out девать? Можно все же поподробние, если не трудно.
ReaktiV вне форума Ответить с цитированием
Старый 26.07.2008, 13:01   #6
Господин ПэЖэ
Пользователь
 
Регистрация: 24.07.2008
Сообщений: 10
По умолчанию

Самый распространённый и самый смертельный грех всех программистов - кидаться писать код, не осмыслив алгоритма.
Если дать себе труд подумать несколько минут перед тем, как начать писать, то сам себе сделаешь огромную услугу. А может быть и Всему Человечеству. Все нынешние "биллы гейтсы" хорошо умеют писать, а думать просто не считают нужным. Я бы за это просто сажал бы на кол. Писателей среди программистов больше, чем программистов. (Вспомним Марка Твена :"Дураков на свете больше, чем людей.") Ни в коем случае не становись таким. Думай!!!! Ей Богу, это самое приятное занятие на свете!!!

Но, в сторону лирику. Не считай, что ставлю тебя в угол. Просто усвой эту аксиому! Думать, думать, думать .... Только потом писать.

Вот что получается с твоей задачкой, если хоть чуточку порассуждать:

1. Родительский треугольник + 4 его ребёнка
1+4.
2. Трое из 4 детей рожают ещё по 4
+3*4
3. И далее в том же духе - каждые трое из 4-х новорождённых рожают 4-х новых.
. Итого:________(1+4)___+ (3*4)___+ (3*3*4) + ... (и т. д.)
. Или так:___1 + (4*3^0) + (4*3^1) + (4*3^2) +... + (4*3^(n-2))

Вот теперь всё очень просто напишется:

Цитата:
program tref;
var
n,i:byte; {n - количество уровней}
k,m:real; {k - количество родителей на данном уровне, m - конечный результат}
f_in: file of byte; {Входной файл}
f_out:file of real; {Выходной файл}

begin
...assign(f_in,'tri.in'); {Обозвали входной файл}
...reset(f_in);...........{Открыли его на чтение}
...k:=1;
...m:=1;
...read(f_in,n);..........{Взяли входные данные из файла}
...close(f_in);...........{Закрыли входной файл}
...if n>1then
...for i:=2to n do
...begin
......m:=m+4*k;
......k:=k*3;
...end;
...writeln(m:0:0);............{Для морального удовлетворения }
...assign(f_out,'tri.out');...{Обозвали выходной файл}
...rewrite(f_out);.............{Открыли его на запись}
...write(f_out,m);............{Скинули полученные данные}
...close(f_out);...............{Закрыли. Теперь можем открыть его, например вьюером тотал-командера и посмотреть дамп}
end.
А вообще лучше всего - найди Паскать Турбовижин 7.0. В нём отличный хелп. Есть даже на русском (могу скинуть в мыло). Там даже есть примеры, которые можешь прямо вставлять в свои исходники и с ними экспериментировать в отладчике.

ЗЫ:Критику не воспринимай, как ругань.

Последний раз редактировалось Господин ПэЖэ; 26.07.2008 в 13:10.
Господин ПэЖэ вне форума Ответить с цитированием
Старый 26.07.2008, 13:03   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Открываешь Блокнот, записываешь в нем одно число, сохраняешь под именем Tri с расширением *in. Помещаешь в одну папку с программой.
Пишешь программу.
Я кое-что поправил. Модуль Crt подключаешь, если у тебя Турбо Паскаль или Паскаль АВС.
Выходной файл будет в той же папке.
Код:
program tref;
uses crt; {подключаем модуль для работы с экраном}
var
n,i:integer;
k,m:real;
f,g:Text; {переменные для связи с файлами}
begin
clrscr; {очищаем экран}
Assign(f,'Tri.in'); {связываем переменную f с исходным файлом}
reset(f);   {открываем его для чтения}
Assign(g,'Tri.out'); {связываем переменную g с выходным файлом}
rewrite(g); {открываем файл для записи}
read(f,n);  {читаем входные данные}
m:=1;
k:=1/3;
if n=1 then
   begin
     writeln('m=','1');{выводим на экран}
     write(g,'1'); {записываем в выходной файл}
   end
else
   for i:=1 to n-1 do {n - уровень фигуры}
       begin
         m:=m+12*k; {колличество треугольников в фигуре}
         k:=k*3;
       end;
writeln('m=',m:0:0);{выводим на экран}
write(g,m:0:0);{записываем в выходной файл}
readln;
close(f);{закрываем файлы}
close(g);
end.

Последний раз редактировалось puporev; 26.07.2008 в 13:06.
puporev вне форума Ответить с цитированием
Старый 26.07.2008, 13:45   #8
ReaktiV
Пользователь
 
Аватар для ReaktiV
 
Регистрация: 25.07.2008
Сообщений: 82
По умолчанию

С этим все ясно спасибо. Ну принципе Господин ПэЖэ у меня тоже вроде правильно было написано.
Но вот появились ещё вопросы:
1. Например словосочетание: "Introduction to algorithms" как можно подсчетать сколько букв в отдельно взятом здесь слове?

Последний раз редактировалось ReaktiV; 26.07.2008 в 13:48.
ReaktiV вне форума Ответить с цитированием
Старый 26.07.2008, 14:07   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Если решать только для этого конкретного словосочетания, то можно просто в лоб.
Код:
uses crt;
const s:string='Introduction to algorithms';
var l1,l2,l3:integer; {длины слов}
begin
clrscr;
l1:=pos(' ',s)-1; {первое слово - позиция первого пробела в строке}
delete(s,1,pos(' ',s));{удаляем первое слово с пробелом}
l2:=pos(' ',s)-1;  {второе слово так же}
delete(s,1,pos(' ',s));
l3:=length(s);  {третье слово - длина оставшейся строки}
writeln('l1=',l1,'  l2=',l2,'  l3=',l3);
readln
end.
Если же строка состоит из многих слов и вводится с клавиатуры, то этот способ не подойдет. Нужно будет делать тоже самое, но в цикле:
while pos(' ',s)<>0 do
begin
.....
end;
Для удобства нужно добавить пробел в конец строки s:=s+' ';
В цикле длины слов можно сразу выводить на экран, или собирать в массив и потом выводить сразу все. Зависит от конкретной поставленной задачи.
puporev вне форума Ответить с цитированием
Старый 26.07.2008, 14:21   #10
-=<[Evklidd]>=-
Форумчанин Подтвердите свой е-майл
 
Аватар для -=<[Evklidd]>=-
 
Регистрация: 22.01.2008
Сообщений: 161
По умолчанию

Вот код программы, которая определит длину всех слов исходной строки с учетом почти всех знаков препинания.
Код:
program pro33;
var
 dec: set of char;
 s: string;
 i, j: integer;
 k: byte;
 kolbuk: array [1..128] of byte;
begin
 writeln('Vvedite stroku: ');
 readln(s);
 k:= 1;
 i:= 1;
 dec:= [' ',',','.','?','!',';'];
 while i <= Length(s) do
  begin
   if s[i] in dec then
    inc(i)
   else
    begin
     j:= 0;
     while not(s[i] in dec) and (i <= Length(s)) do
      begin
       inc(j);
       inc(i);
      end;
     kolbuk[k]:= j;
     inc(k);
    end;
  end;
 for i:= 1 to k-1 do
  writeln('Kol-vo bukv v ', i, '-om slove: ', kolbuk[i]);
 readln;
end.
З.Ы. Можно расширить множество знаков препинания по своему усмотрению
-=<[Evklidd]>=- вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с файлами в Pascale velgelmina Помощь студентам 3 26.03.2010 23:14
Проблема с работой програм на компах без С++ Bitrayder Общие вопросы C/C++ 2 02.03.2008 01:09
Паскаль. Работа с файлами, дисплеем. Надюха Помощь студентам 1 21.09.2007 07:43