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

Функции ввода и вывода массива

24.12.2018, 20:03. Просмотров 1914. Ответов 24

Помогите
Хочу сделать ввод и вывод используя функций
Не компилируется(
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
42
#include <iostream>
 
using namespace std;
int input (int *arr, int size)
{
        cout<<"Введите размер масива: ";
        cin>>size;
        int arr[size];
        for (int i=0;i<size;i++ )
        {
                cout<<"Введите число №"<<i+1<<"-> ";
                cin>>arr[i];
                cout<<endl;
        }
        return *arr;
}
 
int main()
{
setlocale(LC_ALL, "Russian");
        /*int size;
        cout<<"Введите размер масива: ";
        cin>>size;
        int  *arr=new int[size];
        for (int i=0;i<size;i++ )
        {
                cout<<"Введите число №"<<i+1<<"-> ";
                cin>>arr[i];
                cout<<endl;
        }
*/
        int n;
        int *mas = new int[n];
        cout << input(int *mas, int n);
        for (int i=n-1;i>=0;i-- )
        {
 
                cout<<mas[i]<<endl;
 
        }
    return 0;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2018, 20:03
Ответы с готовыми решениями:

Как описать функции ввода и вывода двумерного массива?
Не могу разобраться с описанием функций ввода и вывода двумерного массива, прошу помочь пожалуйста.

Функции ввода и вывода массива произвольного типа через void
Функции ввода и вывода массива произвольного типа через void нету разницы какие данные главное...

Одномерный массив и функции (сделать 3 функции ввода/решения/вывода)
Ребята помогите, хоть убейте не могу эту задачу с помощью функций сделать!( Нужно сделать 3 функции...

Добавить в код любые пользовательские функции (лучше всего - функции ввода/вывода)
Ребят, прошу вас помочь добавить любые две функции, лучше всего если ввод и вывод, но например и за...

Функции ввода вывода структуры
Функция вывода показывает мусор, объясните пожалуйста почему? struct Inf { char name; ...

24
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
24.12.2018, 20:31 2
Андрей732, почему не воспользовались
Образцы (шаблоны) программ для типовых задач
там все это есть
0
Button123
-41 / 13 / 12
Регистрация: 20.03.2017
Сообщений: 182
24.12.2018, 20:31 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
34
35
36
37
38
39
#include <iostream>
using namespace std;
 
int input (int *arr, int size) // Функция ввода
{
        for (int i=0;i<size;i++ )
        {
                cout<<"Введите число №"<<i+1<<"-> ";
                cin>>arr[i];
                cout<<endl;
        }
        return *arr;
}
 
void out1 (int *arr, int n) // Функция вывода
{
   for (int i=n-1; i>=0; i--)
        {
                cout<<arr[i]<<endl;
        }      
}
 
 
 
int main()
{
        setlocale(LC_ALL, "Russian");
 
        cout << "Введите размер массива: " << endl;
        int n = 0;
        cin >> n; // Задаем размер массива
        int *mas = new int[n];
 
        input(mas,n); // Функция ввода 
        out1(mas,n); // Функция вывода
 
    system("pause");
    return 0;
}
1
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
24.12.2018, 20:53 4
Лучший ответ Сообщение было отмечено Андрей732 как решение

Решение

Button123, где удаляется выделенная память?
и что за глубокий смысл в том, что в функции input Вы возвращаете значение нулевого элемента массива arr?
Я понимаю, если бы Вы выделяли память в этой функции:
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
#include <iostream>
using namespace std;
 
int* input (int size) // Функция ввода
{
    int *arr=new int[size];
    for (int i=0;i<size;i++ )
    {
          cout<<"Введите число №"<<i+1<<"-> ";
          cin>>arr[i];
    }
    return arr;
}
 
void out1 (int *arr, int n) // Функция вывода
{
    for (int i=n-1; i>=0; i--)
       cout<<arr[i]<<endl;
}
 
int main()
{
   setlocale(LC_ALL, "Russian");
 
   cout << "Введите размер массива: " << endl;
   int n = 0;
   cin >> n; // Задаем размер массива
   int* mas =  input(n); // Функция ввода
   out1(mas,n); // Функция вывода
   delete[] mas;
 
   system("pause");
   return 0;
}
1
24.12.2018, 20:53
Yetty
2580 / 1813 / 1199
Регистрация: 18.12.2017
Сообщений: 5,830
24.12.2018, 22:00 5
Цитата Сообщение от zss Посмотреть сообщение
что за глубокий смысл в том...
так возвращается массив из функции (через указатель). что здесь не так?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
25.12.2018, 08:11 6
Цитата Сообщение от Yetty Посмотреть сообщение
через указатель
Там возвращается значение:
Цитата Сообщение от Button123 Посмотреть сообщение
int input (int*....
0
Yetty
2580 / 1813 / 1199
Регистрация: 18.12.2017
Сообщений: 5,830
25.12.2018, 13:30 7
Цитата Сообщение от zss Посмотреть сообщение
Там возвращается значение:
разве это
Цитата Сообщение от Button123 Посмотреть сообщение
return *arr;
значение ?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
25.12.2018, 13:39 8
arr - это указатель,
*arr - его разыменовываем
и возвращаем значение: int input (...
Можете в отладчике убедиться, что вызывается копиконструктор.
0
Yetty
2580 / 1813 / 1199
Регистрация: 18.12.2017
Сообщений: 5,830
25.12.2018, 14:41 9
Цитата Сообщение от zss Посмотреть сообщение
arr - это указатель,
*arr - его разыменовываем
это всё понятно. вопрос в следующем: Вы считаете, что вариант Button123 неправильный и возвращать массив как делает он нельзя ? если нельзя, то почему (ведь его программа работает)
0
Button123
-41 / 13 / 12
Регистрация: 20.03.2017
Сообщений: 182
25.12.2018, 16:15 10
Цитата Сообщение от zss Посмотреть сообщение
где удаляется выделенная память?
и что за глубокий смысл в том, что в функции input Вы возвращаете значение нулевого элемента массива arr?
Я понимаю, если бы Вы выделяли память в этой функции:
Ошибки понял, только можете мне пояснить в какой функции нужно было выделять память?
Цитата Сообщение от zss Посмотреть сообщение
int* mas = *input(n); // Функция ввода
Так правильно?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
25.12.2018, 18:50 11
Button123, У меня перед input звездочки не было.
Это Ваши инсинуации
Цитата Сообщение от Button123 Посмотреть сообщение
в какой функции нужно было выделять память?
Это на Ваш вкус.
Можете создать отдельную функцию для этого,
как сделано в образце:
Образцы (шаблоны) программ для типовых задач

Добавлено через 3 минуты
Цитата Сообщение от Yetty Посмотреть сообщение
возвращать массив как делает он нельзя
Можно возвращать адрес начала массива,
так, как сделал я в вышеприведенном примере.
А понятие массива, как сущности при передаче в функцию теряется,
остается только адрес первого элемента.
0
Yetty
2580 / 1813 / 1199
Регистрация: 18.12.2017
Сообщений: 5,830
25.12.2018, 21:47 12
Цитата Сообщение от zss Посмотреть сообщение
как сделал я в вышеприведенном примере
Ваш вариант я вижу. Интересует вариант Button123. Вот так:
Цитата Сообщение от Button123 Посмотреть сообщение
int input (int *arr, int size) // Функция ввода
{
for (int i=0;i<size;i++ )
{
cout<<"Введите число №"<<i+1<<"-> ";
cin>>arr[i];
cout<<endl;
}
return *arr;
}
можно возвращать ?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
26.12.2018, 07:30 13
я же написал - возвратиться значение 0 элемента массива.
0
Yetty
2580 / 1813 / 1199
Регистрация: 18.12.2017
Сообщений: 5,830
26.12.2018, 13:30 14
Цитата Сообщение от zss Посмотреть сообщение
я же написал - возвратиться значение 0 элемента массива.
это так. но ведь таким же способом указатель и передаётся в функцию:
Цитата Сообщение от Button123 Посмотреть сообщение
int input (int *arr, int size)
почему бы так и не возвращать:
Цитата Сообщение от Button123 Посмотреть сообщение
return *arr;
например:
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
#include <iostream> 
using namespace std;
 
int input (int *arr, int n)
{        
    for (int i = 0; i < n; i++)                
        arr[i]=random()%9+1;        
    return *arr;
}
 
int main()
{
        int n;
        cout<<"n="; cin>>n;
        
        int *arr=new int[n];
        
        input (arr,n);        
        
        for (int i = 0; i < n; i++ )
        cout<<arr[i]<<" ";
        cout<<"\n";
  system("pause");
  return 0;
}
почему Вы считаете это неправильным, если программа работает ?
похоже, что возврат *arr кроме возврата значения первого элемента возвращает (неявно) значение указателя, но я в этом не уверен и хотел спросить Ваше мнение по этому поводу.
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
26.12.2018, 13:40 15
Цитата Сообщение от Yetty Посмотреть сообщение
возвращает (неявно) значение указателя
Не возвращает.
Можете все это проверить в отладчике.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
using namespace std;
 
int input (int *arr, int n)
{        
    arr=new int[n];
    for (int i = 0; i < n; i++)                
        arr[i]=random()%9+1;        
    return *arr;
}
 
int main()
{
        int n;
        cout<<"n="; cin>>n;
        int* arr2=NULL;    
        int k=input (arr2,n);        
        // тут переменная arr2 не изменилась
        cout<<k; // вывод arr[0]
        return 0;
}
0
valen10
Параллельный Кот
1264 / 532 / 211
Регистрация: 25.03.2016
Сообщений: 1,186
Завершенные тесты: 1
26.12.2018, 13:46 16
Yetty, работает, потому что возвращаемое значение не присваивается обратно указателю на массив. И return *arr; происходит по значению, которое может быть передано как угодно, в том числе через регистр (зависит от ABI). Получить адрес возвращаемого значения в таком случае уже не получится.
0
Yetty
2580 / 1813 / 1199
Регистрация: 18.12.2017
Сообщений: 5,830
26.12.2018, 13:49 17
Цитата Сообщение от zss Посмотреть сообщение
Не возвращает.
хорошо, не возвращает. почему тогда программа (мой пост перед этим) работает - выводит сформированный в функции массив на печать?
если возвращается значение только первого элемента - как получается, что выводится весь сформированный массив ?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
26.12.2018, 14:12 18
У Вас память выделяется в main.
В функцию Вы передаете ЗНАЧЕНИЕ адреса массива (т.е. копию содержимого переменной arr).
Используя этот адрес функция корректно обращается к элементам массива.

Иначе обстоит дело, если память выделяется в функции (именно потому, что передается копия).
Адрес выделенной памяти записывается в эту копию, а не в фактический параметр.

Можно передать arr по ссылке, тогда тоже все будет корректно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
using namespace std;
 
void input (int* &arr, int n)
{        
    arr=new int[n];
    for (int i = 0; i < n; i++)                
        arr[i]=random()%9+1;        
    return *arr;
}
 
int main()
{
        int n;
        cout<<"n="; cin>>n;
        int* arr2=NULL;    
        input (arr2,n);        
        // переменная arr была синонимом переменной arr2 
        cout<<arr2[0]; // вывод arr[0]
        return 0;
}
0
Yetty
2580 / 1813 / 1199
Регистрация: 18.12.2017
Сообщений: 5,830
26.12.2018, 14:31 19
zss, не могу получить от Вас ответа на конкретный вопрос:
так:
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
#include <iostream> 
using namespace std;
 
int input (int *arr, int n)
{        
    for (int i = 0; i < n; i++)                
        arr[i]=random()%9+1;        
    return *arr;
}
 
int main()
{
        int n;
        cout<<"n="; cin>>n;
        
        int *arr=new int[n];
        
        input (arr,n);        
        
        for (int i = 0; i < n; i++ )
        cout<<arr[i]<<" ";
        cout<<"\n";
  system("pause");
  return 0;
}
записывать можно или нельзя ?
0
zss
Модератор
Эксперт С++
8600 / 7557 / 4677
Регистрация: 18.12.2011
Сообщений: 20,030
Завершенные тесты: 1
26.12.2018, 14:33 20
Я же ответил, что ДА:
Цитата Сообщение от zss Посмотреть сообщение
Используя этот адрес функция корректно обращается к элементам массива.
0
26.12.2018, 14:33
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.12.2018, 14:33

Задача на функции ввода-вывода
Мне дали разработать программу, но я не понимаю как. Вот условие: В бинарном файле находятся...

Функции потокового ввода/вывода
Подскажите, пожалуйста, чем отличается fwrite/fread от fprintf/fscanf?

Функции ввода/вывода printf(), scanf().
Составить программу для форматированного ввода и вывода данных заданного типа: Тип1=unsigned int;...


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

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

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