Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите, пожалуйста, с задачей на массивы (http://www.tehnari.ru/f41/t59102/)

zaaag 29.10.2011 17:26

Помогите, пожалуйста, с задачей на массивы
 
Сдвинуть элементы массива по кругу на два элемента против часовой стрелки. ()

Вот начал а дальше не знаю как((

program vlevo;
var i,n,s: integer;
a:array[1..100] of integer;
begin
write('n=');
read(n);
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;

Vladimir_S 29.10.2011 17:43

Цитата:

Сообщение от zaaag (Сообщение 608742)
Вот начал а дальше не знаю как((

Да, начало, конечно, мощное. Ну ладно, держите продолжение с окончанием:
Код:

Uses CRT;
var
 i,n,s,b1,b2: integer;
 a:array[1..100] of integer;
begin
 clrscr;
 write('n= ');
 readln(n);
 for i:=1 to n do
 begin
  write('a[',i,']= ');
  readln(a[i]);
 end;
 clrscr;
 writeln('Initial array:');
 for i:=1 to n do write(a[i]:4);
 writeln;
 b1:=a[1];
 b2:=a[2];
 for i:=3 to n do a[i-2]:=a[i];
 a[n-1]:=b1;
 a[n]:=b2;
 writeln('Shifted array:');
 for i:=1 to n do write(a[i]:4);
 readln
end.


zaaag 02.11.2011 23:01

спасибо большое!) а можете проверить ещё одну задачу, правильно ли?

Вычислить среднее арифметическое введенных чисел, количество введенных чисел и количество введенных нулей. При вводе числа 777 закончить работу.

program qw;
var
tmp, zero, total, sum: integer;
sred: real;
begin
zero := 0;
total := 0;
sum := 0;
repeat
read(tmp);
if tmp <> 777 then
begin
inc(total);
sum := sum + tmp;
if tmp = 0 then
inc(zero);
end;
until tmp = 777;
sred := sum / total;
write('Всего чисел: ', total, ' Из них нулей - ', zero, ' Среднее арифметическое = ', sred);
end.

Vladimir_S 03.11.2011 10:33

Цитата:

Сообщение от zaaag (Сообщение 611010)
а можете проверить ещё одну задачу, правильно ли?

В целом - да, всё правильно. Но есть несколько, скажем так, небольших шероховатостей непринципиального характера.
1. Для переменной sum лучше выбрать формат LongInt - мало ли, какие числа вводятся и сколько, может получиться так, что сумма выскочит за границы формата Integer (32000 с копейками).
2. Ввод чисел желательно оформить с экранной подсказкой - пустой экран с моргающим маркером плохо смотрится.
3. Есть некая тонкость с оператором ввода. Лучше использовать не read, а readln. Не буду вдаваться в подробности, но read - "плохой" оператор, он как бы не закрывает ввод, а оставляет систему в ожидании следующего ввода, что приводит, в частности, к несрабатыванию остановок, см. п.4.
4. В конце программы желательно поставить команду readln без параметров. Дойдя до нее, программа остановится и покажет выведенный на экран результат расчета. Но это произойдет только, если в программе для ввода используются операторы readln, а не read.
5. Для среднего лучше (просто красивее) использовать форматный вывод. Например, формат 0:3 означает, что число будет выведено с тремя знаками после десятичной точки.
С учетом поправок:
Код:

program qw;
var
 tmp, zero, total: integer;
 sred: real;
 sum:longint;
begin
 zero:=0;
 total:=0;
 sum:=0;
 repeat
  write('Введите число: ');
  readln(tmp);
  if tmp<>777 then
  begin
    inc(total);
    sum:=sum+tmp;
    if tmp=0 then inc(zero);
  end;
 until tmp=777;
 sred:=sum/total;
 writeln('Всего чисел: ', total, ' Из них нулей - ', zero, ' Среднее арифметическое = ', sred:0:3);
 readln
end.

Но, повторяю, все эти поправки - в основном "косметического" характера. Принципиально же программа составлена правильно.

zaaag 09.11.2011 19:38

помогите пожалуйста вот с этой задачей((

Заданы М строк символов, которые вводятся с клавиатуры. Каждая заданная строка представляет собой текст. Исключить из этих текстов все гласные буквы.

zaaag 10.11.2011 23:43

Заданы М строк символов, которые вводятся с клавиатуры. Каждая заданная строка представляет собой текст. Исключить из этих текстов все гласные буквы.

правильно??

Program z1; uses crt;
const glas = ['а','е','и','о','у','э','ю','я','А','Е','И','О','У ','Э','Ю','Я'];
var s:string;
i,j:integer;
c:char;
a:array[1..100] of string;
begin
clrscr;
i:=0;
Writeln('Будете вводить данные');
readln(c);
While ( c in ['Y','y','Д','д']) or (i=100) do
begin
inc(i);
Writeln('Введите ',i,' ю строку');
readln(s);
for j:=1 to length(s) do
begin
if not(s[j] in glas) then a[i]:=a[i]+s[j]
end;
Writeln('Вводить еще информацию? ');
readln(c);
end;
for j:=1 to i do
if a[j]<>'' then Writeln(a[j]);
readln
end.

Vladimir_S 11.11.2011 10:43

Цитата:

Сообщение от zaaag (Сообщение 615675)
правильно??

Не совсем.
1. В перечне множества Glas Вы поставили пробел после буквы "У" - абсолютно недопустимо и приводит к ошибке!
2. Неверно сформулированы условия цикла While...do.
3. В предпоследней строке условный оператор if a[j]<>'' then - лишний.
Вот подредактированный вариант:

Код:

uses crt;
const
 glas=['а','е','и','о','у','э','ю','я','А','Е','И','О','У','Э','Ю','Я'];
var
 s:string;
 i,j:integer;
 c:char;
 a:array[1..100] of string;
begin
 clrscr;
 i:=0;
 Writeln('Будете вводить данные (Y/N), (Д/Н)?');
 readln(c);
 While (c in ['Y','y','Д','д']) and (i<=100) do
  begin
  inc(i);
  Writeln('Введите ',i,'-ю строку');
  readln(s);
  for j:=1 to length(s) do
    if not(s[j] in glas) then a[i]:=a[i]+s[j];
  Writeln('Вводить еще информацию (Y/N), (Д/Н)?');
  readln(c);
  end;
 Writeln;
 for j:=1 to i do Writeln(a[j]);
 readln
end.



Часовой пояс GMT +4, время: 07:40.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.