Добрый вечер друзья. Продолжаем изучать работу с массивами и указателями.
Сегодня научимся передавать массив в функцию и возвращать массив из функции.
Итак, начнем с первого пункта. Пусть нам необходимо передать массив в функцию и там его обработать. Ну допустим вывести его элементы на экран. Тут возможны два варианта.
1. У нас статический массив.
2. У нас динамический массив.
В зависимости от этого и нужно плясать.
Первый случай. Передача в функцию статического массива.
Для определенности будем передавать массив символов. Напишем функцию, которая принимает строку и выводит её на экран.
Листинг 18.1
Давайте внимательно рассмотрим аргументы, которая эта функция принимает. Первый из них как раз и есть массив, который мы хотим передать. Как видите отличие от передачи обычной переменной лишь в том, что мы после имени пишем квадратные скобки. Именно они и указывают на то, что это не просто некая переменная а целый массив переменных данного типа.
В скобках, не нужно указывать размерность массива. С размерностью массива вообще все не так просто. Функции в Си не умеют самостоятельно определять размерность переданного им массива. Поэтому отдельным параметром нам необходимо передавать его размер. В нашей функции мы передаем размер массива с помощью переменной n.
Напишем самую простую программу, которая будет использовать эту функцию.
Листинг 18.2
Обратите внимание, что передача массива в функцию в этом случае, по виду, ничем не отличается от передачи обычной переменной. Мы лишь указываем его имя и все. Это только на первый взгляд так кажется. Но об этом чуть позже.
Второй случай. Передача в функцию динамического массива.
Давайте решим такую задачу. имеется текстовый файл input.txt. Пусть в нем в первой строчке записано натуральное число N не превосходящее 100. А в следующих N строках записаны некоторые вещественные числа. Пусть мы хотим посчитать среднее арифметическое всех этих чисел и вывести.
Удобно для хранения чисел завести динамический массив. Хотя, на самом деле, в этой задаче мы могли бы просто читать числа из файла и сразу вычислять их среднее значение. Но как-то я не могу придумать пока более подходящего примера.
И так напишем требуемую программу.
Листинг 18.3
Обратите внимание на аргументы функции. Как видите, если мы передаем динамический массив, то нам нужно явно указывать на то, что функция принимает указатель на первый элемент массива. В случае одномерного массива это не критично, и вы можете объявить аргументы как и в прошлый раз, т.е.
void sa_arr(float a[], int n)
но так делать не стоит. Приучайтесь сразу передавать динамические массивы таким образом.
Теперь вернемся к нашим отличиям а так же второму вопросу.
Если вы помните, то переменные в языке Си, при передаче их в функцию передаются по значению. То есть мы передаем не сами переменные, а только их значения. И если мы в функции будем их изменять, то настоящих переменных это никак не коснется. В нашей группе в вк, даже было небольшое задание на эту тему. Да и в уроке с указателями мы разбирали, как обойти это ограничение.
Основное отличие передачи массива в функцию в том, что массивы, в отличие от переменных всегда передаются по ссылке. Т.е. в функцию передается не копия массива, а сам массив. И если внутри функции мы будем как-то изменять массив, то эти изменения останутся и после того, как функция закончит свою работу.
Несколько изменим наше предыдущую программу. Изменим один из элементов внутри функции. И посмотрим, что будет с исходным массивом.
Листинг 18.4
Результат работы программы на следующем рисунке.
Как видите, изменения массива внутри функции, затронуло и исходный массив.
Эту возможность следует использовать во благо. А именно для того, чтобы возвращать массив из функции. Т.е. мы даже не будем париться над тем, чтобы возвращать массив из функции, он мы просто изменим его внутри и потом будем так же работать с в нашей программе ним.
Если же, по каким-то причинам, мы не хотим, чтобы элементы массива внутри функции менялись, то нам нужно внутри функции сделать копию переданного массива и работать уже с этой копией. Не забывайте, при использовании динамических массивов убираться за собой в памяти.
1. Напишите функцию, которая сортирует массив методом пузырька и выводит отсортированный массив на экран. В этом варианте программы, сделайте так, чтобы изменения не коснулись исходного массива.
2. Напишите функцию, которая ищет максимальный элемент в массиве.
3. Напишите функцию, которая принимает два массива одинаковой длинны и поэлементно перемножает их. Результат работы она записывает в элементы первого массива. Т.е. буквально она должна вернуть результат свой работы в первом массиве.
В программе, НЕ В ФУНКЦИИ, выведите результат на экран.
Если мы передаем массивы
[2,5,6]
[1,4,2]
то в результате своей работы, программа должна вывести
2 20 12
Сегодня научимся передавать массив в функцию и возвращать массив из функции.
Прочитайте улучшенную версию этого урока "Передача аргументов в функцию".
В новой версии:
- Ещё более доступное объяснение
- Дополнительные материалы
- 12 задач на программирование с автоматической проверкой решения
Итак, начнем с первого пункта. Пусть нам необходимо передать массив в функцию и там его обработать. Ну допустим вывести его элементы на экран. Тут возможны два варианта.
1. У нас статический массив.
2. У нас динамический массив.
В зависимости от этого и нужно плясать.
Первый случай. Передача в функцию статического массива.
Для определенности будем передавать массив символов. Напишем функцию, которая принимает строку и выводит её на экран.
Листинг 18.1
void print_arr(char a[], int n){
for (int i=0; i<n; i++)
for (int i=0; i<n; i++)
printf("%c",a[i]);
printf("\n");
}
Давайте внимательно рассмотрим аргументы, которая эта функция принимает. Первый из них как раз и есть массив, который мы хотим передать. Как видите отличие от передачи обычной переменной лишь в том, что мы после имени пишем квадратные скобки. Именно они и указывают на то, что это не просто некая переменная а целый массив переменных данного типа.
В скобках, не нужно указывать размерность массива. С размерностью массива вообще все не так просто. Функции в Си не умеют самостоятельно определять размерность переданного им массива. Поэтому отдельным параметром нам необходимо передавать его размер. В нашей функции мы передаем размер массива с помощью переменной n.
Напишем самую простую программу, которая будет использовать эту функцию.
Листинг 18.2
#include <stdio.h>
#include <string.h>
void print_arr(char a[], int n){
for (int i=0; i<n;
i++)
printf("%c",a[i]);
printf("\n");
printf("\n");
}
int main(){
char arr[]="kirill";
int t=strlen(arr);
print_arr(arr,t);
return 0;
}
Обратите внимание, что передача массива в функцию в этом случае, по виду, ничем не отличается от передачи обычной переменной. Мы лишь указываем его имя и все. Это только на первый взгляд так кажется. Но об этом чуть позже.
Второй случай. Передача в функцию динамического массива.
Давайте решим такую задачу. имеется текстовый файл input.txt. Пусть в нем в первой строчке записано натуральное число N не превосходящее 100. А в следующих N строках записаны некоторые вещественные числа. Пусть мы хотим посчитать среднее арифметическое всех этих чисел и вывести.
Удобно для хранения чисел завести динамический массив. Хотя, на самом деле, в этой задаче мы могли бы просто читать числа из файла и сразу вычислять их среднее значение. Но как-то я не могу придумать пока более подходящего примера.
И так напишем требуемую программу.
Листинг 18.3
#include <stdio.h>
void sa_arr(float *a, int n){
double summ=0;
for (int i=0; i<n;
i++)
summ+=a[i];
printf("srednee arifmeticheskoe: %.2f\n",
summ/n);
}
int main(){
freopen("input.txt","r",stdin);
int N;
scanf("%d",&N);
float *arr = new (float [N]);
for (int i=0; i<N;
i++)
scanf("%f", &arr[i]);
sa_arr(arr,N);
delete []arr;
return 0;
}
Обратите внимание на аргументы функции. Как видите, если мы передаем динамический массив, то нам нужно явно указывать на то, что функция принимает указатель на первый элемент массива. В случае одномерного массива это не критично, и вы можете объявить аргументы как и в прошлый раз, т.е.
void sa_arr(float a[], int n)
но так делать не стоит. Приучайтесь сразу передавать динамические массивы таким образом.
Теперь вернемся к нашим отличиям а так же второму вопросу.
Если вы помните, то переменные в языке Си, при передаче их в функцию передаются по значению. То есть мы передаем не сами переменные, а только их значения. И если мы в функции будем их изменять, то настоящих переменных это никак не коснется. В нашей группе в вк, даже было небольшое задание на эту тему. Да и в уроке с указателями мы разбирали, как обойти это ограничение.
Основное отличие передачи массива в функцию в том, что массивы, в отличие от переменных всегда передаются по ссылке. Т.е. в функцию передается не копия массива, а сам массив. И если внутри функции мы будем как-то изменять массив, то эти изменения останутся и после того, как функция закончит свою работу.
Несколько изменим наше предыдущую программу. Изменим один из элементов внутри функции. И посмотрим, что будет с исходным массивом.
Листинг 18.4
#include <stdio.h>
void sa_arr(float *a, int n){
double summ=0;
for (int i=0; i<n;
i++)
summ+=a[i];
printf("srednee arifmeticheskoe: %.2f\n",
summ/n);
//изменим какой-нибудь элемент массива внтури функции
a[2]=43.2;
}
int main(){
freopen("D:\\input1.txt","r",stdin);
int N;
scanf("%d",&N);
float *arr = new (float [N]);
for (int i=0; i<N;
i++)
scanf("%f", &arr[i]);
//выводим массив
for (int i=0; i<N; i++)
printf("%f\t",arr[i]);
printf("\n");
sa_arr(arr,N);
// снова выводим массив на экран, после вызова функции
// внутри которой, мы изменили один
его элемент
for (int i=0; i<N; i++)
printf("%f\t",arr[i]);
printf("\n");
delete []arr;
return 0;
}
}
Результат работы программы на следующем рисунке.
Как видите, изменения массива внутри функции, затронуло и исходный массив.
Эту возможность следует использовать во благо. А именно для того, чтобы возвращать массив из функции. Т.е. мы даже не будем париться над тем, чтобы возвращать массив из функции, он мы просто изменим его внутри и потом будем так же работать с в нашей программе ним.
Если же, по каким-то причинам, мы не хотим, чтобы элементы массива внутри функции менялись, то нам нужно внутри функции сделать копию переданного массива и работать уже с этой копией. Не забывайте, при использовании динамических массивов убираться за собой в памяти.
Задание для практической работы:
1. Напишите функцию, которая сортирует массив методом пузырька и выводит отсортированный массив на экран. В этом варианте программы, сделайте так, чтобы изменения не коснулись исходного массива.
2. Напишите функцию, которая ищет максимальный элемент в массиве.
3. Напишите функцию, которая принимает два массива одинаковой длинны и поэлементно перемножает их. Результат работы она записывает в элементы первого массива. Т.е. буквально она должна вернуть результат свой работы в первом массиве.
В программе, НЕ В ФУНКЦИИ, выведите результат на экран.
Если мы передаем массивы
[2,5,6]
[1,4,2]
то в результате своей работы, программа должна вывести
2 20 12
Запутанные примеры:
ОтветитьУдалить#include"stdio.h"
#include"stdlib.h"
int *mem(int); //функция выделения памяти под массив
void input(int*,int); //функция ввода данных в массив
void show(int*,int); //функция вывода массива на экран
void main()
{
int *mas,rm;
printf("Vvedite razmer massiva\n");
scanf("%d",&rm);
mas=mem(rm);
printf("Vvod dannih v massiv\n");
input(mas,rm);
printf("Ishodnii massiv\n");
show(mas,rm);
printf("\n");
}
int *mem(int rm) //функция выделения памяти под массив
{
int *massiv;
massiv=(int*)calloc(rm,sizeof(int)); /*выделяем участок памяти под массив*/
return massiv;
}
void input(int *mas,int rm) //функция ввода данных в массив
{
for(int i=0;i<rm;i++)
scanf("%d",mas+i);
}
void show(int *mas,int rm) //функция вывода массива на экран
{
for(int i=0;i<rm;i++)
printf("%3d",*(mas+i));
}
(данный пример является шаблоном,к которому нас приводят)
А смысл шаблона в том,чтобы тело main практически было пустое...
Не мне судить,но мне воспринимается легче,когда сначала идет тело функции main ,а затем сами функции...
Хотя..не пытался въехать,так как сонный...
А сортировка где? А другие задания где? =)))
УдалитьЯ один этот урок не хера не понял ?
ОтветитьУдалитьА конкретнее? ))
УдалитьЗадание 1
ОтветитьУдалить//объявление массива неизвестной длинны
//сортировка методом пузырьков
#include ((stdio.h))
#include((iostream))
void metod_puz ( int a[],int n);
int main()
{
setlocale(LC_ALL,".1251");
int n,i=0;
printf("Ведите размерность массива \n");
scanf ("%d",&n);
printf("Введите элементы массива \n");
int *i_mass=new(int [n]);//объявляем массив неизвестной длинны
while(i0;i--){//метод пузырей
for (j=0;jb[j+1]){ // если порядок нарушен меняем j и j+1 элементы массива местами
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
printf("Отсортированный массив -\n");
for (i=0;i<n;i++) printf ("%d ", b[i]);// печать готового массива
printf("\n");
delete []b;
}
Что-то я не понял, что тут творится.
Удалитьчё то половина кода теряется но вроде всё работает...
ОтветитьУдалитьЗадание 2
ОтветитьУдалить//объявление 2-х массивов неизвестной длинны
//перемножение элементов
#include ((stdio.h>))
#include((iostream))
void vvod_mass ( int a[],int n);//ввод массивов
void proizved_mass(int a[],int n,int b[],int c);//переножение элементов
void pecat_mass(int a[],int n);//печать результата
int main()
{
setlocale(LC_ALL,".1251");//
int n,i=0;
printf("Ведите размерность массива \n");
scanf ("%d",&n);
printf("Введите элементы 1-го массива \n");
int *i_1mass=new(int [n]),*i_2mass=new(int [n]);//объявляем 2 массива неизвестной длинны
vvod_mass(i_1mass,n);//ввод 1-го массива
printf("Введите элементы 2-го массива \n");
vvod_mass(i_2mass,n);//ввод 2-го массива
proizved_mass(i_1mass,n,i_2mass,n);//перемножение элементов
printf("результат перемножения элементов 2-х массивов \n");
pecat_mass(i_1mass,n);//печать результата
delete []i_1mass;
delete []i_2mass;
return(0);
}
void vvod_mass ( int a[],int n)
{
int i=0;
while(i<n){
printf ("\n%d-й элемент =",(++i));
scanf ("%d",&a[i-1]);
}
printf ("\n");
}
void proizved_mass(int a[],int n,int b[],int c)//35
{
int i=0;
while(i<n){a[i]*=b[i];i++;}
}
void pecat_mass(int a[],int n)
{
printf ("\n");
int i;
for (i=0;i<n;i++) printf ("%d ", a[i]);// печать готового массива
printf("\n");
}
Плохо отображается. Я думаю вы всё проверили самостоятельно. Если работает, то отлично. Если хотите, чтобы я посмотрел, залейте код на сервис http://pastebin.com/ Если будете заливать, то выберите там подсветку синтаксиса для С. ЧТобы удобнее было смотреть. )))
Удалитьошибся чуть-чуть это было 3-е задание
ОтветитьУдалить#include "stdio.h"
ОтветитьУдалить#include "stdlib.h"
void puz(int *arr_1, int N)
{
for( int i = 0; i < N - 1; i++)
{
for( int j = 0; j < N; j++)
{
if(arr_1[j] > arr_1[j + 1])
{
int temp = arr_1[j];
arr_1[j] = arr_1[j + 1];
arr_1[j + 1] = temp;
}
}
}
for(int i = 0; i < N; i++)
{
printf("%d ", arr_1[i]);
}
printf("\n");
}
int main(){
int f;
int N;
printf("kolv-o elementov?\n");
scanf("%d", &N);
int arr_1[N];
int *arr = malloc(sizeof(int) * N);
for(int i = 0; i < N; i++)
{
printf("zadaem elementi massiva\n");
scanf("%d", &f);
arr[i] = f;
arr_1[i] = arr[i];
}
puz(arr_1, N);
free(arr);
return 0;
}
http://pastebin.com/Etn8x6g4
Удалитьтут нагляднее, вроде все работает нормально.
получается я выделяю место для arr[] потом просто копирую из него arr_1[], но под него мне места бронировать не нужно уже?
Очень странно, что у вас этот код работает. Хотя бы из-за этих строчек:
Удалитьint N;
printf("kolv-o elementov?\n");
scanf("%d", &N);
int arr_1[N];
Нельзя просто так считать переменную, и создать массив такой размерности. =)))
Хм, хорошая идея для мема. =)))
Так что неправильно. Нужно считать размерность, сделать динамический массив. Передать его в функцию, там сделать его копию и отсортировать её.
И еще замечание. Не нужно дублировать код здесь, достаточно ссылки на pastebin. Мне нравится, что вы оформляете свой код с отступами, мне так удобно проверять. И еще, используя сервис, пишите библиотеки с угловыми скобками, там на это запрета нет. )
http://pastebin.ru/tKyn60V9
Удалитьну как? жду с нетерпением
Еще раз спасибо)
Все та же ошибка, только теперь внутри функции. А вы свои программы не запускаете, прежде чем отправлять мне? Она же не компилируется. =)
Удалитьзадание 2
ОтветитьУдалитьhttp://pastebin.com/Hs3cHMcd
#include "stdio.h"
#include "stdlib.h"
void maximus( int *arr, int N)
{
int max = 0;
for(int i = 0; i < N; i++)
{
if(arr[i] > max)
max = arr[i];
}
printf("max is %d\n", max);
}
int main()
{
int f;
int n;
printf("vvedite kolvo 4lenov\n");
scanf("%d", &n);
int *arr = malloc(sizeof(int) * n);
printf("zapolnyaem massiv\n");
for(int i = 0; i < n; i++)
{
scanf("%d", &f);
arr[i] = f;
}
maximus(arr, n);
free(arr);
return 0;
}
int *arr = malloc(sizeof(int) * n);
УдалитьВот так делать нельзя. Это не должно работать. Функция malloc возвращает указатель на void. Необходимо явное преобразование типов.
http://pastebin.ru/GpBQvnVx
Удалитьнаш ответ Чемберлену!=) Еще раз и очередной раз спасибо, что возюкаетесь в нашем ***коде)
А что если я ввожу
Удалить3
-2
-3
-1
Ответ должен быть -1, а выводит нуль. =) Дописывайте/переписывайте.
задание 3
ОтветитьУдалитьhttp://pastebin.com/zb8nQW0R
#include "stdio.h"
#include "stdlib.h"
void maximus( int *arr, int *arr_1, int N)
{
for( int i = 0; i < N; i++)
{
arr[i] = arr[i] * arr_1[i];
}
}
int main()
{
int n;
int f;
int f_1;
printf("vvedite kolv-o elementov massiva\n");
scanf("%d", &n);
int *arr = malloc(sizeof(int) * n);
int *arr_1 = malloc(sizeof(int) * n);
for(int i = 0; i < n; i++)
{
scanf("%d", &f);
arr[i] = f;
printf("pervii arr_%d - %d, \n", i, arr[i]);
scanf("%d", &f_1);
arr_1[i] = f_1;
printf("vtoroi arr_1_%d - %d, \n", i, arr_1[i]);
}
maximus(arr, arr_1, n);
for(int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
free(arr);
free(arr_1);
return 0;
}
Вы совсем не соблюдаете формат входных данных.
УдалитьОпять же ошибка с выделением памяти. И обычно сначала предупреждают, что нужно ввести, а потом считывают данные. А не наоборот. =))
http://pastebin.ru/Gh3hBY2V
Удалитьесли не правильно, то не могли бы вы поконкретнее сказать что не так. хочу сразу научиться писать правильно. И большое вам спасибо)
Работает вроде верно.
УдалитьЯ хотел бы, чтобы эта программа работала так.
Сначала я ввожу число N - размерность массива.
Потом ввожу последовательно N элементов первого массива.
Затем, ввожу N элементов второго массива.
Потом программа выдает ответ.
Окошко программы должно вот так выглядеть после выполнения программы
3
2 5 10
1 2 3
2 10 30
Без всяких лишних слов и прочего.
http://pastebin.ru/IaPYkcXw
ОтветитьУдалить3 задание
вру, задание 2
УдалитьВсе три задания:
ОтветитьУдалитьhttp://pastebin.ru/9dA9a0Dq
Нет, не работает. =)
ОтветитьУдалитьможет так?
ОтветитьУдалитьhttp://pastebin.com/embed_iframe.php?i=S9Wtshvp
Первая нет.
ОтветитьУдалитьВторая тоже нет.
Не правильно выделяете память в обоих случаях. Используйте массив int-ов.
вроде бы элементароно
ОтветитьУдалить//Задание 1
#include
#include
#include
using namespace std;
void sort(int *arr,int koll)
{
____int temp;
____for(int a=0;aarr[i+1])
____________{
________________temp=arr[i];
________________arr[i]=arr[i+1];
________________arr[i+1]=temp;
____________}
________}
____}
____for (int x=0; x<koll; x++)
____{
________cout<<"Znachenie massiva "<<x<<" = "<<arr[x]<<endl;
____}
____cout<<endl;
}
int main()
{
____srand(time(0));
____int n=rand()%20+1;
____int *massiv = new(int [n]);
____for (int i=0; i<n; i++)
____{
________massiv[i]=rand()%100+1;
____}
____sort(massiv,n);
____for (int a_m=0;a_m<n; a_m++)
____{
________cout<<"Znachenia massiva "<<a_m<<" = "<<massiv[a_m]<<endl;
____}
____delete []massiv;
____return 0;
}
Хотя функции я и использовал ранее(те которые сам пишу....), но я только сейчас понял что посути то что создаю я для компа почти не отличается от тех что в стандартных библиотеках заданны, то есть
по сути тот же ctrlen() или strcmp() я могу написать сам, но с другим названием....
при чём принимаемые параметры задаю тоже я ..... Что будет если я свою функцию назову например srand()???
ладно это чисто риторический вопрос..... когда ты будешь готов ответить я ответ уже буду знать давно....
Создай урок про классы лучше
а ещё лучше про графические библиотеки расскажи.....
я не комментирую код...... смотри на имена переменных вся подноготная ясна станет
Удалитьdelete только созданные через указатель удаляет.... с этим разобрался
Удалить//Задание 2 мне кажеться я такое мог написать уроков цать назад, сразу как функции проходили.... и не очень понимаю зачем мне отягощать код всякими функциями. Есля я могу этот квест выполнить в 15 строк
ОтветитьУдалить#include
#include
#include
using namespace std;
void poisk(int *arr, int n)
{
int temp=0, tmp, i;
for (i=0;itemp)
{
temp=arr[i];
tmp=i;
}
}
cout<<"Znachenie bolhe y "<temp)
________{
____________temp=arr[i];
____________tmp=i;
________}
____}
____cout<<"Znachenie bolhe y "<<tmp+1<<" elementa massiva, i ravno\n"<<temp<<endl;
____for(int a=0;a<n;a++)
____{
________cout<<"Element "<<a+1<<" ="<<arr[a]<<endl;
____}
}
int main()
{
____srand(time(0));
____int n_m=rand()%30+1;
____int *mass = new(int [n_m]);
____for(int i=0; i<n_m;i++)
____{
________mass[i]=rand()%100-50;
____}
____poisk(mass,n_m);
____return 0;
}// наверное не в 15 строк а в 20
спать хочу.... 3 задание фигня, завтра напишу...... заголовочные файлы по идее будет интересный урок.... а двумерные..... хоть 4 мерные массивы ещё как массивы одномерные изучал изучил.... хм создам 3 задание в 2мерном массиве) одном
ОтветитьУдалитьint n=rand()%20+1;
Удалитьint *mass = new(int [2][n]);
и так далее
хм работать должно было.... странно щас перепишу но пока вот...
ОтветитьУдалить//Задание 3
#include
#include
#include
using namespace std;
void mult(int **arr,int m,int n)
{
____for (int i=0; i<n; i++)
____{
________arr[0][n]*=arr[1][n];
____}
}
int main()
{
____srand(time(0));
____int m=2, n=5;
____int **mass = (new int* [m]);
____for (int i=0; i<m; i++)
____{
________mass[i] = new (int [n]);
________for (int j=0; j<n; j++)
________{
____________mass[m][n]=rand()%10+1;
________}
____}
____mult(mass,m,n);
____for(int i=0; i<n; i++)
____{
________cout<<"Element "<<n+1<<" ="<<mass[0][i]<<endl;
____}
____return 0;
}
хм а вот сейчас я смогу осуществить идею, и даже лучше
Удалить//двумерный массив перемножение в функции вывод в майне
#include iostream
#include stdlib.h
#include ctime
using namespace std;
void mult(int **arr,int *n,int *m)
{
____for(int i=0; i<*m; i++)
____{
________arr[*n-2][i]*=arr[*n-1][i];
____}
}
int main()
{
____srand(time(NULL));
____//создание
____int *n=new int;
____*n=2;//столбцы для наглядности
____int *m=new int;
____*m=5;//строки
____int **mass=new int*[*n];
____for(int i=0;i<*n;i++)
____{
________mass[i]=new int[*m];
____}
____//заполенение
____for (int i=0; i<*n; i++)
____{
________for (int ii=0; ii<*m; ii++)
________{
____________mass[i][ii]=rand()%10+1;
________}
____}
____for(int i=0; i<*m;i++)
____{
________cout<<"mass[0]["<<i<<"]"<<mass[0][i]<<"\t mass[1]["<<i<<"]"<<mass[1][i]<<endl;
____}
____//функция
____mult(mass,n,m);
____//вывод
____cout<<endl;//ну вы поняли зачем
____for(int i=0; i<*m;i++)
____{
________cout<<"Mass[0]["<<i<<"]="<<mass[0][i]<<endl;
____}
____//освобождение
____for(int i=0;i<*n;i++)
____{
________delete[] mass[i];
____}
____delete[] mass;
____delete n;
____delete m;
____return 0;
}
да это c++
Удалитьтут на самом деле параметр в функции лишний "n" который я его мог просто заменить на 0 и 1. работает только в данном случае, а случай весьма спецефический, выглядит нелепо
Удалитьне работало из за этого
Удалить_mass[i] = new (int [n]);
_mass[i] = new (int *[n]);//ljk;yj ,должно быть так
не работало из за этого
Удалить_mass[i] = new (int [n]);
_mass[i] = new (int *[n]);//ljk;yj ,должно быть так
Работающее решение
ОтветитьУдалить//Задание 3
#include 'iostream"
#include 'stdlib.h"
#include 'time.h"
using namespace std;
void mult(int* arr1, int* arr2,int n)
{
____for (int i=0; i<n; i++)
____{
________arr1[i]*=arr2[i];
____}
}
int main()
{
____srand(time(0));
____int n=rand()%10+1;
____int* mass1=new(int [n]);
____int* mass2=new(int [n]);
____for(int i=0; i<n; i++)
____{
________mass1[i]=rand()%10+1;
________mass2[i]=rand()%10+1;
____}
____for(int i=0; i<n; i++)
____{
________cout<<"EM1 "<<i+1<<" ="<<mass1[i]<<"\t EM2 "<<i+1<<" ="<<mass2[i]<<endl;
____}
____mult(mass1, mass2, n);
____for(int i=0; i<n; i++)
____{
________cout<<"Element "<<i+1<<" ="<<mass1[i]<<endl;
____}
____return 0;
}
delete mass1, mass2;
Удалитьreturn 0;
}
Этот комментарий был удален автором.
ОтветитьУдалить