- •1. Основные этапы решения задач на эвм
- •Формулировка задачи
- •Математическая постановка задачи
- •Разработка алгоритма решения задачи
- •Написание текста программы на языке программирования
- •Ввод текста программы в эвм
- •Поиск и устранение синтаксических ошибок
- •Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы
- •Базовые компоненты программ
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Типы данных
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Универсальные функции ввода и вывода любых типов данных
- •Структуры и форма написания программы
- •Программирование разветвляющихся вычислительных процессов
- •Цикл while – цикл с предусловием.
- •Цикл do while – цикл с постусловием
- •Цикл for
- •Безусловная передача управления внутри цикла
- •Описание некоторых стандартов алгоритмов
- •Работа с файлами (функции ввода вывода верхнего уровня)
- •Указатели
- •Одномерные массивы Объявление массива.
- •Стандартные функции обработки строк
- •Многомерные массивы на примере двумерных
- •Классы памяти
- •Способы передачи данных в функцию
- •Функции и строки
- •Функции и одномерные числовые массивы
- •Функции и двумерные массивы
- •Функции с параметрами по умолчанию
- •Перегрузка функции
- •Шаблоны функции
- •Типы данных, определяемые пользователем
- •4.1. Структуры
- •Шаблон структуры
- •Структурные переменные
- •Инициализация структуры
- •Доступ к полям структуры
- •Массив структур
- •Вложенные структуры
- •Битовые поля структур
- •Передача структуры в функцию
- •Двоичный ввод-вывод структур
- •Функции двоичного ввода-вывода
- •Динамические структуры данных
- •4.2. Объединения
- •4.3. Перечисления
- •Файловые операции ввода/вывода
- •Файловый ввод/вывод с прямым доступом
Функции и двумерные массивы
Любой двумерный массив определяется тремя параметрами:
Адресом первого элемента в массиве int*p.
Количество строк в матрице int n.
Количество столбцов в матрице int m.
При этом определение адреса элемента массива с индексами i,j будет производится по формуле p+i*m+j. Для организации вызова функции (main) необходимо уметь определить адрес первого элемента в массиве.
Если память под массив выделена статически: int mas [3][4]; то mas [0] – адрес первого элемента в массиве.
Если память под двумерный массив выделена динамически: int*p;
p=new int[3*4]; p-адрес первого элемента в массиве.
Переданный в функцию массив может играть роль исходного или результата. Передавая несколько матриц надо помнить об их соразмерности и не передавать лишних размерностей.
Для обработки матрицы построчно можно использовать готовые функции для одномерного массива
Задача 1.
Демонстрирует получение матрицы результата с выделением памяти внутри main
Дана матрица,создать транспонированную.
Выделяем функции:
1. Заполнение матрицы случайными числами, по-скольку перебор идет построчно, используем ранее записанную функцию InMasRnd
2. Вывод матрицы на экран в матричной форме
3. Создание транспонируемой матрицы
Анализ характеристик функции:
2/
1. OutMas
2. Исходные данные:
матрица
int *p;
int n;
int m;
3. Результат: нет (void)
3/
1. TransMas
2. Исходные данные:
матрица исходная
int *p1;
int n;
int m;
матрица транспонированая - int *p2;
3. Результат: нет (void)
файл: mas2.h
----------------
#ifndef MAS2_H
#define MAS2_H
void InMasRnd(int *p, int n, int min, int max);
void OutMas(int *p, int n, int m);
void TransMas(int *p1, int *p2, int n, int m);
#endif
----------------
файл: mas2.cpp
----------------
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include <iomanip>
#include <stdlib.h>
#include <time.h>
void InMasRnd(int *p, int n, int min, int max)
{
int i;
for (i=0; i<n; i++)
p[i]=rand()%(max-min+1)+min;
return;
}
void OutMas(int *p, int n, int m)
{
int i,j;
cout << endl;
for (i=0; i<n; i++) {
for (j=0; j<m; j++) {
cout << setw(5) << *(p+i*m+j);
}
cout << endl;
}
return;
}
void TransMas(int *p1, int *p2, int n, int m)
{
int i,j;
for (i=0; i<n; i++) {
for (j=0; j<m; j++) {
*(p2+j*n+i)=*(p1+i*m+j);
}
}
return;
}
----------------
файл: main.cpp
----------------
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include <stdlib.h>
#include <time.h>
#include "mas2.h"
int main(void)
{
const int N=3;
const int M=5;
int m1[N][M], m2[M][N];
srand((unsigned)time(NULL));
InMasRnd(m1[0],N*M,-20,30); // m1[0] - адрес нулевой строки, // соответ-но адрес первого числа
cout << "\nИсходный массив:";
OutMas(m1[0],N,M);
cout << "\nВторой массив:";
TransMas(m1[0],m2[0],N,M);
OutMas(m2[0],M,N);
return 0;
}