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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
#1

Указатели и одномерный массив - C++

03.03.2010, 21:04. Просмотров 1544. Ответов 19
Метки нет (Все метки)

Нужно создать одномерный массив целых чисел. Причем размерность массива должна храниться в файле с разрешением .txt (насколько я поняла это надо сделать с помощью указателя). Нужно чтобы было возможно удалять числа из конца массива, а после измененный массив сохранять в другом файле с разрешением .txt
Если можете помогите... и объясните пожалуйста... я примерно алгоритм понимаю, но сформировать всё не могу...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gemor
161 / 22 / 3
Регистрация: 05.02.2010
Сообщений: 207
03.03.2010, 21:10     Указатели и одномерный массив #2
вот когда-то писал матрицы при помощи указателей, может разберешься сама, а как писать в файл ищи в гугле
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
#include <iostream.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int **pmat; int *pv; int *pvn, *max;  // объявление указателей на массивы
    int R; // размерность матрицы и векторов
    cout<<"Vvedite razmernost' matricy: "<<endl; // предлагаем ввести пользователю размерность
    cin>>R; // присваиваем переменной R размерность
    pmat = new int *[R];  // создаём массив указателей
    max = new int[R];   //указатель на массив элементов
    for (int i = 0; i < R; i++)
    {
        *(max + i) = 0; //обнуляем массив, нужен для нахождения максимального элемента строки матрицы
    }
    for (int i = 0; i < R; i++)
    {
        *(pmat + i) = new int[R]; //создаём матрицу указателей
    }
    pv = new int[R]; pvn = new int[R];  //вектор, указанный пользователем, и получившийся в результате умножения новый вектор
    randomize(); //чтобы числа в функции random не повторялись
    for (int i = 0; i < R; i++)  // цикл по строкам
    {
        for (int j = 0; j < R; j++) //цикл по столбцам
        {
            *(*(pmat + i) + j) = random(9); //не предлагаем ввести пользователю элементы матрицы, а заполняем случайными числами 0..9
            if (*(*(pmat + i) + j) > *(max + i))
            {
                *(max + i) = *(*(pmat + i) + j); //находим максимальный элемент строки матрицы
            }
        }
        *(pv + i) = random(9);
        *(pvn + i) = *(pv + i) * *(max + i);
        cout<<*(pvn + i)<<" ";
    }
    delete[] pmat, pv, pvn, max; //удаляем объекты
    return 0;
}
ISergey
Maniac
Эксперт С++
1346 / 879 / 51
Регистрация: 02.01.2009
Сообщений: 2,643
Записей в блоге: 1
03.03.2010, 21:19     Указатели и одномерный массив #3
Цитата Сообщение от Gemor
C++
1
*(*(pmat + i) + j)
Изверг... не проще ли так..
C++
1
 pmat[i][j]
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
03.03.2010, 21:22  [ТС]     Указатели и одномерный массив #4
Но тут мы предлагаем ввести размерность с клавиатуры... а как взять её из файла с разрешением .txt?
И если можно на язык С, а то С++ я вообще не знаю...
Gemor
161 / 22 / 3
Регистрация: 05.02.2010
Сообщений: 207
03.03.2010, 21:27     Указатели и одномерный массив #5
а так страшнее )))

а насчет чтения из файла, я ж говорю погуглите (ну поищи на google.ru, yandex.ru и т.п. введи там чтение файла на C)
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
03.03.2010, 21:48  [ТС]     Указатели и одномерный массив #6
да)) точно страшнее)) ведь мало что понятно... не можете на С передалать? или это наверное долго...
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.03.2010, 22:02     Указатели и одномерный массив #7
Panda91,
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
#include <stdio.h>
#include <stdlib.h>
 
void FillRandom(int* arr, int size)
{
  int i;
 
  for(i = 0; i < size; ++i)
    arr[i] = rand();
}
 
void Show(int* arr, int size)
{
  int i;
 
  for(i = 0; i < size; ++i)
    printf("%d ", arr[i]);
 
  printf("\n");
}
 
int main()
{
  int   size;
  int*  arr  = NULL;
  FILE* file = fopen("input.txt", "r");
 
  fscanf(file, "%d", &size);
 
  arr = (int*)malloc(size * sizeof(int));
 
  FillRandom(arr, size);
  Show      (arr, size);
 
  return 0;
}
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
03.03.2010, 22:07  [ТС]     Указатели и одномерный массив #8
Ну теперь буду разбираться)))
Gemor
161 / 22 / 3
Регистрация: 05.02.2010
Сообщений: 207
03.03.2010, 22:13     Указатели и одномерный массив #9
тебе не всё написали панда (чуть не написал падла))

там нет возможности удалять числа из конца массива, нет возможности сохранять в файл
только создание массива с размерностью из текстового файла и показ его на консольке
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.03.2010, 22:16     Указатели и одномерный массив #10
Panda91, функция сохранения массива в файл output.txt:
C
1
2
3
4
5
6
7
8
void Save(int* arr, int size)
{
  FILE* file = fopen("output.txt", "w");
 
  int i;
  for(i = 0; i < size; ++i)
    fprintf(file, "%d ", arr[i]);
}
А что подразумевается под удалением элементов с конца массива?
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
03.03.2010, 22:50  [ТС]     Указатели и одномерный массив #11
Ну к примеру массив состоит из десяти элементов... а функция удаления элементов позволит удалить последний элемент... один или несколько... на сколько я понимаю если происходит удаление нескольких элементов то просто повторо несколько раз удаления одного элемента... вроде так...
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
04.03.2010, 09:58  [ТС]     Указатели и одномерный массив #12
Gemor, ну мне как раз самое сложное создание массива с размерностью из текстового файла... с сохранением в другой файл я почти разобралась, а удаление... у меня есть на эту тему похожая лаба...
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.03.2010, 14:34     Указатели и одномерный массив #13
Panda91, по поводу удаления, как вариант, можно просто скопировать элементы, не предназначенные для удаления в новый массив меньшего размера.
Например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Функция удаления n элементов массива arr размера size
// Возвращает новый массив размера size-n
int* Delete(int* arr, int size, int n)
{
  int* result = new int[size - n];
 
  for(int i = size - n - 1; i >=0; --i)
    result[i] = arr[i];
 
  delete [] arr;
 
  return result;
}
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
04.03.2010, 22:14  [ТС]     Указатели и одномерный массив #14
CyBOSSeR, хм логично... надо попробовать...
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
09.03.2010, 19:34  [ТС]     Указатели и одномерный массив #15
CyBOSSeR, вот по поводу удаления элементов... что-то я не поняла где это n, то есть количество удаляемых элементов, вводится...

Добавлено через 14 минут
Вот текст получившейся проги... я создала пару текстовых документов... в одном из них указала размерность массива... и еще добавила что n задается пользователем с клавиатуры... но выдает всё равно ошибку...

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
43
44
45
46
47
48
49
#include "stdafx.h"
#include <stdlib.h>
 
void FillRandom(int* arr, int size)
{
  int i;
  for(i = 0; i < size; ++i)
    arr[i] = rand();
}
void Show(int* arr, int size)
{
  int i;
  for(i = 0; i < size; ++i)
  printf("%d ", arr[i]);
  printf("\n");
}
int* Delete(int* arr, int size, int n)
{
  int n;
  printf("Vvedite kolichestvo ydalyaemih elementov n=%d", n );
  scanf ("%d", &n);
  int* result = new int[size - n];
  for(int i = size - n - 1; i >=0; --i)
    result[i] = arr[i];
  delete [] arr;
  printf("\n");
  return result;
}
void Save(int* arr, int size)
{
  FILE* file = fopen("output.txt", "w");
  int i;
  for(i = 0; i < size; ++i)
    fprintf(file, "%d ", arr[i]);
}
int main()
{
  int   size;
  int n;
  int*  arr  = NULL;
  FILE* file = fopen("input.txt", "r");
  fscanf(file, "%d", &size);
  arr = (int*)malloc(size * sizeof(int));
  FillRandom(arr, size);
  Show (arr, size);
  Delete (arr, size, n);
  Save (arr, size);
  return 0;
}
Добавлено через 23 часа 10 минут
Что же тут надо исправить??
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
10.03.2010, 18:13  [ТС]     Указатели и одномерный массив #16
не получается сохранять измененный массив.... он почему то сохраняется в первоначальном виде...
и оказалось что надо удалять всего один элемент с конца массива... ну в этом я разберусь... но что с сохранением?
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.03.2010, 17:24     Указатели и одномерный массив #17
Panda91, вот функции сохранения и записи массива в файл:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <fstream>
#include <iostream>
 
// Результат операции с файлом
enum FileOperationResult {
  forSuccess   ,  // Операция завершена успешно
  forOpenError ,  // Ошибка открытия
  forReadError ,  // Ошибка чтения
  forWriteError,  // Ошибка записи
};
 
FileOperationResult LoadArray(int** p_arr, int* p_size)
{
  std::ifstream file("file.txt");
 
  if (!file)
    return forOpenError;
 
  int size;
 
  if (!(file >> size))
    return forReadError;
 
  int* arr = new int[size];
 
  for (int i = 0; i < size; ++i)
    if (!(file >> arr[i]))
      return forReadError;
 
  *p_arr  = arr;
  *p_size = size;
 
  return forSuccess;
}
 
FileOperationResult SaveArray(const int* arr, int size)
{
  std::ofstream file("file.txt");
 
  if (!file)
    return forOpenError;
 
  if (!(file << size << std::endl))
    return forWriteError;
 
  for (int i = 0; i < size; ++i)
    if (!(file << arr[i] << " "))
      return forWriteError;
 
  return forSuccess;
}
 
int main()
{
  setlocale(LC_ALL, "Russian");
 
  const int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  const int size1  = sizeof(arr1) / sizeof(arr1[0]);
 
  switch (SaveArray(arr1, size1)) {
    case forSuccess:
      std::cout << "Сохранение прошло успешно." << std::endl;
      break;
 
    case forOpenError:
      std::cout << "Не удалось открыть файл для записи." << std::endl;
      return 0;
 
    case forWriteError:
      std::cout << "Ошибка записи." << std::endl;
      return 0;
  }
 
  int* arr2  = 0;
  int  size2 = 0;
 
  switch (LoadArray(&arr2, &size2)) {
    case forSuccess:
      std::cout << "Загрузка прошла успешно." << std::endl;
      break;
 
    case forOpenError:
      std::cout << "Не удалось открыть файл для чтения." << std::endl;
      return 0;
 
    case forReadError:
      std::cout << "Ошибка чтения." << std::endl;
      return 0;
  }
 
  for(int i = 0; i < size2; ++i)
    std::cout << arr2[i] << " ";
 
  std::cout << std::endl;
 
  delete [] arr2;
 
  return 0;
}
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
12.03.2010, 23:27  [ТС]     Указатели и одномерный массив #18
А на языке Си? или это сложно переделать?
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 08:33     Указатели и одномерный массив #19
Цитата Сообщение от Panda91 Посмотреть сообщение
А на языке Си?
Panda91, проверь:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <stdlib.h>
 
// Результат операции с файлом
enum FileOperationResult {
  forSuccess   ,  // Операция завершена успешно
  forOpenError ,  // Ошибка открытия
  forReadError ,  // Ошибка чтения
  forWriteError,  // Ошибка записи
};
 
FileOperationResult LoadArray(int** p_arr, int* p_size)
{
  int*  arr;
  int   size;
  int   i;
  FILE* file = fopen("file.txt", "r");
 
  if (file == NULL)
    return forOpenError;
 
  if (fscanf ("%d", &size) != 1)
    return forReadError;
 
  arr = (int*)malloc(size * sizeof(int));
 
  for (i = 0; i < size; ++i)
    if (fscanf ("%d", &arr[i]) != 1)
      return forReadError;
 
  *p_arr  = arr;
  *p_size = size;
 
  return forSuccess;
}
 
FileOperationResult SaveArray(int* arr, int size)
{
  int   i;
  FILE* file = fopen("file.txt", "w");
 
  if (file == NULL)
    return forOpenError;
 
  if (fprintf("%d\n", size) < 0)
    return forWriteError;
 
  for (i = 0; i < size; ++i)
    if (fprintf("%d ", arr[i]) < 0)
      return forWriteError;
 
  return forSuccess;
}
 
// ...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2010, 22:10     Указатели и одномерный массив
Еще ссылки по теме:

C++ Массив и указатели. Вывести на экран весь массив и на отдельной строке - значение минимального элемента массива
C++ Динамический массив и указатели!?
Не вводятся элементы в массив(указатели) C++
Массив и указатели C++
C++ Указатели и массив

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

Или воспользуйтесь поиском по форуму:
Panda91
0 / 0 / 0
Регистрация: 09.12.2009
Сообщений: 22
23.03.2010, 22:10  [ТС]     Указатели и одномерный массив #20
Как произвести удаление одного символа из начала массива?

Добавлено через 1 минуту
на языке программирования Си...
Yandex
Объявления
23.03.2010, 22:10     Указатели и одномерный массив
Ответ Создать тему
Опции темы

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