Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
1

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

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

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

Может кто-нибудь поспособствовать решению?
з.ы. Нужно 4 программы: 2 в статике, 2 в динамике.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2010, 18:02
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...

Используя нетипизированные указатели и указатели на подпрограммы обобщить сортировку пузырьком
Смысл задания в том, что нужно отсортировать массив структур из 3х полей по сумме координат есть...

17
ниначмуроФ
846 / 530 / 110
Регистрация: 12.10.2009
Сообщений: 1,915
16.04.2010, 18:12 2
2 одинаковых задания?
0
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 18:25  [ТС] 3
упс, глюк, сорри, ща подправлю.

Добавлено через 1 минуту
1.В массиве А(N) определить количество перемен знаков.
2.Строки массива А(N,M), не содержащие положительных элементов, заменить нулевыми элементами.
0
Модератор
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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;
}
Сначало вводится размерность, потом сам массив. Потом выводится результат (число перемен)
1
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.04.2010, 18:57 5
insideone, я не понимаю алгоритма, будь добр (;
А именно, строки 16-18 -
Циклом проходим по всем элементам массива, и если модуль разности элемента i и первого элемента, не равен нулю, то увеличиваем счетчик на 1.
Я все верно понял?

PS - Там же, как я понял, не хватает тогда {} ? Или я ошибаюсь?
0
Модератор
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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 и менять надо
1
1545 / 911 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
16.04.2010, 19:21 7
Понятно, спасибо
0
Модератор
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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;
}
Вот и в статике вторая
0
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 19:28  [ТС] 9
ммэ, чтоб я что-нить понял... да и препод не поверит, что я это сам написал...
0
Модератор
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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) - размер одного числа. ну умножаем и получаем что надо
0
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 -три.
0
Модератор
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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;
}
0
1998 / 1598 / 488
Регистрация: 31.05.2009
Сообщений: 2,990
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;
}
0
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 21:42  [ТС] 14
insideone, ты б еще мануальчик к своей проге сделал бы, вообще было бы круто...
0
Модератор
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
16.04.2010, 21:47 15
Tshen, их две, закоментить обе что ли?
0
0 / 0 / 0
Регистрация: 04.12.2009
Сообщений: 11
16.04.2010, 21:56  [ТС] 16
угу, если можно, попроще и попонятнее)
0
Модератор
Автор FAQ
3682 / 959 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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;
}
Так нормально?
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10875 / 6763 / 1619
Регистрация: 25.07.2009
Сообщений: 12,484
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;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2010, 23:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;//...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; ...

Указатели на указатели: для чего они могут понадобятся?
Изучаю C++, дошёл до указателей на указатели. Там пишут что эта тема не обязательна. Для чего они...

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

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