1 / 1 / 1
Регистрация: 20.10.2010
Сообщений: 56
1

Написать функцию для непосредтственно удаления слов и подставления числа

25.04.2011, 01:23. Показов 1154. Ответов 6
Метки нет (Все метки)

Дан текстовый файл. Группы символов, разделенные пробелами, будем называть словами. В файле оставить только по одному экземпляру каждого слова и добавить перед ними количество их вхождений в первоначальный текст.

Написал код для ввода\вывода, обработки... никак не могу напилить функцию для непосредтственно удаления слов и подставления числа

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
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
 
typedef struct list
{
 int number;
 struct list *next;
} LIST;
 
LIST *read_list(LIST *lst)
{
 LIST *p;
 FILE *file;
 file=fopen("list.txt", "r");
 if (file)
    {
     lst=(LIST *)malloc(sizeof(LIST));
     p=lst;
     while (1)
     {
      fscanf(file, "%d", &p->number);
      if (!feof(file))
     {
      p->next=(LIST *)malloc(sizeof(LIST));
      p=p->next;
     }
      else
      break;
     }
     p->next=NULL;
    }
 else
     printf("file not found \n");
 fclose(file);
 return lst;
}
 
 
 
void write_lst(LIST *lst)
{
 FILE *file;
 LIST *p1=lst;
 file=fopen("list2.txt", "w");
 while (p1)
       {
    fprintf(file, "%d ", p1->number);
    if (p1->next==NULL)
       break;
    p1=p1->next;
       }
 fclose(file);
}
 
 
 
 
void main()
{
 clrscr();
 LIST *lst=NULL;
 lst=read_list(lst);
 printf("start file :\n");
 write_lst(lst);
 printf("result:\n");
 getch();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2011, 01:23
Ответы с готовыми решениями:

Написать программу для удаления скобок и слов в них
Знаю, что таких полно, но они все работают только в случае, когда нет скобок в скобках типо того :...

Написать функцию для удаления всех подстрок для заданной строки
всем привет, я новичок в плюсах, поясните пожалуйста, хотел отдебажить функцию, но она даже не...

Написать функцию для удаления строки из двумерного массива
. Написать функцию для удаления строки из двумерного массива. Оставшиеся строки должны быть...

Подставления списка в функцию ord()
Доброго времени суток. Пытаюсь подставить список def dp(): arr = key=&quot;&quot; for k in...

6
372 / 286 / 97
Регистрация: 17.12.2009
Сообщений: 567
25.04.2011, 03:09 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// составим массив из указателей на узлы, отсортируем его по значению поля number структуры LIST
// и тогда можно будет все легко считать.
LIST *sort(LIST *root)
{
  LIST **nodes, *tmp;
  int size = 0, i, j;
  for (tmp = root; tmp != NULL; tmp = tmp->next) {
    size++;
  }
  size+=1;
  nodes = (LIST**) malloc(sizeof(LIST*) * size);
  tmp = root;
  for (i = 0; i < size; ++i) {
    nodes[i] = tmp;
    tmp = tmp->next;
  }
  // сортировка пузырьковая
 for (i = size - 1; 0 <= i; ++i) {
   for (j = 0; j < i; ++j) {
     if (nodes[j]->number > nodes[j+1]->number) {
       LIST *tmp;
       tmp = nodes[j];
       nodes[j] = nodes[j + 1];
       nodes[j + 1] = tmp;
     }
   }
   // настроим ссылки узлов
  for (i = 0; i < size - 1; ++i) {
    nodes[i]->next = nodes[i + 1];
  }
  nodes[size - 1]->next = NULL; // ссылка последнего элемента должна быть обнулена
  tmp = nodes[0]
  free(nodes);
  return tmp;
}
void uniq_output(LIST *root, FILE *out)
{
  LIST *tmp;
  for (tmp = root; tmp != NULL; tmp = tmp->next) {
      int counter = 1;
      while ( tmp->next != NULL && tmp->number == tmp->next->number) {
         counter++;
         tmp = tmp->next;
      }
      fprintf(out, "[%d] %d ", counter, tmp->number);
  }
}
// использовать так
LIST *root;
// как то заполнили
// сортируем
root = sort(root);
// и выводим
uniq_output(root, stdout);
0
1 / 1 / 1
Регистрация: 20.10.2010
Сообщений: 56
25.04.2011, 22:40  [ТС] 3
Благодарствую! завтра попробую разобраться

Добавлено через 19 часов 24 минуты
Извиняюсь, но у меня не получилось собрать 2 кода в программу. выходит постоянно несколько ошибок. не могли бы помочь?
0
372 / 286 / 97
Регистрация: 17.12.2009
Сообщений: 567
26.04.2011, 02:22 4
ошибки надо постить я же не экстрасенс, даже если я возьму твой код и добавлю к нему мой, у меня могут получиться другие ошибки.
0
1 / 1 / 1
Регистрация: 20.10.2010
Сообщений: 56
27.04.2011, 00:57  [ТС] 5
я конечно дико извинияюсь, но не составит ли вам огромного труда собрать эти 2 кода в 1 программу?

Добавлено через 21 час 55 минут
с ошибками разобрался. программа теперь закливается\
0
372 / 286 / 97
Регистрация: 17.12.2009
Сообщений: 567
27.04.2011, 02:10 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Откомпилируй с ключом -g чтобы компилятор включил отладочную информацию в запускной файл. Открой файл в программе gdb, запусти пошаговое исполнение, проверяй значения счетчиков в циклах.
Или выбери в программе "контрольные точки", добавь вывод на экран в этих точках, чтобы можно было судить о ходе вычислительного процесса.
например:
C
1
2
3
4
5
6
// цикл зациклится
int i;
for (i=1; i > 0; ++i) {
  printf("%d ", i); // так можно узнать, что зациклился именно этот цикл
}
// этот метод очень простой но с ним можно долго провозиться
и, кажется, я сам нашел где зацикливание:
C
1
2
3
4
5
6
7
8
9
for (i = size - 1; 0 <= i; ++i) {  // тут надо --i
   for (j = 0; j < i; ++j) {
     if (nodes[j]->number > nodes[j+1]->number) {
       LIST *tmp;
       tmp = nodes[j];
       nodes[j] = nodes[j + 1];
       nodes[j + 1] = tmp;
     }
   }
0
1 / 1 / 1
Регистрация: 20.10.2010
Сообщений: 56
28.04.2011, 00:12  [ТС] 7
Чутка разобрался с прогой. теперь исходный и результат выводит одинаково.
хотябы выводит уже...

Добавлено через 25 минут
Вот такой результат вобщем:
start file :
word text slovo BC informatika slovo word pascal word word BC
result:
[1] word [1] text [1] slovo [1] BC [1] informatika [1] slovo [1] word [1] pascal
[1] word [1] word

слова не удаляются(
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2011, 00:12
Помогаю со студенческими работами здесь

Нужно написать функцию compress для удаления повторяющихся букв в слове
Function - Compress(s,t). Purpose - замена в строке s множественных вхождений символа t на одно. ...

Хочу написать функцию для удаления всех node у которых одинаковые значения
писал вот так, но почему то не работает, то есть для начала хочу просто отображать индексы таких...

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

Написать функцию для подсчета слов в предложении
Создайте функцию, которая возвращает количество слов в предложении, что служит ей параметром


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru