Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задачка на C++ на массивы 
:(
    Опции темы
CKEK
Дата 14.11.2014, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



В массиве A и B хранятся коэффициенты двух многочленов. Сформировать массив C, содержащий коэффициенты произведения данных многочленов.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<signal.h>
 
int input1 (int &k,int &l){
printf("Vvedite razmernost a: ");
scanf("%i \n",&k);
printf("Vvedite razmernost b: ");
scanf("%i \n",&l);
return 0;
}
 
int input2(double a[],double b[],int &k,int &l){
for (int i=0; i<k; i++){
     printf("Vvedite kooficient a: ");
     scanf("%lf \n", &a[i]);
}
 
for (int i=0; i<l; i++){
     printf("Vvedite kooficient b: ");
     scanf("%lf \n", &b[i]);
}
return 0;
}
 
int function(double a[], double b[], double result[], int& k, int& l, int& m){
    for (int k1=0; k1<=k; k1++){
        for (int k2=0; k2<=l; k2++){
            result[k1+k2]+=a[k1]*b[k2];
        }
    }
return 0;
 
}
 
int main () {
int k,l,m;
input1(k,l);
double *a = new double [k];
double *b = new double [l];
m=k+l;
double *result = new double [m];
input2(a,b,k,l);
function(a,b,result,k,l,m);
printf("%1.3lf \n",&result);
 
 
return 0;
}

Что тут не так?
PM MAIL   Вверх
baldina
Дата 14.11.2014, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



в scanf не нужны пробелы и новая строка
Цитата(CKEK @  14.11.2014,  15:13 Найти цитируемый пост)
scanf("%i \n",&k);

и т.п. заменить на 
Код

scanf("%i",&k);


Цитата(CKEK @  14.11.2014,  15:13 Найти цитируемый пост)
printf("%1.3lf \n",&result);

здесь нужно в цикле вывести значения массива
Код

for (int i=0; i < m; ++i)
  printf("%.3lf \n",result[i]);


и все заработает

а вообще на с++ (а не ацкой смеси с С) это могло бы выглядеть примерно так
Код

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>

typedef std::vector<double> dvector;
dvector getArray () {
    size_t n;
    std::cin >> n;
    dvector v(n);
    std::for_each (v.begin(), v.end(), [](double& x){
        std::cin >> x;
    });
    return v;
}

dvector operator*(const dvector& a, const dvector& b) {
  dvector result(a.size()+b.size());
  for (size_t i=0; i < a.size(); ++i){
    for (size_t j=0; j < b.size(); ++j){
     result[i+j] += a[i]*b[j];
    }
  }
  return result;
}

int main () {
    dvector a = getArray();
    dvector b = getArray();
    dvector result = a*b;
    std::ostream_iterator<double> out (std::cout, " ");
    std::copy (result.begin(), result.end(), out);
}


Добавлено через 2 минуты и 31 секунду
http://ideone.com/oANpLT

Это сообщение отредактировал(а) baldina - 14.11.2014, 17:12
PM MAIL   Вверх
CKEK
Дата 14.11.2014, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



Я попробовал, и вот что выдает:

\лабораторная 2.cpp(10) : error C2059: синтаксическая ошибка: [
\лабораторная 2.cpp(10) : error C2143: синтаксическая ошибка: отсутствие ")" перед "{"
\лабораторная 2.cpp(10) : error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
\лабораторная 2.cpp(11) : error C2065: x: необъявленный идентификатор
\лабораторная 2.cpp(12) : error C2059: синтаксическая ошибка: )

Добавлено через 1 минуту и 44 секунды
А вообще огромное спасибо за помощь, сам бы не разобрался никогда!! Низкий поклон!!
PM MAIL   Вверх
CKEK
Дата 15.11.2014, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



baldina, подскажите, пожалуйста, как эти ошибки исправить?
PM MAIL   Вверх
baldina
Дата 15.11.2014, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



видимо вы используете довольно старый компилятор.
для начала попробуйте исправить свою программу, она в принципе правильная.
а мою вам придется объяснять преподавателю, вы сможете это сделать?

Добавлено @ 23:09
Цитата(baldina @  14.11.2014,  17:11 Найти цитируемый пост)
std::for_each (v.begin(), v.end(), [](double& x){
        std::cin >> x;
    });

можно заменить на
Код

for (size_t i=0; i  != v.size(); ++i)
  std::cin >> v[i];


Это сообщение отредактировал(а) baldina - 15.11.2014, 23:09
PM MAIL   Вверх
CKEK
Дата 16.11.2014, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



baldina, я бы с удовольствием получил бы пару-тройку индивидуальных занятий, чтобы мне помогли с лабами, объяснили, на чем программирование на С++ основано, вы, случайно, не занимаетесь преподаванием? И если да, какие ваши условия?
PM MAIL   Вверх
CKEK
Дата 16.11.2014, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



baldina, при замене еще больше ошибок выдает.. А использую я Visual C++2008 express edition
PM MAIL   Вверх
baldina
Дата 16.11.2014, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



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

определитесь с целями, если спихнуть - возьмите это (в vc++2008 должно работать), если понять - надо изучать с самого начала, или задать конкретные вопросы о том, что непонятно.
PM MAIL   Вверх
baldina
Дата 16.11.2014, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



= удалено =

Это сообщение отредактировал(а) baldina - 16.11.2014, 16:52
PM MAIL   Вверх
CKEK
Дата 16.11.2014, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



baldina, Я в принципе ошибки исправил, осталось только объявить идентификатор "x". Как это сделать?
Спасибо
PM MAIL   Вверх
baldina
Дата 17.11.2014, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата(CKEK @  16.11.2014,  18:32 Найти цитируемый пост)
осталось только объявить идентификатор "x"

профессор у доски: "возьмем произвольное число n. нет, n мало... возьмем m!"
а что это за идентификатор? вообще идентификаторы объявляются так:
Код

type name;

здесь type имя типа, name - идентификатор.
например, 
Код

int x;


Добавлено @ 10:36
CKEK, я подозреваю, что вы боретесь с лямбда-функцией 
Код

[](double& x){
        std::cin >> x;
}

если лямбды у вас не поддерживаются, то и x вам не нужен, в обычном цикле по i у вас будет v[i] вместо x.
Код

for (size_t i=0; i  != v.size(); ++i)
  std::cin >> v[i];

мы же это уже обсуждали, и работающий пример я вам дал

Это сообщение отредактировал(а) baldina - 17.11.2014, 10:36
PM MAIL   Вверх
CKEK
Дата 17.11.2014, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



baldina
Я работаю с вашим кодом, в котором выдавались ошибки. После корректировки он выглядит так:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
typedef std::vector<double> dvector;
dvector getArray () {
    size_t n;
    std::cin >> n;
    dvector v(n);
    std::for_each (v.begin(), v.end(), (double&) x);{
        std::cin >> x;
    };
    return v;
}
dvector operator*(const dvector& a, const dvector& b) {
  dvector result(a.size()+b.size());
  for (size_t i=0; i < a.size(); ++i){
    for (size_t j=0; j < b.size(); ++j){
     result[i+j] += a[i]*b[j];
    }
  }
  return result;
}
int main () {
    dvector a = getArray();
    dvector b = getArray();
    dvector result = a*b;
    std::ostream_iterator<double> out (std::cout, " ");
    std::copy (result.begin(), result.end(), out);
}

И теперь у меня такие ошибки:

laba 2.cpp(10) : error C2065: x: необъявленный идентификатор
laba 2.cpp(11) : error C2065: x: необъявленный идентификатор
Если я его объявляю как (int x), то ошибка выглядит так :

1>c:\program files (x86)\visual c++2008\vc\include\algorithm(29) : error C2064: результатом вычисления фрагмента не является функция, принимающая 1 аргументов
1> laba 2.cpp(10): см. ссылку на создание экземпляров функции шаблон при компиляции "_Fn1 std::for_each<std::_Vector_iterator<_Ty,_Alloc>,double>(_InIt,_InIt,_Fn1)"
1>        with
1>        [
1>            _Fn1=double,
1>            _Ty=double,
1>            _Alloc=std::allocator<double>,
1>            _InIt=std::_Vector_iterator<double,std::allocator<double>>
1>        ]

PM MAIL   Вверх
baldina
Дата 17.11.2014, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



удобно это делать здесь
ваша конструкция 
Код

std::for_each (v.begin(), v.end(), (double&) x);{
        std::cin >> x;
    };

разделена точкой с запятой, так что это два последовательных блока кода
в первом
Код

std::for_each (v.begin(), v.end(), (double&) x);

упоминается x, которая ранее не объявлена.
вообще, std::for_each(), работает с диапазоном последовательности, задаваемым итераторами, применяя к каждому элементу функцию, указанную в третьем аргументе. в моем примере это была анонимная функция. а в вашем варианте этот кусок становится бессмысленным.
я вам уже предлагал (неоднократно!) заменить его на обычный цикл
Код

for (size_t i=0; i  != v.size(); ++i)
  std::cin >> v[i];

получается вот что

Это сообщение отредактировал(а) baldina - 17.11.2014, 17:09
PM MAIL   Вверх
CKEK
Дата 17.11.2014, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.11.2014

Репутация: нет
Всего: нет



baldina

При замене на цикл выдает следующее: 

laba 2.cpp(13) : error C2059: синтаксическая ошибка: return
PM MAIL   Вверх
baldina
Дата 17.11.2014, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



CKEK, смеетесь?
я же вам показал работающий код. на ideone и компилируется, и исполняется. вы вообще туда заходили? потрудитесь посмотреть и хотя бы точно скопировать.

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

Добавлено через 4 минуты и 21 секунду
вот ваш код с оформлением кнопочкой код
Код

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
typedef std::vector<double> dvector;
dvector getArray () {
    size_t n;
    std::cin >> n;
    dvector v(n);
    std::for_each (v.begin(), v.end(), (double&) x);{
        std::cin >> x;
    };
    return v;
}
dvector operator*(const dvector& a, const dvector& b) {
  dvector result(a.size()+b.size());
  for (size_t i=0; i < a.size(); ++i){
    for (size_t j=0; j < b.size(); ++j){
     result[i+j] += a[i]*b[j];
    }
  }
  return result;
}
int main () {
    dvector a = getArray();
    dvector b = getArray();
    dvector result = a*b;
    std::ostream_iterator<double> out (std::cout, " ");
    std::copy (result.begin(), result.end(), out);
}

вот что у вас должно было получиться после правки
Код

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
typedef std::vector<double> dvector;
dvector getArray () {
    size_t n;
    std::cin >> n;
    dvector v(n);
   for (size_t i = 0; i != v.size(); ++i) {
        std::cin >> v[i];
    }
    return v;
}
dvector operator*(const dvector& a, const dvector& b) {
  dvector result(a.size()+b.size());
  for (size_t i=0; i < a.size(); ++i){
    for (size_t j=0; j < b.size(); ++j){
     result[i+j] += a[i]*b[j];
    }
  }
  return result;
}
int main () {
    dvector a = getArray();
    dvector b = getArray();
    dvector result = a*b;
    std::ostream_iterator<double> out (std::cout, " ");
    std::copy (result.begin(), result.end(), out);
}


здесь (нажмите, это ссылка!!) этот код успешно компилируется, запускается и выдает правильный результат
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1361 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.