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

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

Войти
Регистрация
Восстановить пароль
 
Tshen
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
#1

С++ Указатели. - C++

16.04.2010, 18:02. Просмотров 827. Ответов 17
Метки нет (Все метки)

1. Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами.
2.Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами.

Может кто-нибудь поспособствовать решению?
з.ы. Нужно 4 программы: 2 в статике, 2 в динамике.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.04.2010, 18:12     С++ Указатели. #2
2 одинаковых задания?
Tshen
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 18:25  [ТС]     С++ Указатели. #3
упс, глюк, сорри, ща подправлю.

Добавлено через 1 минуту
1.В массиве А(N) определить количество перемен знаков.
2.Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.04.2010, 18:44     С++ Указатели. #4
Цитата Сообщение от Tshen Посмотреть сообщение
1.В массиве А(N) определить количество перемен знаков.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "math.h"
using namespace std;
int sgn(int num){
   return (num < 0)?-1:1;
}
 
int main(){
   int len = 0;
   cin >> len;
   if (len == 0) return 0;
   int* A = new int[len];
   for (int i = 0; i < len; i++)
      cin >> A[i];
   int cur = A[0], count = 0;
   for (int i = 0; i < len; i++)
      if ( abs(A[i]-cur) != 0 )
         count++;
   cout << endl << count;
return 0;
}
Сначало вводится размерность, потом сам массив. Потом выводится результат (число перемен)
neske
1455 / 822 / 68
Регистрация: 26.03.2010
Сообщений: 2,810
16.04.2010, 18:57     С++ Указатели. #5
insideone, я не понимаю алгоритма, будь добр (;
А именно, строки 16-18 -
Циклом проходим по всем элементам массива, и если модуль разности элемента i и первого элемента, не равен нулю, то увеличиваем счетчик на 1.
Я все верно понял?

PS - Там же, как я понял, не хватает тогда {} ? Или я ошибаюсь?
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.04.2010, 19:09     С++ Указатели. #6
Прошу прощения скосячил. Вот так будет верно
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
#include <iostream>
#include "math.h"
using namespace std;
int sgn(int num){
   return (num < 0)?-1:1;
}
 
int main(){
   int len = 0;
   cin >> len;
   if (len == 0) return 0;
   int* A = new int[len];
   for (int i = 0; i < len; i++)
      cin >> A[i];
   int cur = A[0], count = 0;
   for (int i = 0; i < len; i++)
      if ( abs(sgn(A[i])-cur) != 0 )
      {
         cur = -cur;
         count++;
      }
   cout << endl << count;
return 0;
}
Смысл в том что мы запоминаем отрицательное ли число предыдущее (в переменной cur) и сравниваем его с текущим. Выражение sgn(A[i])-cur дает... допустим текущее число -3, sgn(-3) будет -1, если cur было -1 тоже то -1 - (-1) == 0 а 0 значит менять не надо. А если cur было 1 то получим -1 - 1 == -2 != 0 - менять надо. Так же если текущее число положительное выходит 1 - cur
если предыдущее было положительное то 1 - 1 == 0 менять не надо. Ну и если было отрицательно выходит число 2 и менять надо
neske
1455 / 822 / 68
Регистрация: 26.03.2010
Сообщений: 2,810
16.04.2010, 19:21     С++ Указатели. #7
Понятно, спасибо
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.04.2010, 19:23     С++ Указатели. #8
Цитата Сообщение от Tshen Посмотреть сообщение
2.Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами.
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
#include <iostream>
 
using namespace std;
 
#define N 3
#define M 3
int main(){
   int A[N][M];
   for (int i = 0; i < N; i++)
       for (int j = 0; j < M; j++)
        cin >> A[i][j];
 
   bool flag = false;
    for (int i = 0; i < N; i++)
    {
        flag = false;
        for (int j = 0; j < M; j++)
        {
            if (A[i][j] >= 0) flag = true;
        }
        if ( flag == false )
            memset(&A[i][0], 0, sizeof(int) * M);
    }
 
   for (int i = 0; i < N; i++)
   {
       for (int j = 0; j < M; j++)
        cout << A[i][j] << " ";
       cout << endl;
   }
return 0;
}
Вот и в статике вторая
Tshen
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 19:28  [ТС]     С++ Указатели. #9
ммэ, чтоб я что-нить понял... да и препод не поверит, что я это сам написал...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.04.2010, 19:47     С++ Указатели. #10
Цитата Сообщение от Tshen Посмотреть сообщение
ммэ, чтоб я что-нить понял... да и препод не поверит, что я это сам написал...
да ладно вам, ничего сложного. заводим флаг о проверке. если он будет true ничего очищать не надо. а true он станет если в строке есть положительные числа if (A[i][j] >= 0)
когда вся строка проверена можно по флагу решить что с этой строкой делать так сказать зачистить или нет. если нужно то делается так:
C++
1
memset(&A[i][0], 0, sizeof(int) * M);
первый параметр - это откуда нужно зачистить.
второй чем (что записать) - нули пишем
а третий - блоков информации перезаписать. в нашем случае нужно всю строку очистить а в строке M int чисел. нам нужно узнать размер M int чисел. sizeof(int) - размер одного числа. ну умножаем и получаем что надо
Tshen
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 20:25  [ТС]     С++ Указатели. #11
insideone, у тебя первая прога неправильно что-то считает: 5 5 5 5 5 5 это для нее 5 перемен, а 5 -7 5 5 -7 5 -три.
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.04.2010, 20:35     С++ Указатели. #12
Tshen, ох, опять... хм... почему мне всегда везет так что мои входные значения показывают верный результат
Добавлено через 4 минуты
разобрался, дело в начальных условиях. я делаю
C++
1
int cur = A[0], count = 0;
а в cur должен лежать -1 или 1, т.е. надо ф-ю применить
C++
1
int cur = sgn(A[0]), count = 0;
остальное все верно
код
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
#include <iostream>
#include "math.h"
using namespace std;
int sgn(int num){
   return (num < 0)?-1:1;
}
 
int main(){
    int len = 0;
    cin >> len;
    if (len == 0) return 0;
    int* A = new int[len];
    for (int i = 0; i < len; i++)
        cin >> A[i];
    int cur = sgn(A[0]), count = 0;
    for (int i = 0; i < len; i++)
        if ( abs(sgn(A[i])-cur) != 0 )
        {
            cur = -cur;
            count++;
        }
    cout << endl << count;
return 0;
}
rangerx
1921 / 1530 / 139
Регистрация: 31.05.2009
Сообщений: 2,892
16.04.2010, 21:00     С++ Указатели. #13
1.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
#define N 5
 
int main()
{
    int A[N] = {-5, 7, -5, 5, -7};
    int count = 0;
    int temp = A[0];
 
    int i;
    for(i = 1; i < N; ++i)
    {
        if( (A[i] < 0) != (temp < 0) )
        {
            temp = A[i];
            ++count;
        }
    }
    printf("count: %d\n", count);
    return 0;
}
Tshen
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 21:42  [ТС]     С++ Указатели. #14
insideone, ты б еще мануальчик к своей проге сделал бы, вообще было бы круто...
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.04.2010, 21:47     С++ Указатели. #15
Tshen, их две, закоментить обе что ли?
Tshen
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 21:56  [ТС]     С++ Указатели. #16
угу, если можно, попроще и попонятнее)
insideone
Модератор
Автор FAQ
 Аватар для insideone
3634 / 912 / 48
Регистрация: 10.01.2010
Сообщений: 2,457
16.04.2010, 23:08     С++ Указатели. #17
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
#include <iostream>
#include "math.h"
using namespace std;
int sgn(int num){ // функция возращает значение -1 если число отрицательное и 1 если положительное
   return (num < 0)?-1:1;
}
 
int main(){
        int len = 0;
        cin >> len; // узнаем длинну массива
        if (len == 0) return 0; // нулевого массива быть не может
        int* A = new int[len]; // динамически выделяем память
        for (int i = 0; i < len; i++) // в цикле по массиву
                cin >> A[i]; // считываем в него данные
        int cur = sgn(A[0]), count = 0; // устанавливаем в cur знак первого числа
        for (int i = 0; i < len; i++) // в цикле по массив
                if ( abs(sgn(A[i])-cur) != 0 ) // если знак поменялся ( моудль от (знак текущего - знак предыдущего) будет либо 0 либо 2. если вышло 0 значит знак НЕ менялся если не ноль (2) то менялся
                {
                        cur = -cur; // если знак сменился обновим и скажем что теперь проверочный знак такой
                        count++; // увеличим счетчик смены знаков
                }
        cout << endl << count; // вывод подсчитаного количества смены знаков
return 0;
}
Добавлено через 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
#include <iostream>
 
using namespace std;
 
#define N 3
#define M 3
int main(){
   int A[N][M]; // статически выделяем 
   for (int i = 0; i < N; i++) // в цикле идет
           for (int j = 0; j < M; j++)
                cin >> A[i][j]; // заполнение
 
   bool flag = false; // нашли положительное число
        for (int i = 0; i < N; i++) // идем по строкам
        {
                flag = false; // мы только начали, поэтому ещё не могли найти положительные числа
                for (int j = 0; j < M; j++) // идем по столбцам
                {
                        if (A[i][j] >= 0) flag = true; // если нашли положительное число устанавливаем флаг в true
                }
                if ( flag == false ) // если ненашли положительное число 
                        memset(&A[i][0], 0, sizeof(int) * M); // устанавливаем в 0 M элементов начиная с A[i][0]
        }
 
  
   for (int i = 0; i < N; i++)
   {
           for (int j = 0; j < M; j++)
                cout << A[i][j] << " "; // вывод элемента
           cout << endl; // строки разлеяем переводом каретки
   }
return 0;
}
Так нормально?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2010, 23:24     С++ Указатели.
Еще ссылки по теме:

C++ Указатели на слонов или А зачем нужны указатели?
Отсортировать массив и вывести на экран (массивы и указатели на указатели) C++
C++ Константные указатели и указатели на константу
C++ Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Используются ли на практике указатели на указатели объектов? C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
16.04.2010, 23:24     С++ Указатели. #18
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
#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
 
/* Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами. */
 
int main(){
    int ROWS, COLS, **matr;
    std::cout << "Rows: ";
    std::cin >> ROWS;
    std::cout << "Columns: ";
    std::cin >> COLS;
    
    matr = new int* [ ROWS ];
    for ( int i = 0; i < ROWS; ++i )
        matr[i] = new int [ COLS ];
    
    for ( int i = 0; i < ROWS; ++i ){
        for ( int j = 0; j < COLS; ++j ){
            std::cout << "MATRIX[" << i << "][" << j << "] = ";
            std::cin >> matr[i][j];
        }
    }
    
    for ( int i = 0; i < ROWS; ++i )
        if ( !(std::count_if(matr[i], matr[i] + COLS, std::bind2nd(std::greater<int>(), 0))) )
            std::fill(matr[i], matr[i] + COLS, 0);
    
    std::cout << std::endl;
    for ( int i = 0; i < ROWS; ++i ){
        std::copy(matr[i], matr[i] + COLS, std::ostream_iterator<int>(std::cout, " "));
        std::cout << std::endl;
    }
    
    for ( int i = 0; i < ROWS; ++i )
        delete [] matr[i];
    delete [] matr;
    
    return 0;
}
Yandex
Объявления
16.04.2010, 23:24     С++ Указатели.
Ответ Создать тему
Опции темы

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