Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
1

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

26.05.2011, 16:20. Показов 3600. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Тема динамические структуры.
Считать данные из файла в динамический массив соответствующего типа.

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

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

2) Дан набор из 10 чисел. Создать две очереди: первая должна содержать числа из исходного набора с нечетными номерами (1, 3, …, 9), а вторая — с четными (2, 4, …, 10); порядок чисел в каждой очереди должен совпадать с порядком чисел в исходном наборе.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2011, 16:20
Ответы с готовыми решениями:

Считать данные из файла и записать в переменные соответствующего типа
Имеется файл file.txt такого содержания(тип char*, int, float, разделенные пробелом): name 3 14.2...

Считать из файла данные определенного типа и записать в массив
Подскажите, пожалуйста. Допустим, у меня есть файл text.txt, в котором есть цифры/буквы/символы. ...

Как считать элементы с Edit и перевести их в динамический массив типа double?
Можно пожалуйста пример для двумерного и одномерного массива?

Считать динамический массив из файла
Вот код : var Form1: TForm1; a:array of array of integer; f:textfile; ...

21
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
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
1
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
26.05.2011, 17:06  [ТС] 3
asics, странно - ваши тестовые данные просто стерло из файла..
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.05.2011, 17:07 4
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
2) Дан набор из 10 чисел. Создать две очереди: первая должна содержать числа из исходного набора с нечетными номерами (1, 3, …, 9), а вторая — с четными (2, 4, …, 10); порядок чисел в каждой очереди должен совпадать с порядком чисел в исходном наборе.
Ну тут все елементарней некуда: две очереди; цыкл по последовательности; если нечетное -> пихаем в первый, иначе -> во второй.
Кстате, очередь должна быть самописная или стандартаная ?
0
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
26.05.2011, 17:09  [ТС] 5
Цитата Сообщение от asics Посмотреть сообщение
самописная или стандартаная ?
самописная.
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.05.2011, 17:11 6
Цитата Сообщение от IIIa66uMEM6eP Посмотреть сообщение
самописная.
Списки, стеки, очереди
1
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
26.05.2011, 17:13  [ТС] 7
asics, что скажете про первую задачу? затерает любые данные в файле((
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.05.2011, 17:16 8
IIIa66uMEM6eP, Я не знаю как вам показать, что у меня работатет, видео снимать как-то впадлу.
0
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
26.05.2011, 20:24  [ТС] 9
asics, объясню ситуацию.. когда кидаю 1.тхт в каталог вместе с файлом проекта - выводит что файл не найден. когда прописываю конкретный путь к файлу, к примеру "c://"input.txt" после выполнения все тестовые данные стерты.. в чем может быть касяк?

Добавлено через 2 часа 11 минут
upd...
0
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
07.06.2011, 12:32  [ТС] 10
upd. Не получается с очередью. Задание 2.
Дан набор из 10 чисел. Создать две очереди: первая должна содержать числа из исходного набора с нечетными номерами (1, 3, …, 9), а вторая — с четными (2, 4, …, 10); порядок чисел в каждой очереди должен совпадать с порядком чисел в исходном наборе.
0
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 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...
0
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.06.2011, 20:49 12
pv->p = mas[i];
Ты пытаешься присвоить указателю числовое значение и функция должна возвращать указатель структуры а ты присваиваешь снова число из числового массива, и таким ты образом думаешь будешь добавлять узлы в очередь, смешно.
1
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
15.06.2011, 14:33  [ТС] 13
xAtom, подскажи как правильно..

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

Добавлено через 4 часа 30 минут
xAtom, дружище, помогай если знаешь..
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
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;
}
как то так
1
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
15.06.2011, 16:21  [ТС] 15
Aneron, у вас значения какие то рендомные.. у меня же конкретная очередь(( или я чего то непонял?
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
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");
        }
и будут ваши значения.
1
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
15.06.2011, 16:47  [ТС] 17
Aneron, там есть кстати небольшая ошибка, в каждую преобразованную очередь оно еще и 10 заносит.
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
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;     
}
1
заставил Бендера
854 / 319 / 17
Регистрация: 05.12.2010
Сообщений: 1,708
Записей в блоге: 6
15.06.2011, 21:29  [ТС] 19
Большое всем спасибо и Aneron в частности, теперь бы еще его программу понять полностью))
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
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;
}
1
16.06.2011, 12:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2011, 12:04
Помогаю со студенческими работами здесь

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

Не могу считать матрицу из файла в динамический массив
Вот проблемный кусок программы: fstream f (strConst); if (! f) { cout&lt;&lt;&quot;Error_3&quot;;...

Считать из файла динамический массив, вывести его на экран
Ребят пропустил пару, а на зачете будут задания типа 1)Считать из файла динамический массив,...

Считать строки файла и поместить в динамический массив строк
Ребята помогите. Нужно считать с файла, в котором 1 строка - 1 слово, строки и поместить их в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru