Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача на стеки 
:(
    Опции темы
persalena
Дата 22.3.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Вот текст программы. Почему-то пропускается оператор printf(выделен) 
и еще как бы сделать так, чтобы после выбора желаемого действия и выполнения соответствующей процедуры, снова можно было выбрать действие? Т. е. ,например, сначала создать стек, потом положить туда элемент, потом забрать.

#include <conio.h>
#include <stdio.h>
#include <iostream.h>


struct sstack
  {
  char elem[10];
  int top;
  };

int create (sstack *a)//создать стек
  {
  a->top= -1;
  return 1;
  }
int vstack (sstack *b, char *x)//положить элемент в стек
  {
  if(b->top!=9)
    {
    b->elem[b->top]=*x;
    b->top++;
    return 1;
    }
  return 0;
  }
int izstacka (sstack *c, char *x)// взять элемент из стека
  {
  if(c->top!=-1)
    {
    *x=c->elem[c->top];
    c->top--;
    return 1;
    }
  return 0;
  }

int puststack (sstack *d)// проверить пуст ли стек
  {
  if (d->top==-1)
  return 1;
  return 0;
  }
void sodergimoe(sstack *e)// вывести содержимое стека на экран
{
    while(e->top!=-1)
           {printf("%c",e->elem[e->top]);
               (e->top)--;
               }
}





void main()
{
    sstack mass;
    int k,l;
    char x,s;
    printf("choose variant: \n 1.create stack \n 2.instack \n 3.outstack \n 4.empty stack \n ");
    scanf("%i", &l);
        switch(l)
{case 1:
    {
        k=create (&mass);
        printf("%i",k);

    break;
        }
case 2:
    {      
        printf("enter symbol");
        scanf("%c", &x);

        k=vstack(&mass, &x);
        printf("%i", k);
    }
    break;
case 3:
    {
        k=izstacka (&mass, &x);
        printf("%i ; element: %c", k,x);
    }
    break;
case 4:
    {
        k=puststack (&mass);
        printf("%i",k);
    }
    break;
}

printf ("Jelaete vivesti soderjimoe na ekran?\n Y or N? ");
scanf("%c",&s);
if(s=='Y') sodergimoe(&mass);
getch();
}


Это сообщение отредактировал(а) persalena - 22.3.2009, 14:15
PM MAIL   Вверх
mes
Дата 22.3.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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



Цитата(persalena @  22.3.2009,  13:15 Найти цитируемый пост)
и еще как бы сделать так, чтобы после выбора желаемого действия и выполнения соответствующей процедуры, снова можно было выбрать действие?

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

Это сообщение отредактировал(а) mes - 22.3.2009, 14:20


--------------------
PM MAIL WWW   Вверх
zim22
Дата 22.3.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Код

#include <conio.h>
#include <stdio.h>
#include <iostream>


struct sstack
  {
  char elem[10];
  int top;
  };

int create (sstack *a)//создать стек
  {
  a->top= -1;
  return 1;
  }
int vstack (sstack *b, char *x)//положить элемент в стек
  {
  if(b->top!=9)
    {
    b->elem[b->top]=*x;
    b->top++;
    return 1;
    }
  return 0;
  }
int izstacka (sstack *c, char *x)// взять элемент из стека
  {
  if(c->top!=-1)
    {
    *x=c->elem[c->top];
    c->top--;
    return 1;
    }
  return 0;
  }

int puststack (sstack *d)// проверить пуст ли стек
  {
  if (d->top==-1)
  return 1;
  return 0;
  }
void sodergimoe(sstack *e)// вывести содержимое стека на экран
{
    while(e->top!=-1)
           {printf("%c",e->elem[e->top]);
               (e->top)--;
               }
}





void main()
{
    char x,s;
    do {
    sstack mass;
    int k,l;
    
    
    printf("choose variant: \n 1.create stack \n 2.instack \n 3.outstack \n 4.empty stack \n ");
    scanf("%i", &l);
        switch(l)
{case 1:
    {
        k=create (&mass);
        printf("%i",k);

    break;
        }
case 2:
    {      
        printf("enter symbol");
        std::cin.ignore(1);
        scanf("%c", &x);
        k=vstack(&mass, &x);
        printf("%i", k);
    }
    break;
case 3:
    {
        k=izstacka (&mass, &x);
        printf("%i ; element: %c", k,x);
    }
    break;
case 4:
    {
        k=puststack (&mass);
        printf("%i",k);
    }
    break;
}

    printf ("Jelaete vivesti soderjimoe na ekran?\n Y or N? (E - dlya vihoda) ");
    std::cin.ignore(1);
    scanf("%c",&s);

if(s=='Y') sodergimoe(&mass);
    }
    while (s != 'E');
}



--------------------
PM MAIL   Вверх
persalena
Дата 22.3.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



std::cin.ignore(1); - а можно поподробне об этом действии?
PM MAIL   Вверх
zim22
Дата 22.3.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



persalena, удаляем из потока символ перехода на новую строку. в противном случает функция scanf скушает из потока символ, следующий за введённым вами ранее. А вы вводите так: например 1 и Enter нажимаете. Enter тоже заносится в поток. но неявно. поэтому его и нужно изымать.


--------------------
PM MAIL   Вверх
vinter
Дата 22.3.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(zim22 @  22.3.2009,  15:31 Найти цитируемый пост)
printf ("Jelaete vivesti soderjimoe na ekran?\n Y or N? (E - dlya vihoda) ");    std::cin.ignore(1);    scanf("%c",&s);

ой как плохо так делать.. Никогда не смешивай потокы с std


--------------------
Мой блог
PM MAIL WWW   Вверх
persalena
Дата 22.3.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



ну вот я переделала. Теперь вылетает smile. Делаю следующее: Сначала создать стек, потом положить в стек и потом вывести на экран.  
Код
#include <conio.h>
#include <stdio.h>
#include <iostream.h>


struct sstack
  {
  char elem[10];
  int top;
  };

int create (sstack *a)
  {
  a->top= -1;
  return 1;
  }
int vstack (sstack *b, char *x)
  {
  if(b->top!=9)
    {
    b->elem[b->top]=*x;
    b->top++;
    return 1;
    }
  return 0;
  }
int izstacka (sstack *c, char *x)
  {
  if(c->top!=-1)
    {
    *x=c->elem[c->top];
    c->top--;
    return 1;
    }
  return 0;
  }

int puststack (sstack *d)
  {
  if (d->top==-1)
  return 1;
  return 0;
  }
void sodergimoe(sstack *e)
{
    while(e->top!=-1)
           {printf("%c",e->elem[e->top]);
               (e->top)--;
               }
}





void main()
{
    sstack *mass;
    int k,l,f;
    char x,s,o,b;
        f=1;
        while(f==1)
{
    printf("choose variant: \n 1.create stack \n 2.instack \n 3.outstack \n 4.empty stack \n ");
    scanf("%i", &l);
       switch(l)
{case 1:
    {
        k=create (mass);
        printf("%i",k);

    break;
        }
case 2:
    {       printf("enter symbol");
        scanf("%c%c", &o,&x);
                k=vstack(mass, &x);
        printf("%i", k);
    }
    break;
case 3:
    {
        k=izstacka (mass, &x);
        printf("%i ; element: %c", k,x);
    }
    break;
case 4:
    {
        k=puststack (mass);
        printf("%i",k);
    }
    break;
}

printf ("Jelaete vivesti soderjimoe na ekran?\n Y or N?\n ");
scanf("%c%c",&o,&s);
if(s=='Y') sodergimoe(mass);
printf("\nJelaete prodolzit?\n 1 or 0\n");
scanf("%c%i",&o,&f);
}
getch();
}


PM MAIL   Вверх
zim22
Дата 22.3.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



vinter, не буду smile
но символ из потока всё-равно удалять надо. иначе scanf не приглашает пользователя ввести число. а втихомолку присвает себе значение '\10'


--------------------
PM MAIL   Вверх
persalena
Дата 22.3.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



ну посмотрите пожалуйста программку... 
PM MAIL   Вверх
vinter
Дата 22.3.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(zim22 @  22.3.2009,  17:10 Найти цитируемый пост)
иначе scanf не приглашает пользователя ввести число. а втихомолку присвает себе значение '\10'

fflush(stdin)


--------------------
Мой блог
PM MAIL WWW   Вверх
zim22
Дата 22.3.2009, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



vinter, спасибо, не знал  smile 


--------------------
PM MAIL   Вверх
vinick
Дата 23.3.2009, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: нет
Всего: 22



Цитата(persalena @  22.3.2009,  16:05 Найти цитируемый пост)
ну вот я переделала. Теперь вылетает


Код

//...................
int create (sstack *a)
  {
  a->top= -1; // <------------------------------------- Сюда из main передается ненициалицированный указаель. Писать в такой указатель нельзя
  return 1;
  }
int vstack (sstack *b, char *x)
  {
  if(b->top!=9)
    {
    b->elem[b->top]=*x; //// <---------------------------- При первом вызове запись пройдет по индексу -1.
    b->top++;
    return 1;
    }
  return 0;
  }
///......................
void main()
{
    sstack *mass; //// <--------------------------------------------- Где выделение памяти под mass ?
////....................
     case 1:
    {
        k=create (mass); /// <------------------------------------------ Передается неинициалиированный указатель. 
        printf("%i",k);
    break;
        }
}


PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0892 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.