Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

Ответить
Настройки темы
C/C++ - [решено] реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160


Конфигурация

Профиль | Отправить PM | Цитировать


Всем привет, есть задание реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

У меня есть решение, объясните пожалуйста часть кода.

Код: Выделить весь код
int a[3];
int b[3];

int my_c(int x)
{
int pos,i;
pos=0;
int sum=0;
for(i=0;i<3;i++)
{
     pos=i;
     {
       sum= sum+(a[pos]+ b[i]);
       pos++;
     }
}
sum=(abs(sum));
sum=(sum*x);
int pow=0;
     pow=x*x;

     sum= sum+pow;
return sum;
}

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 19:49, 09-05-2011

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Gooch, у тебя код и реализует формулу. Прям линейно по действиям. Сначала находит сумму, затем ее умножает на x, затем x квадрат заменяется через обычное умножение и плюсуется к текущей сумме.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 23:10, 09-05-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


до меня не доходит заполнение массива

int pos,i; \\ ввели целочисленные переменные
pos=0; \\ сказали что pos будет 0
int sum=0; \\ почему так? я так понимаю выше мы тоже самое могли сделать? типа int i; int pos=0; или всё таки есть разница?

ну вот че то понять не могу заполнение массива:

for(i=0;i<3;i++) \\ заполняем массив 3 числами, что означает i++? ну и дальше вообще не доходит
{
pos=i;
{
sum= sum+(a[pos]+ b[i]);
pos++;
}
}

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 15:55, 10-05-2011 | #3


Аватара для Hector

Misanthrope


Сообщения: 474
Благодарности: 38

Профиль | Отправить PM | Цитировать


Цитата Gooch:
int sum=0; \\ почему так? я так понимаю выше мы тоже самое могли сделать? типа int i; int pos=0; или всё таки есть разница? »
так решил автор спроси, где брал исходник почему разницы нет
Цитата Gooch:
что означает i++? »
увеличение переменной i на 1, т. е. i+1

-------
Information must be free!
Нет границ, есть только препятствия


Отправлено: 16:17, 10-05-2011 | #4


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Цитата Hector:
увеличение переменной i на 1, т. е. i+1 »
то есть он будет прибавлять 1 пока i не станет равна 3?

а что насчет дальше? зачем pos прировняли к i? (a[pos]+ b[i]) что означает данное вырожение?

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 16:23, 10-05-2011 | #5


Аватара для Hector

Misanthrope


Сообщения: 474
Благодарности: 38

Профиль | Отправить PM | Цитировать


в данном случае, оно будет прибавлять пока i будет строго меньше 3
Цитата Gooch:
что насчет дальше? зачем pos прировняли к i? (a[pos]+ b[i]) что означает данное вырожение? »
откровенно говоря, здесь мне логика не понятна, думаю можно было бы обойтись так
Код: Выделить весь код
for(i=0;i<3;i++)
       sum= sum+(a[pos]+ b[i]);
потому что в теле цикла pos=i, а зачем его увеличивать в конце, если потом все равно pos получает значение i непонятною
здесь реализуется вычисление S(Ai + Bi)

-------
Information must be free!
Нет границ, есть только препятствия


Отправлено: 16:28, 10-05-2011 | #6


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Цитата Hector:
потому что в теле цикла pos=i, а зачем его увеличивать в конце, если потом все равно pos получает значение i непонятною »
то есть pos=i оставляем,а pos++ убираем?

Цитата Hector:
здесь реализуется вычисление S(Ai + Bi) »
щас мозг взорвется...я хочу понять принцип работы этой формулы. Дальше есть следующий код:

Код: Выделить весь код
int my_assembler(int x)
{
          int sum=0;

          __asm
          {
           MOV esi,0
           MOV ecx,0

          //вычисление суммы массивов
           cycle_i:

           MOV eax,a[esi]
           MOV edx,b[esi]
           ADD esi,4

          //сумма массивов
           ADD sum, eax
           ADD sum, edx
           INC ecx //увеличивает
           CMP ecx, 3 //сравнивает
           JB cycle_i //для беззнаковых чисел
           
          //модуль
           abso: neg sum
           JS abso //переход, если установлен бит знака
          //умножаем sum на x
           MOV eax,sum
           MOV ecx,x
           IMUL ecx
           MOV sum,eax
                     
          //вычисляем квадрат x
           MOV eax,x
           MOV ecx,x
           IMUL ecx

          //складываем с суммой квадрат x
           ADD sum,eax
}

return sum;
}
void main()
{
     int  i;
     system("title Вычисление значения выражения");
         for(int i=0; i<3; i++)
     { 
          printf("Vvedite element A: ");
          scanf("%d",&a[i]);
     }
     for(int i=0; i<3; i++)
     {
          printf("Vvedite element B: ");
          scanf("%d",&b[i]);
     }
     int x=0;
          printf("Vvedite chislo X: ");
          scanf("%d",&x);
          
          //printf("C++=%i\n",my_c(x));
          printf("Otvet=%i\n",my_assembler(x));
system("pause");
}
задание впринципе решить формулу ассемблерной вставкой, но как я щас понял в этом примере всё решено на С? или что делает код на С? не понимаю

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 17:02, 10-05-2011 | #7


Старожил


Сообщения: 154
Благодарности: 39

Профиль | Отправить PM | Цитировать


Цитата Gooch:
__asm
{
MOV esi,0
MOV ecx,0
//вычисление суммы массивов
cycle_i:
MOV eax,a[esi]
MOV edx,b[esi]
ADD esi,4
//сумма массивов
ADD sum, eax
ADD sum, edx
INC ecx //увеличивает
CMP ecx, 3 //сравнивает
JB cycle_i //для беззнаковых чисел
//модуль
abso: neg sum
JS abso //переход, если установлен бит знака
//умножаем sum на x
MOV eax,sum
MOV ecx,x
IMUL ecx
MOV sum,eax
//вычисляем квадрат x
MOV eax,x
MOV ecx,x
IMUL ecx
//складываем с суммой квадрат x
ADD sum,eax
} »
вот это называется ассемблеровской вставкой. она так называется потому что язык программы си, но автор решил что часть кода будет написана на другом допустимом языке - "asm"-е, т.е. ассемблере, о чем явно указывает первая строчка кода в цитате. Компилятор си это допускает.
начнем с того что если ты не знаешь ассемблера смысла объяснять каждую строчку особого нет, описание команд ты можешь посмотреть и в инете, тут никакого секрета нет, коментари в коде подробные.
а вот все что не попало в цитату - это уже чистый си. почему это возможно? все очень просто.
любой компьютер ни коем образом не знает что такое си, бэйсики, и даже ассемблер. он знает только машинный код (готовый exe если понятнее). для того чтобы из языка программирования сделать машинный код (компилировать программу) придумали специальные программы - компиляторы. Они то как раз и знают как из строчек кода на языке сделать машинный код. Естественно компилятор понимает только свой конкретный язык программирования, но ассемблер (любой) настолько приближен к машинному коду что все компиляторы тем или иным образом его знают и могут компилировать вместе со своим родным языком.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:12, 10-05-2011 | #8


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


вообщем си меня не интересует, что такое компилятор и что такое вставка асемблереная я вкурсе. моя задача решить задание по предмету ассемблер при помощи языка высшего уровня. данная задача это пример решения моего личного задания. хочу понять её решение для того чтоб написать решение своей. в коде сверху, как я уже разобрался, первое решение на языке С, второе на Ассемблере. На данный момент читаю как организовывать массивы в асм.

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 19:24, 10-05-2011 | #9


Старожил


Сообщения: 154
Благодарности: 39

Профиль | Отправить PM | Цитировать


в данной примере массив не организован на ассемблере, я правда в теле мейна не вижу объявления этих массивов но оно там быть должно.
работа с массивом такова что а и b это начальные адреса (ты это знаешь), и они смещаются на регистр esi как и в си - a[esi] и в цикле этот регистр увеличивается на 4 потому что int обычно занимает 4 байта (но ты же это знаешь).
цикл организован ссылкой которая в ассемблере пишется так - some_name: . Цикл первый до тех пор пока ecx не станет больше (JB) 3 , в теле цикла каждый раз идет INC ecx. Вот и вся работа с массивами, которой собственно и нет.

а вообще в ассемблере массив выделяется так (как пример) - mas db 10 dup (?), где mas - имя массива, db - размер элемента массива, 10 - количество элементов, 0 - чем заполнить.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:02, 10-05-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] кто поможет реализовать такое? Cherterok Вебмастеру 3 02-03-2011 10:36
[решено] Как реализовать в скрипте возможность автозаполнения evg64 AutoIt 5 03-10-2009 20:07
[решено] Как реализовать. VistaMizer интегрированная в дистрибутив K.A.V. Автоматическая установка Windows 2000/XP/2003 5 30-09-2009 00:15
[решено] P5K/EPU + RAID как реализовать? svchost Материнские платы и память 4 20-10-2008 16:35
вычисление даты lastdruid Общий по Linux 1 03-03-2007 16:14




 
Переход