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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2013, 20:11   #1
ekb_lbp
 
Регистрация: 04.12.2012
Сообщений: 4
По умолчанию Одномерный массив, состоящий из n вещественных элементов

С одномерным массивом, состоящим из n вещественных элементов, произвести следующие операции:
1) вычислить произведение положительных элементов массива;
2) вычислить сумму элементов массива, расположенных до минимального элемента. При наличии нескольких минимальных элементов (равных друг другу) выбирается последний из них;
3) упорядочить по возрастанию отдельно элементы, стоящие на четных местах, и элементы, стоящие на нечетных местах.

Помогите пожалуйста написать программу?
для каждой операции (их 3) выполнить своей функцией
ekb_lbp вне форума Ответить с цитированием
Старый 11.07.2013, 20:32   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

наработки у вас есть?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 13.07.2013, 07:40   #3
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

На делфи тело функции было бы примерно такое:
Предположим что массив называется mass и имеет определение:
Код:
function first(n:integer):integer; //n - количество элементов массива 
var
i:integer; //для счетчика
begin
first:=0; //обнуляем результат переменной

for i:=0 to n do
 begin
  if mass[i]>0 then first:=first+mass[i]; //если элемент массива > 0 то прибавляем его к возвращаемому значению.
 end;
end;
Потому в нужном месте вызываешь просто first(n) она вернет сумму.

2)
Код:
function two(n:integer):integer; //n - количество элементов массива 
var
i:integer; //для счетчика
id:integer; //id минимального элемента
begin
two:=0;
id:=0;

//ищем минимальный элемент
for i:=0 to n do
 begin
  if mass[i]<mass[id] then id:=i; //если элемент массива меньше чем тот что находится  в mass[id] то присваиваем id значение i
 end;

// считаем сумму до минимального элемента

for i:=0 to id do
 begin
  two:=two+mass[i]; 
 end;
end;
3)

Код:
procedure three(n:integer); 
var
i:integer; //для счетчика
a:boolean; //требуется ли еще один прогон по циклу
begin

repeat
a:=true;
for i:=0 to n do
 begin
 
  if (i+2<n) then
  if (mass[i]>mass[i+2]) then begin 
                                     swap(mass[i],mass[i+2]); //меняем местами элементы массива
                                     a:=false;
                                      end



 end;
until a;

end;
В последнем используется сортировка пузырьком.

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

Вообще задачки школьного уровня.

PS. если помог - жми на весы слева.
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 09:11   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

glykaman, попытка, конечно, хорошая, НО!
недочётов и ошибок очень много!

начиная с того, что обрабатывается массив из N+1 элементов (везде у Вас от 0 до n, а должно быть или от 0 до n-1 или от 1 до n),
далее, зачем-то в first вы ищете сумму, хотя в задании нужно найти произведение.
далее, в задаче two вы включаете в сумму значение минимального элемента, хотя в условии задачи сказано найти сумму ДО минимального элемента.
ваше решение третьей задачи я умозрительно продебажить не смог, похоже, что последний элемент не будет никогда сортироваться.
далее, если массив из вещественных значений, то почему функции first и two возвращают ЦЕЛОЕ число.

Кроме того, меня всегда умиляло, когда одна переменная (в вашем случае это n) передаётся как параметер процедуры/функции, а сам массив обрабатывается глобально! Если уж Вы используйте параметры, так передавайте в качестве параметров и переменную-массив (это было бы логично). Допустим дано несколько (три) массивов и нужно выполнить вышеуказанные действия с каждым из них. Вы будете писать три разные функции first, two и три разные процедуры three ?!

Цитата:
Вообще задачки школьного уровня.
это да.

Цитата:
Мой сайт с видеоуроками по программированию
Ого. Так Вы ещё, оказывается, и других программировать учите?!


p.s. да, а кто Вам сказал, что автору топика нужно решение на Паскаль?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2013, 14:42   #5
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
Подмигивание

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
glykaman, попытка, конечно, хорошая, НО!
недочётов и ошибок очень много!

начиная с того, что обрабатывается массив из N+1 элементов (везде у Вас от 0 до n, а должно быть или от 0 до n-1 или от 1 до n),
далее, зачем-то в first вы ищете сумму, хотя в задании нужно найти произведение.
далее, в задаче two вы включаете в сумму значение минимального элемента, хотя в условии задачи сказано найти сумму ДО минимального элемента.
ваше решение третьей задачи я умозрительно продебажить не смог, похоже, что последний элемент не будет никогда сортироваться.
далее, если массив из вещественных значений, то почему функции first и two возвращают ЦЕЛОЕ число.

Кроме того, меня всегда умиляло, когда одна переменная (в вашем случае это n) передаётся как параметер процедуры/функции, а сам массив обрабатывается глобально! Если уж Вы используйте параметры, так передавайте в качестве параметров и переменную-массив (это было бы логично). Допустим дано несколько (три) массивов и нужно выполнить вышеуказанные действия с каждым из них. Вы будете писать три разные функции first, two и три разные процедуры three ?!


это да.


Ого. Так Вы ещё, оказывается, и других программировать учите?!


p.s. да, а кто Вам сказал, что автору топика нужно решение на Паскаль?
пффФ я всего лишь дал наводку а не готовое решение. Накидал примерный исходник за 5 мин. Ничего удивительного что столько ошибок ;-) А за исправления автор вам спасибки скажет )

А про язык автор ничего не сказал) Так что волен реализовывать как хочу)))) (Это правда Delphi был по задумке, хотя не уверен что swap есть и в паскале и в делфи.)
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/

Последний раз редактировалось -glykaman-; 13.07.2013 в 15:10.
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 17:35   #6
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Код:
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void rand_array(double* a, int an)
{
int i;
int rn;

rn = 0;

srand(time(0));

for(i=0;i<an;i++)
{
while (rn == 0)
{
rn = rand()%1000;
}
a[i] = 1.0 / rn;
rn = 0;
}

}

void print_array(double* a, int an)
{
int i;

for(i=0;i<an;i++)
cout << a[i] << " ";

cout << "\n";

}

void multiplicate(double* a, int an)
{
int i;
double p;

p = 1.0;

for(i=0;i<an;i++)
if(a[i]>0)
p*=a[i];

cout << "multiplicate: " << p <<"\n";

}

int double_compare(double a1, double a2)
{
int result = 0;
// st0 > sti c3:0 c2:0 c0:0
// st0 < sti c3:0 c2:0 c0:1
// st0 = sti c3:1 c2:0 CF:0

// ja  cf = 0 && zf = 0
// jnp pf = 0
// je zf = 1
// jc cf = 1

__asm {
fild a1
fild a2
fcomi st, st(1)
ffree st(0)
ffree st(1)

ja y2
je y3
jc y4
jmp ex

y2:  
mov result, 1
jmp ex

y3:  
mov result, 2
jmp ex

y4:  
mov result, 3

ex:

};

//cout << "double_compare(" << a1 << "," << a2 <<"): " << result << "\n";
// 1 : a1 > a2
// 2 : a1 < a2
// 3 : a1 = a2

return result;
}


int minimal_position(double* a, int an)
{
int i;
double p;
int pos;
int r; 

p = a[0];
pos = 0;

for(i=0;i<an;i++)
{
r = double_compare(p, a[i]);
if (r == 3) // p > a[i]
{
p = a[i];
pos = i;
}
else if (r == 2)
{
pos = i;
}
}

cout << "minimal_position: " << p << " " << pos << "\n";
return pos;
}

void sort(double* a, int an)
{
int i, j;
double tmp;
int r; 

for(i=0;i<an;i+=2)
{
for(j = i+2;j<an; j+=2)
{
r = double_compare(a[i], a[j]);
if (r == 3) 
{
tmp = a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}



for(i=1;i<an;i+=2)
{
for(j = i+2;j<an; j+=2)
{
r = double_compare(a[i], a[j]);
if (r == 3) 
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
}


int main(int argc, char* argv[])
{
int n;
double* m;

cin >> n;

m = new double[n];
rand_array(m,n);
print_array(m,n);
multiplicate(m,n);
minimal_position(m,n);
sort(m,n);
print_array(m,n);
delete [] m;
return 0;
}
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 13.07.2013, 19:04   #7
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Сергей, посмотрите эту тему http://www.programmersforum.ru/showthread.php?t=214540
Всё встанет на свои места.
Вадим Мошев вне форума Ответить с цитированием
Старый 13.07.2013, 19:50   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
хотя не уверен что swap есть и в паскале и в делфи
Он есть и там и там, НО Swap меняет местами старший и младший байты!! А не числа.

Цитата:
Сергей, посмотрите эту тему http://www.programmersforum.ru/showthread.php?t=214540
Всё встанет на свои места.
Упорно не хочет открывать..
Poma][a вне форума Ответить с цитированием
Старый 13.07.2013, 22:06   #9
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Он есть и там и там, НО Swap меняет местами старший и младший байты!! А не числа.
Оу точно, это у меня в моих юнитах прописаная процедура, видимо совсем давно ее писал и подумал что она системная. Сорри)

Можно просто приписать вот это
Код:
procedure Swap( var X, Y: Integer ); overload;
{$IFDEF F_P}
var Tmp: Integer;
begin
 Tmp := X;
 X := Y;
 Y := Tmp;
end;
{$ELSE DELPHI}
asm
 MOV  ECX, [EDX]
 XCHG ECX, [EAX]
 MOV  [EDX], ECX
end;
//[END Swap]
{$ENDIF F_P/DELPHI}
Простая процедурка, но частенько помогает мне.
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/
-glykaman- вне форума Ответить с цитированием
Старый 14.07.2013, 13:49   #10
ekb_lbp
 
Регистрация: 04.12.2012
Сообщений: 4
По умолчанию

На языке Си(и немного С++), забыл упомянуть, измените.
Я вот попробовал и написал первые две операции но не знаю правильно ли и не могу дописать третью операцию про сортировку.
Задание у меня такого, что нужно сделать проектом где три файла с кодами main, calc и test

my.h
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void input1 (int *n);
void create (int n, float *a);
void input2 (int n, float *a);
void output (int n, float *a);
float calc1 (int n, float *a);
float calc2 (int n, float *a);
//void test();  //еще не написал
main.cpp
Код:
#include "my.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

void main()
{
  clrscr();
  //test();
  float a[5];
  int n;
  char x;
  input1(&n);
  printf("Vvod s klaviaturi ili clu4ainie 4isla?\n (y/n)\n");
  x=getch();
  if (x=='y')
  {
    input2 (n,a);
    output (n,a);
  }
  if (x=='n')
  {
    create (n,a);
    output (n,a);
  }
  float pr=calc1 (n,a);
  printf ("Proizvedenie polohitel'nih elementov = %.3f\n", pr);
  float sum=calc2 (n,a);
  printf ("Summa do minimal'nogo elementa = %.3f\n", sum);
  /*
  for (int i=1; i<=n; i++)
  printf ("%0.3f\n", a[i]);
  */
     if (!getch())
	getch();
}

void input1 (int *n)  //вводим размер массива
{
  printf ("Vvedite razmer massiva= \n");
  int res=scanf("%i", n);
  if (res==0 || *n<1 || *n>5)
  {
    printf ("Ochibka vvoda \n");
    if (!getch())
       getch();
    fflush(stdin);
    exit(1);
    }
}

void create (int n, float *a)  //элементы с генератора случайных чисел
{
  for (int i=1; i<=n; i++)
     a[i]=random(30)-10;
}

void input2 (int n, float *a)  //ввод элементов с клавиатуры
{
  for (int i=1; i<=n; i++)
  {
     printf ("\n Vvedite %i element ", i);
     scanf ("%f", &a[i]);
  }
}

void output (int n, float *a)  //вывод массива
{
  printf ("Massiv: \n");
  for (int i=1; i<=n; i++)
     printf ("%.3f\n", a[i]);
}
calc.cpp
Код:
#include "my.h"

float calc1 (int n, float *a)
{
  float pr=0;
  for (int i=0; i<=n; i++)
     if (a[i] > 0)
	pr*=a[i];
  return pr;
}

float calc2 (int n, float *a)
{
  float sum=1, max=a[1], min=a[1];
  int nmax=0, nmin=0;
  for (int i=1; i<=n; i++)
  {
     if (a[i] > max)
     {
	nmax=i;
	max=a[i];
     }
     if (a[i] <= min)
     {
	nmin=i;
	min=a[i];
     }
  }
  printf ("max=%.3f\n min=%.3f\n", max, min);
  if (nmax > nmin)
     for (i=nmin+1; i<nmin; i++)
	sum+=a[i];
  if (nmax < nmin)
     for (i=nmax+1; i<nmax; i++)
	sum+=a[i];
  if (nmax == nmin+1 || nmin == nmax+1)
     sum=0;
  return sum;
}
/*
void calc3 (int n, float *a)
{
 
}
*/
ekb_lbp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(C#)Одномерный массив из n вещественных чисел DeadWind Помощь студентам 0 18.04.2013 21:32
Преобразовать одномерный массив, состоящий из 10 вещественных элементов.... serjj Общие вопросы C/C++ 9 31.01.2013 19:11
1)Дан одномерный массив В,состоящий из 2n элементов.Переставить его элементы по следующему правилу b[1],b[n+1],b[2],b[n+2],.....b[ Vinam* Паскаль, Turbo Pascal, PascalABC.NET 4 24.12.2011 16:39
Программа запрашивает имя файла и формирует массив, состоящий из сумм каждых трех вещественных компонент brother-bear Помощь студентам 0 26.04.2010 19:09
Ввести одномерный массив, состоящий из 10 элементов zergon Помощь студентам 3 24.12.2009 21:34