Неизвестный смайлик.
программирование в Паскале
Первая программа:
Вычислить все делители целого положительного числа. Вывести их на экран (кроме себя самого и 1). Обеспечить проверку входных данных.
Решение:
program deliteli;
uses crt;
var a, b, s : real;
k, n : integer;
const q : word = 0;
Begin
{Блок проверки входных данных}
clrscr;
repeat
writeln ('Vvedite chislo (bolshe nula i cseloe): '
;
readln (a);
b := frac(a);
until (a > 0) and (b = 0);
{Сама программа}
n := round (a - 1);
for k := 2 to n do
Begin
s := frac(a/k);
if s = 0 then writeln(k);
if s = 0 then inc(q);
end;
if a > 10e7 then writeln ('Chislo slishkom bolshoe'
else
if q = 0 then writeln('Chislo prostoe'
;
repeat until keyPressed;
end.
Вторая:
Составить рекурсивный алгоритм и написать программу вычисляющее значение фунции:
f(x) =
ln(x) + f ( ln(x) ) , x > 10^(-6)
0 , x <= 10^(-6)
Где фунция сверху и ноль снизу обьеденены в систему и х - вещественное число.
Определить форму рекурсивного алгоритма (спуск, возврат, спуск-возврат)
Решение:
Program rekursia;
uses crt;
var x : real;
f : extended;
{Блок рекурсии}
function fact(x : real) : extended;
const num : word = 0;
begin
inc(num);
if (num = 1) then writeln('Rekursia prohodit - ', num, ' raz'
else writeln('Rekursia prohodit - ', num, ' raza'
;
if (x <= 10e-6) then fact := 0 else
if (x = 0) or (x = exp(1)) then fact := 1
else fact := ln (x) + fact (ln (x));
end;
{Блок программы}
begin
clrscr;
writeln('Vvedite argument x: '
;
readln (x);
f := fact(x);
writeln ('Znachenie funcii dlai dannogo argumenta budet ravno: ', f:8:5);
repeat until keyPressed;
end.
Третья:
1) Создать файл заполненый вещественными числами из диапазона [0,1] Записать число М перед N-ым элементом такого файла, сдвинув N+1-ый, N+2-ой и т.д. элементы к концу файла (M и N задаются с клавиатуры).
Пример: Первоначальный файл: 0.0271 0.8762 0.4853 0.8744 0.8555
Число 0.7465 необходимо записать перед третьим элементом.
В результате получим в файле:
0.0271 0.8762 0.4853 0.7465 0.8744 0.8555
2) Вычислить контрольную сумму получаемого файла открыв его заново.
ЗАМЕЧАНИЕ: В програме запрещается заводить вспомогательные файлы и массивы.
Program fails;
uses crt;
Var nn : integer;
mainfile, buffer : file of real;
namef : string;
mainfilee : file;
procedure zapis (n : integer; name : string);
var i : integer; rand : real;
begin
assign (mainfile, name);
rewrite (mainfile);
for i := 1 to n do
begin
rand := random;
write (mainfile, rand);
writeln (' ', rand:4:2);
end;
end;
procedure pere_mes (n : integer; name : string);
var j, l, t, b, q : integer; f, v, k, a, p, y : real;
begin
Assign (mainfile, name);
reset (mainfile);
writeln ('Vvedite M:'
;
readln (v);
writeln ('Vvedite N:'
;
readln (b);
seek (mainfile, b);
read (mainfile, f);
seek (mainfile, b);
write (mainfile, v);
q := 1;
for j := b + 1 to n - 1 do
begin
if not eof (mainfile) then
if odd(q) then
k := y;
seek (mainfile, j);
read (mainfile, k);
seek (mainfile, j);
write (mainfile, f);
inc(q);
p := f;
if not odd(q) then
y := k;
seek (mainfile, j);
read (mainfile, p);
seek (mainfile, j);
write (mainfile, y);
inc(q);
f := p;
end;
seek (mainfile, 0);
while not eof (mainfile) do
begin
read (mainfile, a);
write (' ', a:4:2);
end;
close (mainfile);
end;
begin
clrscr;
Writeln ('Vvedite kolichestvo chisel: '
;
readln (nn);
Writeln ('Vvedite imja fjla: '
;
readln (namef);
zapis (nn, namef);
pere_mes (nn, namef);
assign (mainfilee, namef);
reset (mainfilee, 1);
repeat until keyPressed;
end.
Первая программа:
Вычислить все делители целого положительного числа. Вывести их на экран (кроме себя самого и 1). Обеспечить проверку входных данных.
Решение:
program deliteli;
uses crt;
var a, b, s : real;
k, n : integer;
const q : word = 0;
Begin
{Блок проверки входных данных}
clrscr;
repeat
writeln ('Vvedite chislo (bolshe nula i cseloe): '

readln (a);
b := frac(a);
until (a > 0) and (b = 0);
{Сама программа}
n := round (a - 1);
for k := 2 to n do
Begin
s := frac(a/k);
if s = 0 then writeln(k);
if s = 0 then inc(q);
end;
if a > 10e7 then writeln ('Chislo slishkom bolshoe'

if q = 0 then writeln('Chislo prostoe'

repeat until keyPressed;
end.
Вторая:
Составить рекурсивный алгоритм и написать программу вычисляющее значение фунции:
f(x) =
ln(x) + f ( ln(x) ) , x > 10^(-6)
0 , x <= 10^(-6)
Где фунция сверху и ноль снизу обьеденены в систему и х - вещественное число.
Определить форму рекурсивного алгоритма (спуск, возврат, спуск-возврат)
Решение:
Program rekursia;
uses crt;
var x : real;
f : extended;
{Блок рекурсии}
function fact(x : real) : extended;
const num : word = 0;
begin
inc(num);
if (num = 1) then writeln('Rekursia prohodit - ', num, ' raz'

else writeln('Rekursia prohodit - ', num, ' raza'

if (x <= 10e-6) then fact := 0 else
if (x = 0) or (x = exp(1)) then fact := 1
else fact := ln (x) + fact (ln (x));
end;
{Блок программы}
begin
clrscr;
writeln('Vvedite argument x: '

readln (x);
f := fact(x);
writeln ('Znachenie funcii dlai dannogo argumenta budet ravno: ', f:8:5);
repeat until keyPressed;
end.
Третья:
1) Создать файл заполненый вещественными числами из диапазона [0,1] Записать число М перед N-ым элементом такого файла, сдвинув N+1-ый, N+2-ой и т.д. элементы к концу файла (M и N задаются с клавиатуры).
Пример: Первоначальный файл: 0.0271 0.8762 0.4853 0.8744 0.8555
Число 0.7465 необходимо записать перед третьим элементом.
В результате получим в файле:
0.0271 0.8762 0.4853 0.7465 0.8744 0.8555
2) Вычислить контрольную сумму получаемого файла открыв его заново.
ЗАМЕЧАНИЕ: В програме запрещается заводить вспомогательные файлы и массивы.
Program fails;
uses crt;
Var nn : integer;
mainfile, buffer : file of real;
namef : string;
mainfilee : file;
procedure zapis (n : integer; name : string);
var i : integer; rand : real;
begin
assign (mainfile, name);
rewrite (mainfile);
for i := 1 to n do
begin
rand := random;
write (mainfile, rand);
writeln (' ', rand:4:2);
end;
end;
procedure pere_mes (n : integer; name : string);
var j, l, t, b, q : integer; f, v, k, a, p, y : real;
begin
Assign (mainfile, name);
reset (mainfile);
writeln ('Vvedite M:'

readln (v);
writeln ('Vvedite N:'

readln (b);
seek (mainfile, b);
read (mainfile, f);
seek (mainfile, b);
write (mainfile, v);
q := 1;
for j := b + 1 to n - 1 do
begin
if not eof (mainfile) then
if odd(q) then
k := y;
seek (mainfile, j);
read (mainfile, k);
seek (mainfile, j);
write (mainfile, f);
inc(q);
p := f;
if not odd(q) then
y := k;
seek (mainfile, j);
read (mainfile, p);
seek (mainfile, j);
write (mainfile, y);
inc(q);
f := p;
end;
seek (mainfile, 0);
while not eof (mainfile) do
begin
read (mainfile, a);
write (' ', a:4:2);
end;
close (mainfile);
end;
begin
clrscr;
Writeln ('Vvedite kolichestvo chisel: '

readln (nn);
Writeln ('Vvedite imja fjla: '

readln (namef);
zapis (nn, namef);
pere_mes (nn, namef);
assign (mainfilee, namef);
reset (mainfilee, 1);
repeat until keyPressed;
end.
П.С. а тебе до какого надо?
При вводе тебе надо проверять на соответствие типа переменную. пусть N -это введенное число
Ну а дальше организовываешь цикл от 2 до N (for i:=2 to N do)
и выводишь только те числа которые делятся на i без остатка (if (N mod i)=0 then writeln(i)
можно еще количество делителей счиать.
По секрету всему свету... Эх..
А время? Где взять время?! Я ж тебе говорила...
И потом мы с Паломником оптимизма в разных часовых поясах - когда у него утро, у меня уже ночь...
Мне долго сейчас лазить по хелпам, могу рассказать алгоритм
При вводе переменная проверяется на правильность типа. т.е. если у тебя integer а ты введешь real то прогамма выдаст ошибку и прекратит выполнеение. Можно запретить это делать автоматически, а сделать это вручную.
эмм наверно попрежнему не понятно? ладно поищу пример в хелпе
program deliteli;
var a, b, s : real;
k, n : integer;
begin
repeat
writeln ('Vvedite chislo (bolshe nula i cseloe): ');
readln (a);
b := frac(a)
until (a > 0) and (b = 0)
for k := 1 to n:= a do
begin
s := frac (a/k);
if s = 0 then writeln (k);
end;
end.
Блок repeat - until проверка входных данных. Именно поэтому "а", т.е. вводимое начальное число должно быть и отрицательным и не целым. Т.е. я ему присвоил Реал. Здесь то все нормуль. Но потом, когда идет просчет всех чисел от к := 1 до а, "а" здесь обязано быть целым! А как я к целому присвою вещественное? Диапазоны разные не поместятся. =(
Если бы убрать проверку "а" запихнуть в интегр, то программа работает. (правда, там еще надо условие про 1 и само число, но это легко)
Мне главный геморой - последняя третья задача.
program deliteli;
var b, s : real;
a, k, n : integer;
Begin
{Блок проверки входных данных}
repeat
writeln ('Vvedite chislo (bolshe nula i cseloe): ');
readln (a);
b := frac(a);
until (a > 0) and (b = 0);
{Сама программа}
n := round (a - 1);
for k := 2 to n do
Begin
s := frac(a/k);
if s = 0 then writeln(k);
end;
end.
А вот вторая задача:
program rekursia;
var x : real;
f : comp;
{Рекурсия}
function fact(x : real) : comp;
const num : word = 0;
begin
inc(num); writeln(num);
if (x <= 10e-6) then fact := 0 else
if (x = 0) or (x = exp(1)) then fact := 1
else fact := ln (x) + fact (ln (x));
end;
{Обращение к фунции}
begin
writeln('Vvedite x: ');
readln (x);
f := fact(x);
writeln (f:7:3);
end.
Так вот. Вторая программа вроде, что-то считает =) Но почему-то все значения исключительно целые. ПОЧЕМУ?
Написал, блин, comp и еще спрашиваю почему целое =)
Так что вторая задача тоже ушла в утиль, только скажите мне что это за рекурсия и обьясните почему она именно такая?
Рекурсия это алгоритм в котором функция или процедура обращается сама к себе. Иногда незаменимая вещь.
В твоей программе я не вижу выхода из расчетов, функция зациклюется сама на себе. Может огрничешь количество обращений до какого-то значиние счетчика num? А ты уже пробывал компилировать? Почему у тебя num объявлена как константа?
А понял в чем дело твоя функция зациклюется при первом же обращении, а те целые числа что ты видишь это значения num.
num - это я вообще сделал для того что бы показано было колличество прохождений рекусивного потока.
Пробывал я компилировать - программу уже доработал всеми примочками (типа зависающего экрана) и т.п. Все работает. Мне бы ТРЕТЬЮ ЗАДАЧУ =(
ЗЫ comp то вещественный тип, но включает в себя только целые числа.
Просьба большая (я сейчас и в правилах это напишу) - не редактировать выложенные задания и не удалять их после выполнения. Может пригодиться другим, понимаешь? Например, первая программа... Лучше оффтопом жирно написать "Программа написана. Помощь по первому заданию не требуется"
Я сейчас таки со скрипом и лязгом вроде что-то вырисовывается по поводу третьей программы (на вас бяк даже надеяться не стоит =) ) решение потом выложить?
Я думаю, восстановить. И решение, если можешь, выложи, пожалуйста. Спасибо заранее большое.
Бяка я , бяка, честно признаюсь, полный ноль в программировании. Каждому - свое))
Повторюсь Паломник Оптимизма, не хочешь занятся программированием контроллеров на ассемблере и Си?
интересная вещь.
Выложи листинг программы которая не получается и номер ошибки компилятора. помогу чем смогу.
по третей задаче я сегодня полистаю букварь, с файлами практически никогда не работал
readln (b);
--------------------------------------
seek (mainfile, b); Это что, так и в программе написано?
Вот смотри:
seek (mainfile, b); ты поставил маркер в положение b+1 (нумерация начинается с нуля)
read (mainfile, f); теперь он сместился на единицу
write (mainfile, v); теперь записываем значение но на 2 ячейки правее
или как-то учитывать это
просто отлаживай программы по-шагово, а не всю сразу
П.С.
Я у тебя про контроллеры спрашивал
ты я так понимаю программист?
А про контролеры. Я единственно, что знаю так это то, что асамблер - це язык программирования на который мой брат зело страшно ругается (не знаю правда почему), а про контролеры вообще ничего не знаю поэтому, что ответить.. =)
А на счет Си... Если посмотреть вправо то я увижу книжный шкаф в человеческий рост забитый книгами. Так вот тот уровень который как раз на уровне моей головы (в положении сидя) - полностью состоит из книг по Си++ и все возможных по ним вариаций. По прикидкам около полусотни штук =)
микроконтроллер -- это такой маханький компьютер, в спичечный коробок с десяток влезит.
Ассемблер ну да трудноват в понимании чуток. Но можно и на Си и даже без ++ обычный Си он как и Паскаль
и компилятор такой же турбоС
программировать контроллеры может и школьник. Лишбы голова на месте стояли, ну и чуток руки прямые.
Ладно будет интересно скажешь.