Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
kristina-lonsh
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 61
#1

Функция (параметр - одномерный массив). Вычислить разность между количеством отрицательных и положительных элементов - C++

27.01.2013, 10:54. Просмотров 1852. Ответов 11
Метки нет (Все метки)

Помогите, пожалуйста, с задачей. Сложность - работа с указателями..

Задача: Вычислить разность между количеством отрицательных и количеством положительных элементов массива. Использовать функцию для каждой строки матрицы Р (4, 14).
Примечание:
[создать функцию, параметром которой является одномерный массив и его размерность. Тело функции реализовать двумя способами: через обращение к элементам массива через указатели и обычным способом. Продемонстрировать возможность применения созданной функции к строкам двумерного массива. Элементы матрицы задать случайным образом, не забыв вывести их на экран.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2013, 10:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция (параметр - одномерный массив). Вычислить разность между количеством отрицательных и положительных элементов (C++):

Вычислить разность между количеством отрицательных и количеством положительных элементов одномерного массива - C++
Здравствуйте уважаемые форумчане. Возникли трудности при решении задачи. :wall: Буду очень признателен тем, кто поможет и не останется...

Найти разницу между количеством положительных и отрицательных элементов - C++
Помогите решить пожалуйста, на языке Си 15. Дан массив размера N. Найти разницу между количеством положительных и отрицательных...

Найти разность между произведением всех положительных элементов массива и суммой модулей всех отрицательных - C++
В массиве из 9 действительных чисел определить разность между произведением всех положительных элементов и суммой модулей всех...

Одномерный массив, подсчитать число положительных, отрицательных и нулевых элементов - C++
В одномерном массиве z1,z2,...,zn подсчитать число положительных, отрицательных и нулевых элементом .

Массив (одномерный и двумерный, поиск локальных максимумов и кол-ва положительных и отрицательных элементов) - C++
Две задачи, которые нужно реализовать на c++ в борланде. Вот первая (по одномерному массиву): В массиве А(n) найти и напечатать номера...

Одномерный массив - вычислить сумму отрицательных элементов массива - C++
В одномерном массиве из N вещественных элементов, вычислить: • сумму отрицательных элементов массива; • произведение элементов...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
27.01.2013, 22:09 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <iomanip> //setw
#include <cstdlib> // rand
#include <ctime> // time
using namespace std;
 
int sumPos(int a[], int size);
int sumNeg(int *a, int size);
int main() {
    const int N = 4;
    const int M = 14;
    int matr[N][M];
    srand(time(NULL));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            matr[i][j] = rand() % 100 - 50;
            cout << setw(5) << matr[i][j];
        }
        cout << endl;
    }
    int sumOfPos = 0;
    int sumOfNeg = 0;
    for (int i = 0; i < N; ++i) {
        sumOfPos += sumPos(&matr[i][0], M);
        sumOfNeg += sumNeg(&matr[i][0], M);
    }
    cout << "\nSumma polojitelnyx=" << sumOfPos;
    cout << "\nSumma otrizatelnyx=" << sumOfNeg;
    return 0;
}
 
int sumPos(int a[], int size) {
    int tmpSum = 0;
    for (int i = 0; i < size; ++i)
        if (a[i] > 0)
            tmpSum += a[i];
    return tmpSum;
}
 
int sumNeg(int *a, int size) {
    int tmpSum = 0;
    for (int i = 0; i < size; ++i)
        if (*(a + i) < 0)
            tmpSum += *(a + i);
    return tmpSum;
}
kristina-lonsh
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 61
28.01.2013, 13:08  [ТС] #3
Спасибо! Доработала как требует условие задачи. Только высчитывает на двумерном массиве неправильно.. Не пойму в чем причина.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<iostream>
#include<math.h>
#include<time.h>
#include<iomanip>
using namespace std;
 
int otr_pol(int *ar, int size)   // обычным способом
    {
     int pol1=0,otric1=0;
     for(int i=0;i<size;i++)
         {
         if (*(ar+i)>0) pol1++;
         if (*(ar+i)<0) otric1++;
         
         }
     cout<<endl<<"Otritcatelnyh elementov: "<<otric1<<endl;
     cout<<"Polozhitelnyh elementov: "<<pol1<<endl;  
     int raznost=otric1-pol1;    
     }
     
int otr__pol(int ar[], int size)    // через указатели
    {
     int pol2=0,otric2=0;
     for(int i=0;i<size;i++)
         {
         if (ar[i]>0) pol2++;
         if (ar[i]<0) otric2++;
         
         }
     cout<<endl<<"Otritcatelnyh elementov: "<<otric2<<endl;
     cout<<"Polozhitelnkh elementov: "<<pol2<<endl;  
     int raznost=otric2-pol2;    
     }
     
int main()
{
srand((unsigned)time(NULL));
int N=10;
int array[N];
cout<<"***** ODNOMERNYI MASSIV *****"<<endl;
for (int i=0; i<N; i++)
    {
     array[i]=(rand()%100-30);  
     cout<<array[i]<<"  ";  
    }
cout<<"Raznost mezhdu kol-vom otritcat. i polozhit. el-tov massiva (OBYCHNYM SPOSOBOM) "<<otr_pol(array, N)<<endl;
cout<<"Raznost mezhdu kol-vom otritcat. i polozhit. el-tov massiva (CHEREZ UKAZATELI) "<<otr__pol(array, N)<<endl;
cout<<endl<<"***************************************************************************"<<endl<<endl<<endl;
 
 
cout<<"***** DVUMERNYI MASSIV *****"<<endl;
int M=4;
N=14;
int array2[M][N];
for (int i=0;i<M;i++)
    {for (int j=0;j<N;j++)
         {array2[i][j]=(rand()%100-30);
         cout << setw(5) << array2[i][j];
         }
    cout<<endl; 
    }
 
for (int i=0;i<M;i++)
    {cout<<i<<"-ia stroka:"<<endl;
    cout<<"Raznost mezhdu kol-vom otritcat. i polozhit. el-tov massiva (OBYCHNYM SPOSOBOM) "<<otr_pol(&array[i], N)<<endl;
    cout<<endl;
    }
system("PAUSE");
}
Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
28.01.2013, 14:32 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
const int M=4;
void f(int (*a1)[M],int size);
 
 
int main()
{
int a[M][M]={{0,1,2,3},{4,-5,-6,7},{8,9,10,11},{12,13,14,15}};
f(a,4);
std::cin.get();
std::cin.get();
 
    return 0;
}
void f(int ((*a1)[M]),int size)
{int min=0; int plus=0; int sum=0;
for(int i=0;i<size;i++){
for(int j=0;j<M;j++){
if(*(*(a1+i)+j)<0)
min++;
if(*(*(a1+i)+j)>0)
plus++;}
sum=-min+plus;
std::cout<<sum<<'\n';
min=0; plus=0;sum=0;
}}
kristina-lonsh
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 61
28.01.2013, 14:42  [ТС] #5
Цитата Сообщение от Valli1 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
const int M=4;
void f(int (*a1)[M],int size);
 
 
int main()
{
int a[M][M]={{0,1,2,3},{4,-5,-6,7},{8,9,10,11},{12,13,14,15}};
f(a,4);
std::cin.get();
std::cin.get();
 
    return 0;
}
void f(int ((*a1)[M]),int size)
{int min=0; int plus=0; int sum=0;
for(int i=0;i<size;i++){
for(int j=0;j<M;j++){
if(*(*(a1+i)+j)<0)
min++;
if(*(*(a1+i)+j)>0)
plus++;}
sum=-min+plus;
std::cout<<sum<<'\n';
min=0; plus=0;sum=0;
}}
Большое спасибо, но я хотела бы всё-таки найти ошибку в моей программе.
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
28.01.2013, 17:43 #6
Смотрите, с точки зрения Си - двумерный массив можно рассматривать как одномерный, тогда
работать с ним нужно подобно следующему коду
C++
1
int *pArray=&matriza[0][0]
и цикл перебирать от 0 до N*M, при этом доступ к элементу pArray[i] или *(pArray+i);
Можно и традиционно, через вложенные циклы, при этом, доступ к элементу массива, будет
pArray[i*число_элементов с троке+j], если i-счетчик строк, j-счетчик столбцов

Добавлено через 5 минут
Что вы этим
C++
1
int raznost=otric1-pol1;
хотели сделать в конце кода?
1. Если вы хотели считать отрицательнеые и положительные в теле функции и из нее делать печать, то
C++
1
cout<<"Raznost mezhdu kol-vom otritcat. i polozhit. el-tov massiva (OBYCHNYM SPOSOBOM) "<<otr_pol(array, N)<<endl;
бессмысленно, так ак ваша функция не возвращает результата, по крайней мере того, на который вы рассчитвываете, поэтому вмето
C++
1
int raznost=otric2-pol2;
нужно вставить
C++
1
return=abs(otric2-pol2);
Добавлено через 1 минуту
2. В комментариях вы попутали способы доступа к элементу массива, там с точностью до наоборот.

Добавлено через 4 минуты
3. Зачем вы два раза генерируете массив, достаточного одного раза.
kristina-lonsh
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 61
28.01.2013, 17:48  [ТС] #7
Цитата Сообщение от vua72 Посмотреть сообщение

Что вы этим
C++
1
int raznost=otric1-pol1;
хотели сделать в конце кода?
ну по условию задачи, я так полагаю, необходимо посчитать количество отрицательных элементов, количество положительных элементов и найти их разность.. Дурацкая задача, но что поделать. А насчет перепутала с точностью да наоборот - это как? одномерный массив просчитывает без проблем, а с двумерным не смогли бы прописать прямооо... Я просто зациклилась в каком то русле и не пойму, где ошибка происходит....

Добавлено через 3 минуты
Цитата Сообщение от vua72 Посмотреть сообщение

3. Зачем вы два раза генерируете массив, достаточного одного раза.
ну там нужен двумерный массив, дабы продемонстрировать правильность работы на его строках
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
28.01.2013, 18:12 #8
Смотрите, я переделал свой пример, а вы по аналогии переделайте свою функцию

Добавлено через 16 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <iomanip> //setw
#include <cstdlib> // rand
#include <ctime> // time
using namespace std;
 
int kolPos(int a[], int size);
int kolNeg(int *a, int size);
int main() {
    const int N = 4;
    const int M = 14;
    int matr[N][M];
    srand(time(NULL));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            matr[i][j] = rand() % 100 - 50;
            cout << setw(5) << matr[i][j];
        }
        cout << endl;
    }
    // рассчет по строкам
    int raznost=0;
    for (int i = 0; i < N; ++i) {
        raznost +=kolPos(&matr[i][0], M)-kolNeg(&matr[i][0], M);
    }
    cout << "\nRaznost = " << abs(raznost);
    // для вмей матрицы
    cout << "\nRaznost = " << abs(kolPos(&matr[0][0], N*M)-kolNeg(&matr[0][0], N*M));
    return 0;
}
 
int kolPos(int a[], int size) {
    int tmpSum = 0;
    for (int i = 0; i < size; ++i)
        if (a[i] > 0)
            tmpSum ++;
    return tmpSum;
}
 
int kolNeg(int *a, int size) {
    int tmpSum = 0;
    for (int i = 0; i < size; ++i)
        if (*(a + i) < 0) // указатели
            tmpSum ++;
    return tmpSum;
}
Добавлено через 4 минуты
Цитата Сообщение от kristina-lonsh Посмотреть сообщение
ну по условию задачи, я так полагаю, необходимо посчитать количество отрицательных элементов, количество положительных элементов и найти их разность.. Дурацкая задача, но что поделать. А насчет перепутала с точностью да наоборот - это как? одномерный массив просчитывает без проблем, а с двумерным не смогли бы прописать прямооо... Я просто зациклилась в каком то русле и не пойму, где ошибка происходит....

Добавлено через 3 минуты


ну там нужен двумерный массив, дабы продемонстрировать правильность работы на его строках
Задача: Вычислить разность между количеством отрицательных и количеством положительных элементов массива. Использовать функцию для каждой строки матрицы Р (4, 14).
Примечание: [создать функцию, параметром которой является одномерный массив и его размерность. Тело функции реализовать двумя способами: через обращение к элементам массива через указатели и обычным способом. Продемонстрировать возможность применения созданной функции к строкам двумерного массива. Элементы матрицы задать случайным образом, не забыв вывести их на экран.
У вас задан двумерный массив изначально, вы его обрабатываете по строкам, а потом обрабатываете массив целиком как дномерный

Добавлено через 6 минут
Заменить
C++
1
raznost +=kolPos(&matr[i][0], M)-kolNeg(&matr[i][0], M)
;
на
C++
1
raznost +=abs(kolPos(&matr[i][0], M)-kolNeg(&matr[i][0], M));
Добавлено через 2 минуты
Valli1, ваш код нечитаем, что вам мешает в среде разработки его отформатировать?

Добавлено через 55 секунд

Не по теме:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<iostream>
const int M=4;
void f(int (*a1)[M],int size);
 
 
#include<iostream>
const int M = 4;
void f(int (*a1)[M], int size);
 
int main() {
    int a[M][M] = { { 0, 1, 2, 3 }, { 4, -5, -6, 7 }, { 8, 9, 10, 11 }, { 12,
            13, 14, 15 } };
    f(a, 4);
    std::cin.get();
    std::cin.get();
 
    return 0;
}
void f(int ((*a1)[M]), int size) {
    int min = 0;
    int plus = 0;
    int sum = 0;
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < M; j++) {
            if (*(*(a1 + i) + j) < 0)
                min++;
            if (*(*(a1 + i) + j) > 0)
                plus++;
        }
        sum = -min + plus;
        std::cout << sum << '\n';
        min = 0;
        plus = 0;
        sum = 0;
    }
}

kristina-lonsh
0 / 0 / 0
Регистрация: 04.03.2012
Сообщений: 61
28.01.2013, 18:13  [ТС] #9
Цитата Сообщение от vua72 Посмотреть сообщение
Смотрите, я переделал свой пример, а вы по аналогии переделайте свою функцию

Добавлено через 16 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <iomanip> //setw
#include <cstdlib> // rand
#include <ctime> // time
using namespace std;
 
int kolPos(int a[], int size);
int kolNeg(int *a, int size);
int main() {
    const int N = 4;
    const int M = 14;
    int matr[N][M];
    srand(time(NULL));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < M; ++j) {
            matr[i][j] = rand() % 100 - 50;
            cout << setw(5) << matr[i][j];
        }
        cout << endl;
    }
    // рассчет по строкам
    int raznost=0;
    for (int i = 0; i < N; ++i) {
        raznost +=kolPos(&matr[i][0], M)-kolNeg(&matr[i][0], M);
    }
    cout << "\nRaznost = " << abs(raznost);
    // для вмей матрицы
    cout << "\nRaznost = " << abs(kolPos(&matr[0][0], N*M)-kolNeg(&matr[0][0], N*M));
    return 0;
}
 
int kolPos(int a[], int size) {
    int tmpSum = 0;
    for (int i = 0; i < size; ++i)
        if (a[i] > 0)
            tmpSum ++;
    return tmpSum;
}
 
int kolNeg(int *a, int size) {
    int tmpSum = 0;
    for (int i = 0; i < size; ++i)
        if (*(a + i) < 0) // указатели
            tmpSum ++;
    return tmpSum;
}
Добавлено через 4 минуты



У вас задан двумерный массив изначально, вы его обрабатываете по строкам, а потом обрабатываете массив целиком как дномерный
ну, возможно, Вы правы и проверка на одномерном массиве не нужна. Но вы считаете, что количество положительных и количество отрицательных элементов должны рассчитывать разные функции?? я думаю по контексту задачи прослеживается одна функция, результатом которой будет разность (число).
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
28.01.2013, 18:15 #10
kristina-lonsh, считайте в одной, я вам пример привел, вы делайте так как вам нужно, исправьте свою функцию.

Не по теме:

И хоть немножео псомтрите как работает пример, который вам привели, и разберитесь с указателями

Valli1
4 / 4 / 0
Регистрация: 14.09.2012
Сообщений: 64
29.01.2013, 01:20 #11
Valli1, ваш код нечитаем, что вам мешает в среде разработки его отформатировать?
Я его в Visual 2008 делал, все читает и выводит.
Twitosha
1 / 1 / 0
Регистрация: 02.03.2013
Сообщений: 29
17.09.2013, 02:20 #12
автор темы. у тебя остался код программы, этой, переделанной? если да, буду очень признательна тебе, если ты выложишь код сюда.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2013, 02:20
Привет! Вот еще темы с ответами:

Дан одномерный массив состоящий из N целочисленных элементов. Вычислить сумму положительных элементов массива кратных 3 - C++
если не сложно помогите 1)дана функция y=0.5+sin(5x), причем х изменяется от 0 до 2pi с шагом x=pi/6!(программа не выводит результата...

Одномерный массив из вещестенных чисел: вычислить сумму положительных элементов - C++
В одноименном массиве, состоящем из N вещественных элементов, вычислить сумму положительных элементов массива

Найти разность количества положительных и отрицательных элементов - C++
Помогите, пожалуйста. Нужно переделать вторую часть, где идет работа с заданием 2. Там выполняется сумма отрицательных элементов. А мне...

Функция должна вычислять разницы между суммой положительных элементов массива и суммой модулей отрицательных элементов массива - C++
Разработать функцию ,обрабатывающую массив и вычисляющую две величины.Кроме того,разработать две функции,которые вычисляют те же самые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.09.2013, 02:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru