Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2009, 16:57   #1
persalena
 
Регистрация: 06.12.2008
Сообщений: 8
По умолчанию Пропуск строк программы (Си)

При пошаговой отладке обнаружила, что две строки просто пропускаются. Мой вопрос : почему?
Выделенные строки пропускаются. На всякий случай условие: Дана последовательность латинских букв, оканчивающаяся точкой. Среди элементов последовательности есть специальный символ, появление которого означает отмену предыдущего элемента. С учетом специального символа преобразовать последовательность. (задача на двусвязные списки)

#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#include<math.h>
FILE *fp,*fn;
char fname[100], symbol;
struct block {char bukva; block *pred; block *next;} *x,*r,*l,*c,*n;

void del(block *p)
{
if(p==NULL) return;
while((p->bukva)=='^'||p)
{delete p;
p=p->next;}
}

void del2(block *p)
{
if(p==NULL)return;
while (p)
{if (p->bukva=='^')
c=p->pred;
c->pred->next=p->next;
p->next->pred=c->pred;
delete c;
delete p;
p=p->next;}
}

void main()
{
printf("enter full filename");
scanf("%s", &fname);
if((fp=fopen(fname,"r"))==NULL)
{
perror("file open error\n");
exit(0);
}

fscanf(fp,"%c",& symbol);
l=new block;
l->bukva=symbol;
l->pred=NULL;
r=l;
fscanf(fp, "%c", &symbol);
while(symbol!='.')
{x=new block;
x->bukva=symbol;
x->pred=r;
r->next=x;
r=r->next;
fscanf(fp, "%c", &symbol);
}
void del(block *l);
void del2(block *l);

fclose(fp);
printf("enter new full filename");
scanf("%s",&fname);
n=l;
if((fn=fopen(fname,"w"))==NULL)
{
perror("file open error\n");
exit(0);
}
while(n->bukva)
{fprintf(fn, "%c", n->bukva);
n=n->next;}
fclose(fn);
getch();
}
persalena вне форума Ответить с цитированием
Старый 21.02.2009, 17:11   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

persalena Попробуйте убрать перед ними void.
Это нужно только при объявлении функций, но не при вызове.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 21.02.2009, 17:28   #3
persalena
 
Регистрация: 06.12.2008
Сообщений: 8
По умолчанию

Если убрать, то компилятор ругается...
persalena вне форума Ответить с цитированием
Старый 21.02.2009, 17:50   #4
persalena
 
Регистрация: 06.12.2008
Сообщений: 8
По умолчанию

говорит improper use of typedef 'block'
persalena вне форума Ответить с цитированием
Старый 21.02.2009, 18:01   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот так надо:
Код:
del(l);
del2(l);
Только теперь программа вылетает в функции del (несложно проверить).
Притом, если добавить в конец цикла строчку
Код:
printf("%c\n",p->bukva);
она выведет все символы до точки.
==========
И еще замечание:
Я пока со списками практически не работал, но не будет ли правильнее такая запись:
Код:
p=p->next;
  delete p->pred;
?

=================
upd:
В первой функции, видимо, нужно так:
Код:
while(p->bukva=='^'&&p)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 21.02.2009 в 18:16.
Sazary вне форума Ответить с цитированием
Старый 21.02.2009, 18:16   #6
persalena
 
Регистрация: 06.12.2008
Сообщений: 8
По умолчанию

ой, точно! тип же прописывать не надо... блин...
Цитата:
Я пока со списками практически не работал, но не будет ли правильнее такая запись:
Код:

p=p->next;
delete p->pred;
сейчас посмотрю...
persalena вне форума Ответить с цитированием
Старый 21.02.2009, 18:27   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот, возьмите ) Работает.
Вместо функций del и del2 написал новую.

Код:
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>

FILE *fp,*fn;
char fname[100], symbol;
struct block
{
 char bukva;
 block *pred;
 block *next;
} *x,*r,*l,*c,*n;

void DEL3(block *p)
{
 block *tmp;
 if(!p) return;
 while(p)
 {
  if(p->bukva=='^')
  {
   tmp = p;
   p = tmp->next;
   p->pred = tmp->pred->pred;
   tmp->pred->pred->next = p;
   delete tmp;
  }
  else
   p=p->next;
 }
}

int main()
{
printf("enter full filename\n");
scanf("%s", &fname);
if((fp=fopen(fname,"r"))==NULL)
 {
 perror("file open error\n");
 exit(0);
 }

fscanf(fp,"%c",&symbol);
l=new block;
l->bukva=symbol;
l->pred=NULL;
r=l;
fscanf(fp, "%c", &symbol);

while(symbol!='.')
 {
  x=new block;
  x->bukva=symbol;
  x->pred=r;
  r->next=x;
  r=r->next;
  fscanf(fp, "%c", &symbol);
 }

DEL3(l);


fclose(fp);
printf("enter new full filename\n");
scanf("%s",&fname);
if((fn=fopen(fname,"w"))==NULL)
 {
 perror("file open error\n");
 exit(0);
 }

n=l;
while(n)
 {
  fprintf(fn, "%c", n->bukva);
  n=n->next;
 }
fclose(fn);
getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 21.02.2009 в 18:29.
Sazary вне форума Ответить с цитированием
Старый 21.02.2009, 19:06   #8
persalena
 
Регистрация: 06.12.2008
Сообщений: 8
По умолчанию

у меня не работает... ну т.е не так как надо. В новом файле вместо букв - символы какие-то непонятные...
persalena вне форума Ответить с цитированием
Старый 21.02.2009, 19:16   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

А что вы вводите?
Исходный файл:
Код:
hello, it^ ^i^s e^x^am^ple.
Конечный файл (после запуска):
Код:
hello, is aple
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 21.02.2009, 20:15   #10
persalena
 
Регистрация: 06.12.2008
Сообщений: 8
По умолчанию

у меня исходный ^a.
persalena вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица A состоит из 8 строк и 6 столбцов. вычесть из всех её строк, начиная со второй, первую строку Dimak24 Помощь студентам 1 19.12.2008 15:45
Нумерация строк. QT 4 NikLik Qt и кроссплатформенное программирование С/С++ 2 18.12.2008 22:38
Запуск программы на выполнение из другой программы. ViNcHeStEr Паскаль, Turbo Pascal, PascalABC.NET 6 18.06.2008 14:33
Пропуск условия if. Delphi 7 Дикий Помощь студентам 11 12.05.2008 22:49
Excel max 256 строк VS user надо 300 строк Exo Microsoft Office Excel 3 10.01.2008 17:14