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

Считать данные из файла в динамический массив соответствующего типа - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
26.05.2011, 16:20     Считать данные из файла в динамический массив соответствующего типа #1
Здравствуйте.
Тема динамические структуры.
Считать данные из файла в динамический массив соответствующего типа.

1) В файле целых чисел хранятся последовательности ненулевых чисел. Ноль – разделитель последовательностей. Преобразовать файл, удалив в каждой последовательности члены между первым и вторым отрицательным числом. Если отрицательных чисел меньше двух, последовательность исключить из файла.

Располагая определенной динамической структурой, написать программу, предусматривающую ввод / вывод элементов списка и обработку.

2) Дан набор из 10 чисел. Создать две очереди: первая должна содержать числа из исходного набора с нечетными номерами (1, 3, …, 9), а вторая — с четными (2, 4, …, 10); порядок чисел в каждой очереди должен совпадать с порядком чисел в исходном наборе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2011, 16:20     Считать данные из файла в динамический массив соответствующего типа
Посмотрите здесь:

C++ Как из файла txt считать данные в массив?
Считать числа типа double из файла и записать их в массив C++
C++ Не могу считать матрицу из файла в динамический массив
C++ Считать матрицу в динамический массив
C++ Как считать из файла в массив типа int
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
26.05.2011, 16:53     Считать данные из файла в динамический массив соответствующего типа #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
1) В файле целых чисел хранятся последовательности ненулевых чисел. Ноль – разделитель последовательностей. Преобразовать файл, удалив в каждой последовательности члены между первым и вторым отрицательным числом. Если отрицательных чисел меньше двух, последовательность исключить из файла.
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>
#include <fstream>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
 
size_t cnt_neg(std::vector<int> &a){
  return std::count_if(a.begin(), a.end(), std::bind2nd(std::less<int>(), 0));
}
 
int main(){
  std::fstream fs("1.txt", std::ios::in);
  if(!fs){
    std::cerr << "File not found" << std::endl;
    return 1;
  }
  std::vector<std::vector<int> > m;
  while(!fs.eof()){
    std::vector<int> t;
    int t_;
    while(fs >> t_){
      if(!t_)
        break;
      t.push_back(t_);
    }
    m.push_back(t);
  }
  fs.close();
  fs.open("1.txt", std::ios::out);
  for(int i = 0; i < m.size(); ++i){
    if(cnt_neg(m[i]) < 2)
      continue;
    std::vector<int>::iterator it_1 = std::find_if(m[i].begin(), m[i].end(), std::bind2nd(std::less<int>(), 0)),
    it_2 = std::find_if(it_1 + 1, m[i].end(), std::bind2nd(std::less<int>(), 0));
    m[i].erase(it_1 + 1, it_2);
    for(int j = 0; j < m[i].size(); ++j)
      fs << m[i][j] << ' ';
    fs << '0';
  }
  return 0;
}
Содержимое файла примерно такое:
Код
6 3 -3 7 2 1 -8 0 7 3 1 7 6 -5 3 7 0
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
26.05.2011, 17:06  [ТС]     Считать данные из файла в динамический массив соответствующего типа #3
asics, странно - ваши тестовые данные просто стерло из файла..
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
26.05.2011, 17:07     Считать данные из файла в динамический массив соответствующего типа #4
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
2) Дан набор из 10 чисел. Создать две очереди: первая должна содержать числа из исходного набора с нечетными номерами (1, 3, …, 9), а вторая — с четными (2, 4, …, 10); порядок чисел в каждой очереди должен совпадать с порядком чисел в исходном наборе.
Ну тут все елементарней некуда: две очереди; цыкл по последовательности; если нечетное -> пихаем в первый, иначе -> во второй.
Кстате, очередь должна быть самописная или стандартаная ?
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
26.05.2011, 17:09  [ТС]     Считать данные из файла в динамический массив соответствующего типа #5
Цитата Сообщение от asics Посмотреть сообщение
самописная или стандартаная ?
самописная.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
26.05.2011, 17:11     Считать данные из файла в динамический массив соответствующего типа #6
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
самописная.
Списки, стеки, очереди
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
26.05.2011, 17:13  [ТС]     Считать данные из файла в динамический массив соответствующего типа #7
asics, что скажете про первую задачу? затерает любые данные в файле((
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
26.05.2011, 17:16     Считать данные из файла в динамический массив соответствующего типа #8
IIIa66uMEM6eP, Я не знаю как вам показать, что у меня работатет, видео снимать как-то впадлу.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
26.05.2011, 20:24  [ТС]     Считать данные из файла в динамический массив соответствующего типа #9
asics, объясню ситуацию.. когда кидаю 1.тхт в каталог вместе с файлом проекта - выводит что файл не найден. когда прописываю конкретный путь к файлу, к примеру "c://"input.txt" после выполнения все тестовые данные стерты.. в чем может быть касяк?

Добавлено через 2 часа 11 минут
upd...
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
07.06.2011, 12:32  [ТС]     Считать данные из файла в динамический массив соответствующего типа #10
upd. Не получается с очередью. Задание 2.
Дан набор из 10 чисел. Создать две очереди: первая должна содержать числа из исходного набора с нечетными номерами (1, 3, …, 9), а вторая — с четными (2, 4, …, 10); порядок чисел в каждой очереди должен совпадать с порядком чисел в исходном наборе.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
14.06.2011, 18:09  [ТС]     Считать данные из файла в динамический массив соответствующего типа #11
что то по 2 заданию.. подскажите почему ошибка в строке else pv->p = mas[i];

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 <cstdlib>
#include <iostream>
#include <cmath>
#include <clocale>
#include <fstream>
#include <windows.h>
#include <algorithm>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#pragma comment(lib,"kernel32.lib") 
using namespace std;
// структура последовательности
struct pos {
   int d;
   pos *p;
};
    // простая очередь.
pos *first(int d){
    int mas[10] = {1,2,3,4,5,6,7,8,9,10};
  pos *pv = new pos;
for (int i=0; i < 10; i++)
{
if (mas[i] % 10) pv->d = mas[i] ;
else  pv->p = mas[i];
} 
  return mas[i];
}
 
int main(int argc, char *argv[])
{
    setlocale (LC_CTYPE, "rus");
 cout << pos.d;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 3 часа 24 минуты
upd...
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.06.2011, 20:49     Считать данные из файла в динамический массив соответствующего типа #12
pv->p = mas[i];
Ты пытаешься присвоить указателю числовое значение и функция должна возвращать указатель структуры а ты присваиваешь снова число из числового массива, и таким ты образом думаешь будешь добавлять узлы в очередь, смешно.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 14:33  [ТС]     Считать данные из файла в динамический массив соответствующего типа #13
xAtom, подскажи как правильно..

Добавлено через 13 часов 9 минут
upd...

Добавлено через 4 часа 30 минут
xAtom, дружище, помогай если знаешь..
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
15.06.2011, 15:37     Считать данные из файла в динамический массив соответствующего типа #14
Цитата Сообщение от xAtom Посмотреть сообщение
pv->p = mas[i];
ты пытаешься указателю типа pos присвоить тип int.

Добавлено через 50 минут
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
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
#include <stdlib.h>
 
// структура последовательности
struct elem 
{
   int d;
   elem * next_elem;
   elem()
   {
       next_elem = NULL;
   }
 
};
struct list
{
    elem * first_elem;
    elem * last_elem;
    list()
    {
        first_elem = last_elem = NULL;
    }
};
bool add(list ** l,int d)
{
    elem * new_elem = new elem();
    if(new_elem == NULL)
        return false;
    new_elem->d = d;
    if((*l)->last_elem)
        (*l)->last_elem->next_elem = new_elem;
    else
        (*l)->first_elem = new_elem;
 
    (*l)->last_elem = new_elem;     
    return true;
}
void add(list ** l,elem * new_elem)
{
    if((*l)->last_elem)
        (*l)->last_elem->next_elem = new_elem;
    else
        (*l)->first_elem = new_elem;
    (*l)->last_elem = new_elem;     
}
void del (list ** l)
{
    if((*l)->first_elem)
    {
        elem * ptr = (*l)->first_elem;
        (*l)->first_elem = (*l)->first_elem->next_elem;
        delete ptr;
    }
}
void sort(list ** l_1,list ** l_2,list ** l_3)
{
    int i = 1;
    elem * ptr = (*l_1)->first_elem;
    while(ptr)
    {
        if(i%2)
            add(l_2,ptr);
        else
            add(l_3,ptr);
        ptr = ptr->next_elem;
        ++i;
    }
}  
 
int main(int argc, char *argv[])
{
    list * l = new list();
    for(int i = 0; i < 10; ++i)
    {
        if(!add(&l,rand()))
            printf("Add() error\n");
    }
    elem * ptr = l->first_elem;
    while(ptr)
    {
        printf("%d\n",ptr->d);
        ptr = ptr->next_elem;
    }
    list * l_1 = new list();
    list * l_2 = new list();
    sort(&l,&l_1,&l_2);
 
    printf("\n\n");
 
    ptr = l_1->first_elem;
    while(ptr)
    {
        printf("%d\n",ptr->d);
        ptr = ptr->next_elem;
    }
 
    printf("\n\n");
 
    ptr = l_2->first_elem;
    while(ptr)
    {
        printf("%d\n",ptr->d);
        ptr = ptr->next_elem;
    }
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
как то так
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 16:21  [ТС]     Считать данные из файла в динамический массив соответствующего типа #15
Aneron, у вас значения какие то рендомные.. у меня же конкретная очередь(( или я чего то непонял?
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
15.06.2011, 16:29     Считать данные из файла в динамический массив соответствующего типа #16
C++
1
2
3
4
5
for(int i = 0; i < 10; ++i)
        {
                if(!add(&l,rand()))
                        printf("Add() error\n");
        }
да. ибо все значения задаются рандомом.

можете этот кусок исправить на
C++
1
2
3
4
5
6
int mas[10] = {1,2,3,4,5,6,7,8,9,10};
for(int i = 0; i < 10; ++i)
        {
                if(!add(&l,mas[i]))
                        printf("Add() error\n");
        }
и будут ваши значения.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 16:47  [ТС]     Считать данные из файла в динамический массив соответствующего типа #17
Aneron, там есть кстати небольшая ошибка, в каждую преобразованную очередь оно еще и 10 заносит.
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
15.06.2011, 17:14     Считать данные из файла в динамический массив соответствующего типа #18
Сообщение было отмечено автором темы, экспертом или модератором как ответ
ни кто не идеален =) все ошибаются.

или исправляете эту функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void sort(list ** l_1,list ** l_2,list ** l_3)
{
    int i = 1;
    elem * ptr = (*l_1)->first_elem;
    while(ptr)
    {       
        if(i%2)
            add(l_2,ptr->d);
        else
            add(l_3,ptr->d);
        ptr = ptr->next_elem;
        ++i;
    }
}
или эту
C++
1
2
3
4
5
6
7
8
9
void add(list ** l,elem * new_elem)
{
    new_elem -> next_elem = NULL;
    if((*l)->last_elem)
        (*l)->last_elem->next_elem = new_elem;
    else
        (*l)->first_elem = new_elem;
    (*l)->last_elem = new_elem;     
}
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 21:29  [ТС]     Считать данные из файла в динамический массив соответствующего типа #19
Большое всем спасибо и Aneron в частности, теперь бы еще его программу понять полностью))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2011, 12:04     Считать данные из файла в динамический массив соответствующего типа
Еще ссылки по теме:

C++ Считать данные текстового файла в массив
Считать данные из файла и записать в переменные соответствующего типа C++
Как считать из файла текст в двумерный массив типа char и отсортировать в алф. порядке? C++

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

Или воспользуйтесь поиском по форуму:
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
16.06.2011, 12:04     Считать данные из файла в динамический массив соответствующего типа #20
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "stdafx.h"
#include <stdlib.h>
 
// создаю структуру - элемент очереди.
struct elem 
{
   int d;//Хранимая цифра.
   elem * next_elem;//Указатель на сл. элемент
   elem()//Конструктор по умолчанию. Вызывается при создании нового элемента очереди.
   {
           next_elem = NULL;
   }
 
};
//структура-очередь. У очереди добавление элемента происходит с одного конца, а удаление с другого. Для этого храню указатели на оба конца.
struct list
{
        elem * first_elem;
        elem * last_elem;
        list()//Конструктор по умолчанию. 
        {
                first_elem = last_elem = NULL;
        }
};
 
//Добавление в очередь элемента с заданной цифрой.
bool add(list ** l,int d)
{
        elem * new_elem = new elem();//Создаю новый элемент очереди.
        if(new_elem == NULL)//Проверяю, создан ли он.
                return false;
        new_elem->d = d;//Присваиваю цифре элемента значение заданной цифры.
        if((*l)->last_elem)//Проверяю, есть ли в очереди другие элементы.
                (*l)->last_elem->next_elem = new_elem;//Если есть, то делаю новый элемент потомком последнего элемента.
        else
                (*l)->first_elem = new_elem;//Если нет, то делаю новый элемент первым в очереди.
        (*l)->last_elem = new_elem;//Делаю новый элемент последним в очереди.             
        return true;
}
//Добавление в очередь уже существующего элемента.
void add(list ** l,elem * new_elem)
{
        new_elem -> next_elem = NULL;//Нам не нужны его потомки.
        if((*l)->last_elem)
                (*l)->last_elem->next_elem = new_elem;
        else
                (*l)->first_elem = new_elem;
        (*l)->last_elem = new_elem;             
}
//Удаление элемента.
void del (list ** l)
{
        if((*l)->first_elem)//Удаление происходит если очередь не пуста.
        {
                elem * ptr = (*l)->first_elem;//Сохраняю указатель на первый элемент.
                (*l)->first_elem = (*l)->first_elem->next_elem;//Делаю второй элемент в очереди первым.
                delete ptr;//Освобождаю память из под первого элемента.
        }
}
//Разбиваю по двум др. очередям.
void sort(list ** l_1,list ** l_2,list ** l_3)
{
        int i = 1;//Порядковый номер элемента. 
        elem * ptr = (*l_1)->first_elem;//Создаем указатель и присваиваем ему значение первого элемента очереди.
        while(ptr)//Проверяем, существует ли элемент.
        {
                if(i%2)//Если порядковый номер элемента кратен 2, то добавляем в первый список.
                        add(l_2,ptr);
                else//Если нет, то добавляем в второй список.
                        add(l_3,ptr);
 
                ptr = ptr->next_elem;//Переходим к сл.элементу очереди.
                ++i;//Увеличиваем номер элемента.
        }
}  
 
int main(int argc, char *argv[])
{
//Создаем 3 очереди.
        list * l = new list();
        list * l_1 = new list();
        list * l_2 = new list();
//Добавляем элементы в первую.
        for(int i = 0; i < 10; ++i)
        {
                if(!add(&l,rand()))
                        printf("Add() error\n");
        }
//Выводим первую очередь.
        elem * ptr = l->first_elem;
        while(ptr)
        {
                printf("%d\n",ptr->d);
                ptr = ptr->next_elem;
        }
//Разкидываем по 2 ост.очередям.
        sort(&l,&l_1,&l_2);
 
        printf("\n\n");
//Выводим остальные 2 очереди. 
        ptr = l_1->first_elem;
        while(ptr)
        {
                printf("%d\n",ptr->d);
                ptr = ptr->next_elem;
        }
 
        printf("\n\n");
 
        ptr = l_2->first_elem;
        while(ptr)
        {
                printf("%d\n",ptr->d);
                ptr = ptr->next_elem;
        }
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Yandex
Объявления
16.06.2011, 12:04     Считать данные из файла в динамический массив соответствующего типа
Ответ Создать тему
Опции темы

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