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

Матрица и указатели - C++

Восстановить пароль Регистрация
 
.Malek.
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 180
18.04.2011, 09:18     Матрица и указатели #1
Написать функцию возведения в квадрат каждого элемента матрицы (N, M), использовать ее для массива целых и вещественных чисел.

Необходимо соблюсти условия перечисленные ниже.
1. Ввод исходных данных и вывод результата на экран производить в основной программе, решение задачи осуществлять в созданной функции.
2. Не применять индексированных переменных для доступа к элементам массивов, а использовать разыменование указателей.
3. Вызывать функции через указатель на нее и обычным образом.
4. Использовать прием перегрузки функций.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2011, 09:18     Матрица и указатели
Посмотрите здесь:

Указатели в Си++ C++
УКАЗАТЕЛИ!!! C++
Указатели C++
указатели и new C++
Указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.04.2011, 09:46     Матрица и указатели #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void matrixsqr(int *a, int N, int M)
{
 int *p,
 for (p=a+n*m-1; p>=a; --p)
 {
  *p=*p*(*p);
 }
}
void matrixsqr(double *a, int N, int M)
{
 double *p,
 for (p=a+n*m-1; p>=a; --p)
 {
  *p=*p*(*p);
 }
}
.Malek.
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 180
18.04.2011, 09:58  [ТС]     Матрица и указатели #3
Спасибо. а можно добавить комментарии
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.04.2011, 10:16     Матрица и указатели #4
Цитата Сообщение от .Malek. Посмотреть сообщение
Использовать прием перегрузки функций.
Это делается так: пишешь несколько функций с одним именем, различающихся типами и/или количеством параметов, при этом при разработке каждой следующей не обращаешь внимания на предыдущие, а пишешь так, как если бы их не было, каждая функция может отличаться и типом возвращаемого значния, но это не обязательно, а обязательно различие именно формальных параметров, в результате получаешь версии функции, а при вызове каждой версии пишешь, как еслиб была только одна такая функция только с этим списком формальных параметров и не было других.

Добавлено через 3 минуты
Цитата Сообщение от .Malek. Посмотреть сообщение
Спасибо. а можно добавить комментарии
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void matrixsqr(int *a, int N, int M) // Интовая версия
{ // Начало тела функции
 int *p, // Указатель
 for (p=a+N*M-1; p>=a; --p) // Цикл со счётчиком указаетльного типа, перебираем все элементы матрицы без учёта её структуры, подходит только если все строки хранятся подряд.
 {// Начало тела цикла
  *p=*p*(*p); // Возведение в квадрат умножением.
 }// Конец тела цикла
}// Конец тела функции
void matrixsqr(double *a, int N, int M) // Вещественная версия
{ // Начало тела функции
 double *p, // Указатель
 for (p=a+N*M-1; p>=a; --p) // Цикл со счётчиком указаетльного типа, перебираем все элементы матрицы без учёта её структуры, подходит только если все строки хранятся подряд.
 {// Начало тела цикла
  *p=*p*(*p); // Возведение в квадрат умножением.
 }// Конец тела цикла
}// Конец тела функции
Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void matrixsqr(int **a, int N, int M) // Интовая версия
{ // Начало тела функции
 int *p, **r // Указатель
 for (*r=a+N-1; r>=a; --r) // Цикл со счётчиком указаетльного типа, перебираем все сктроки матрицы
 {// Начало тела цикла
  for (p=*r+M-1; p>=*r; --p) // Цикл со счётчиком указаетльного типа, перебираем все элементы строки матрицы
  {// Начало тела цикла
   *p=*p*(*p); // Возведение в квадрат умножением.
  }// Конец тела цикла
 }// Конец тела цикла
}// Конец тела функции
void matrixsqr(double **a, int N, int M) // Вещественаная версия
{ // Начало тела функции
 double *p, **r // Указатель
 for (*r=a+N-1; r>=a; --r) // Цикл со счётчиком указаетльного типа, перебираем все сктроки матрицы
 {// Начало тела цикла
  for (p=*r+M-1; p>=*r; --p) // Цикл со счётчиком указаетльного типа, перебираем все элементы строки матрицы
  {// Начало тела цикла
   *p=*p*(*p); // Возведение в квадрат умножением.
  }// Конец тела цикла
 }// Конец тела цикла
}// Конец тела функции
да, ещё, n*m-1 везде замени на N*M-1

Добавлено через 1 минуту
Если надо short int, float, long int, small int или ещё какие типы данных, то просто копироважай эти функции и заменяй в копиях тип.
popov654
 Аватар для popov654
31 / 31 / 2
Регистрация: 09.04.2011
Сообщений: 114
18.04.2011, 13:33     Матрица и указатели #5
А Вы не подскажете, по адресу, на который указывает указатель a в случае с массивом (допустим с одномерным), хранится первый элемент или всё-таки размер массива? А то я тут где-то читал...

Добавлено через 8 минут
Уже проверил. Походу всё-таки первый элемент)
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
18.04.2011, 16:39     Матрица и указатели #6
Адрес первого элемента хранится)

C++
1
std::cout << MAS << " " << &MAS << " " << &MAS[0];
Это все эквиваленты.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
18.04.2011, 16:54     Матрица и указатели #7
Цитата Сообщение от neske Посмотреть сообщение
Это все эквиваленты.
Только не вслучае, когда мы присваеваем указателю адрес первого елемента масива, то бишь так делать нельзя
C++
1
2
int a[3] = {1, 2, 3}, 
*p = &a;
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
18.04.2011, 16:57     Матрица и указатели #8
asics, а почему так?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
18.04.2011, 17:05     Матрица и указатели #9
neske, Потому что a - это уже посути выражение &a[0], а если мы поставим возле a амперсанд, получаеться выражение типа &&a[0], что и приводит к ошибке.(Если в чем-то ошибся - поправте)
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,693
18.04.2011, 17:09     Матрица и указатели #10
А почему тогда такая запись корректна:
C++
1
std::cout << &MAS;
Ведь такая штука вызывает ошибку: (да оно и понятно)
C++
1
std::cout << &&MAS[0];
Ну это так, чтобы до конца разобраться)
asics
18.04.2011, 17:14
  #11

Не по теме:

Если чесно, то я сам не доконца понимаю что там происходит, когда мы это дело кидаем в поток, так что отвечать не насмелюсь.

CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.04.2011, 00:05     Матрица и указатели #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от neske Посмотреть сообщение
Это все эквиваленты.
Нет, типы разные:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <typeinfo>
 
int main() {
  int array[] = { 1, 2, 3 };
  
  std::cout << typeid(array).name()     << ": " << array     << std::endl
            << typeid(&array).name()    << ": " << &array    << std::endl
            << typeid(&array[0]).name() << ": " << &array[0] << std::endl;
}
Результат: http://codepad.org/EDB5STl7
Цитата Сообщение от asics Посмотреть сообщение
так делать нельзя
Можно, но необходимо явное приведение:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main() {
  int array[] = { 1, 2, 3 };
  
  int* p = reinterpret_cast<int*>(&array);
  
  std::cout << &array[0] << " " << p << std::endl;
}
Результат: http://codepad.org/AXhH00r9
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2011, 09:49     Матрица и указатели
Еще ссылки по теме:

C++ Указатели
C++ Динамическая матрица, не выводит через указатели
Указатели. Матрица и двойная косвенная адресация C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2011, 09:49     Матрица и указатели #13
В заголовках циклов надо убрать * перед r.
Yandex
Объявления
17.05.2011, 09:49     Матрица и указатели
Ответ Создать тему
Опции темы

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