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

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

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

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

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

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

Может кто-нибудь поспособствовать решению?
з.ы. Нужно 4 программы: 2 в статике, 2 в динамике.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2010, 18:02     С++ Указатели.
Посмотрите здесь:

Указатели* - C++
Объясните что происходит в последней строке , и если мои комменты не правильны поправьте пожалуйста. void order ( int* numb1, int*...

Указатели.... - C++
Найти наибольшее отрицательное число с четными индексами. (Создать указатель на наиболее отрицательное число среди элементов с четными...

Указатели - C++
Используя вместо самой переменной указатель на нее, написать программу в соответствии с заданием (выполнение задания оформить...

Указатели - C++
Всем привет. Нам дали сделать лабу: Дана целочисленная прямоугольная матрица. 1) Определить номер первого из столбцов, содержащих хотя...

Указатели - C++
Есть задание,я сделала через массив,а мне нужно переделать через указатели. #include <iostream.h> #include <stdio.h> #include...

Указатели - C++
Вводится строка слов, разделенных пробелами (возможны лишние пробелы в начале и в конце строки и между словами). Скопировать в новую строку...

Указатели - C++
Доброй ночи! Вот столкнулась с такой проблемой, нужно из одной функции в другую перенести переменную number через указатель, что у меня...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
834 / 518 / 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
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
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
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,902
16.04.2010, 18:57     С++ Указатели. #5
insideone, я не понимаю алгоритма, будь добр (;
А именно, строки 16-18 -
Циклом проходим по всем элементам массива, и если модуль разности элемента i и первого элемента, не равен нулю, то увеличиваем счетчик на 1.
Я все верно понял?

PS - Там же, как я понял, не хватает тогда {} ? Или я ошибаюсь?
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
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
1479 / 846 / 75
Регистрация: 26.03.2010
Сообщений: 2,902
16.04.2010, 19:21     С++ Указатели. #7
Понятно, спасибо
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
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
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
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
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
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
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,911
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
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
16.04.2010, 21:47     С++ Указатели. #15
Tshen, их две, закоментить обе что ли?
Tshen
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 21:56  [ТС]     С++ Указатели. #16
угу, если можно, попроще и попонятнее)
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
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++
1) Предположим, что p - указатель, установленный на целую переменную со значением 3. Что можно сказать о значении выражений p, * p, &amp; p, *...

Указатели - C++
Почему такой вариант кода невозможен(конкретно: строка 6)?int indicator, x = 15, y = 10; int *ptr; cin &gt;&gt; indicator; ...

Указатели - C++
Доброго времени суток. У меня задание. Кто поможет? Сказали разобраться с указателями. Программа ругается на +=, выдает ошибку. Как их...

указатели - C++
1) создать функцию(проблем нет) 2) в функции ввести и определить локальную переменную типа int и задать ей значение 1(проблем нет) 3) в...

Указатели - C++
Всем здрасьте ! Тут на днях я прочитал про указатели в одной книге , и мало что о них понял. Не могил бы вы мне рассказать , что это...


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

Или воспользуйтесь поиском по форуму:
easybudda
Эксперт С++
9460 / 5473 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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     С++ Указатели.
Ответ Создать тему
Опции темы

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