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

Списки, чтение и вывод информации в файл - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ абстрактый типа даных Очереди http://www.cyberforum.ru/cpp-beginners/thread410546.html
Смоделировать очередь на базе статического масива, в которой реализован такой механизм изъятия элемента из очереди: начало очереди всегда находится в первом элементе массива; при изъятии одного элемента из очереди, все остальные элементы перемещаются на одну позицию ближе к началу массива. После обработки всей заданной входной последовательности найти среднее арифметическое всех элементов...
C++ Табулирование функции. протабулировать функцию у = f11 (x) на промежутке с шагом h = 0.3 результаты вычислений вывести в виде таблицы пар чисел х, у. вычислить произведение и количество всех значений функции у, для которых выполняется неравенство у< -3 или у>0,4. Помогите пожалуйста решить задачку, ато пропустил эту тему и даже незнаю как делать... http://www.cyberforum.ru/cpp-beginners/thread410526.html
C++ Вычислить количество элементов массива, равных 0
В одномерном массиве {3.24, 0, 2.28, 0, -3.22, 0, 2.88, -3.20, 0, 0} вычислить: 1) количествоых элементов массива, равных 0; 2) сумму элементов массива, расположенных после минимального элемента; 3) упорядочить элементы массива по возрастанию модулей элементов.
Уничтожение линейного двунаправленного списка C++
Нужно уничтожить линейный двунаправленный список. У меня есть функция уничтожения кольцевого однонаправленного списка. Помогите переделать. void TList::udal () { cout<<"Unichtozhenie spiska"<<endl; { TElem *t; while (kol>0) {
C++ поправьте программу http://www.cyberforum.ru/cpp-beginners/thread410505.html
#include <stdio.h> #include <conio.h> #include <iostream> #define sizeArray int swap(); void ; PrimeSelect( int A) {
C++ Алгоритм Дейкстры неправильно выводит путь вот прога, но она неправильно выводит путь((( #include<iostream> #include<fstream> #include<conio.h> #include<locale.h> #include<iomanip> using namespace std; int min(int *a); // прототип функции подробнее

Показать сообщение отдельно
lanc3r
0 / 0 / 0
Регистрация: 17.12.2009
Сообщений: 98
20.12.2011, 00:20     Списки, чтение и вывод информации в файл
программа подсчета количества повторений всех слов,
встретившихся в файле, заданном первым аргументом командной
строки, и записи полученных результатов в файл, имя которого
задается вторым аргументом. Для ускорения работы программы
найденные слова необходимо хранить в отсортированном связном
списке.
Вопрос такой. Программа выдает общее количество слов во входном файле и выдает кол-во различных слов. Мне же нужно сделать так - вводится слово с клавиатуры ( для начала предположим,что оно точно есть в списке, т.е. работаем мы уже тогда, когда список составлен и отсортирован, но еще во второй файл информацию не вывели), нужно вывести на экран 3 слова, соответствующих трем предыдущим элементам списка ( от найденного нами) и 3 следующим, если их нет ( то есть NULL), то не выводить их естественно. Хочу сначала справиться хотя бы с этим, сначала приведу свой неправильный вариант решения, дальше будет идти сама программа изначальная без самого задания
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
   char vvod[255];
    struct CLIST *cur,*d,*b,*c;  // struct CLIST//тип данных CLIST (вот так у меня задается структура двусвязаного списка)
      // {
        //CLIST *next; // адрес следующей структуры в списке
        //CLIST *prev; // адрес предыдущей структуры в списке
        //char *word;
        //int count;
      // };
struct CLIST *startL=NULL,*endL=NULL;//startL, endL указатели на структуру типа CLIST
    cout<<"Vvedite clovo"<<" \n";
    cin>>vvod;
    for (cur=startL;cur != NULL;cur->next) //идем от начала до конца, ищем слово)
        { if (cur->word==vvod)
        d=cur;}  //нашли, присвоели его d
    b=d;
    c=d;
    for (int i=0;i != 3;i++)  //3 вверх и 3 вниз ( 3 предыдущих и 3 следующих)
      {b=b->prev;
        c=c->next;
        if (b != NULL)
            cout<<b->word<<" \n";
        if (c != NULL)
            cout<<c->word<<" \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
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
 
 
// Функция возвращает true если встретился разделитель слов
unsigned char terminators[]=" \n,:;().\"";
bool isTerminator(unsigned char ch)
{
 for (unsigned char *p=terminators;*p!=0;p++)
 {
     if (ch==*p)
         return true;
 }
 return false;
 
  
}
#define MAXWORDLENGTH 65535
 
 struct CLIST//тип данных CLIST
       {
        CLIST *next; // адрес следующей структуры в списке
        CLIST *prev; // адрес предыдущей структуры в списке
        char *word;
        int count;
       };
struct CLIST *startL=NULL,*endL=NULL;//startL, endL указатели на структуру типа CLIST 
 
void processWord(char *buffer)
    {
        struct CLIST *p,*q;
        if (*buffer==0)// строка пустая(нулевая)
            return;
        for (p=startL;p != NULL;p=p->next)
        {
            int cmp=strcmp(p->word,buffer);// (-1) если первое слово меньше второго, buffer слово из файла
            if (cmp==0)// слово уже есть в массиве
            {
                p->count++;
                return;
            }
            if (cmp==1)// нашли слово большее нашего
                break;
        }
        q=new CLIST;// новая структура для нового слова
        q->count=1;
        q->word=_strdup(buffer); //нельзя присваивать buffer, его содержимое поменяется при следующем чтении
        // _strdup - адрес копии слова из buffer
        if (p!=NULL) //вставляем перед p
        {
            q->next=p;
            q->prev=p->prev;
            p->prev=q;
            if (startL != p) //вставка не в начало
                q->prev->next=q;
            else //вставка в начало
                startL=q;
            return;
        }
        //вставка в конец, p=NULL, пробежали весь список и ничего не нашли
        if (startL==NULL)//список пустой, самое первое слово
        {
            startL=endL=q;
            q->next=q->prev=NULL;
        }
        else// если текущее слово больше всех остальных
        {
            q->prev=endL;
            q->next=NULL;
            endL->next=q;
            endL=q;
        }
    }
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 
    if(argc != 3) // в командной строке должно быть 2 параметра
    {  // вывод справочной информации
        cout<<"Using : laba_4 file_from file_to";
        return 1; // закончить программу
    }
 ifstream from(argv[1]); // открываем входной файл
 if (!from)
 {
  cout<<"Не открывается входной файл :"<<argv[1]<<endl;
  return 1;
 }
 
 ofstream to(argv[2]); // открываем выходной файл
 if (!to)
 {
  cout<<"Не открывается выходной файл :"<<argv[2]<<endl;
  return 1;
 }
 
 int ch=0,count=0; // переменная для хранения очередного символа
 char buffer[MAXWORDLENGTH],*pBuffer;
 bool inWord=false;
 while ((ch = from.get()) != EOF) // Цикл чтения и обработки очередного
                                  // символа, get-считать 1 символ
 {
    bool isTerm=isTerminator(ch);
    if (inWord==false) //мы не в слове
    {
        if (isTerm)
            continue;
        //значащий символ
        inWord=true;
        pBuffer=buffer;
        count=0;
        
    }
    //inWord==true; мы в слове
    if (isTerm==false)
    {
        if (count>=MAXWORDLENGTH)
        {
            cout<<"Sorry word is too long"<<endl;
            return 1;
        }
        *pBuffer++=(char)(ch);//символ в буфер
        count++; //для слишком больших слов
        continue;       
    }
    //isTerm==true;
    *pBuffer=0;
    inWord=false;
    processWord(buffer);    
 }
 //Не забыть про последнее слово
 *pBuffer=0;
 if (inWord)
    processWord(buffer);
 int TotalWords=0,DifferentWords=0;
 struct CLIST *p,*a;
 
 for (p=startL;p != NULL;p=a)
 {
        to<<p->word<<endl;
        TotalWords+=p->count;
        DifferentWords++;
        free(p->word); //то что выделено strdup-ом надо освобождать free.
        a=p->next;
        delete p;
 }
 startL=endL=NULL;
 to.close();
 cout<<"Total Words:" <<TotalWords<<endl;
 cout<<"Different Words:" <<DifferentWords<<endl;
 return 0;
}
Добавлено через 10 часов 8 минут
может кто помочь? сказать в чем ошибка, хоть какая-нибудь помощь нужна...

Добавлено через 23 часа 5 минут
смысл тогда создавать такой форум? не понимаю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 15:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru