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

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

Войти
Регистрация
Восстановить пароль
 
.Malek.
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 180
#1

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

18.04.2011, 09:18. Просмотров 889. Ответов 12
Метки нет (Все метки)

Написать функцию возведения в квадрат каждого элемента матрицы (N, M), использовать ее для массива целых и вещественных чисел.

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

Указатели. Матрица и двойная косвенная адресация - C++
При метке 4, косяк..не могу понять..что-то с указателем? Помогите пожалуйста.. #include<stdio.h> #include<locale.h> ...

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

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

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; void min_max(int*pa, int*pb,...

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

12
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);
 }
}
1
.Malek.
5 / 5 / 0
Регистрация: 20.03.2011
Сообщений: 180
18.04.2011, 09:58  [ТС] #3
Спасибо. а можно добавить комментарии
0
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 или ещё какие типы данных, то просто копироважай эти функции и заменяй в копиях тип.
1
popov654
32 / 32 / 2
Регистрация: 09.04.2011
Сообщений: 119
18.04.2011, 13:33 #5
А Вы не подскажете, по адресу, на который указывает указатель a в случае с массивом (допустим с одномерным), хранится первый элемент или всё-таки размер массива? А то я тут где-то читал...

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

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

Не по теме:

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

0
CyBOSSeR
Эксперт С++
2303 / 1673 / 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
3
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
17.05.2011, 09:49 #13
В заголовках циклов надо убрать * перед r.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2011, 09:49
Привет! Вот еще темы с ответами:

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...


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

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

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