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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2009, 01:16   #1
pashka
 
Регистрация: 30.05.2009
Сообщений: 6
Вопрос Помогите разобраться

Нужно сделать в Borland C++ (console wizard)
Задание:

То что уже сделал:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct pass {
int time;
int place;
char dest[30];
struct pass *nextPtr;
};
typedef struct pass Pass;
typedef Pass *passptr;
void insert(passptr *,int , int , char*);
//char delet (passptr *,char);
int isempty (passptr);
void printlist (passptr);
void instructions(void);

int main(){
passptr startptr = NULL;
int t;
int p;
int choice;
char item[30];
int Time1=5;
int Time2=5;
int Time3=5;
passptr currentptr;
instructions();
printf ("Choice?");
scanf ("%d",&choice);
while(choice !=3) {
switch (choice){
case 1:
printf ("Enter a time:");
scanf ("\n%i", &t);
printf ("Enter a dest:");
scanf ("\n%s", item);
insert(&startptr, t, p, item);
printlist(startptr);
break;
case 2:
currentptr=startptr;
while (currentptr !=NULL){
if (currentptr->time==1){
Time1--;
}
if (currentptr->time==2){
Time2--;
}
if (currentptr->time==3){
Time3--;
}
currentptr=currentptr->nextPtr;
}
printf ("Free place on time 1: %i\n", Time1);
printf ("Free place on time 2: %i\n", Time2);
printf ("Free place on time 3: %i\n", Time3);
break;
case 3:
break;
default:
printf("invalid choice. \n\n");
instructions() ;
break;
}
printf("Choice?");
scanf("%d", &choice);
}
printf("End of run. \n");
getch();
return 0;
}
void instructions (void){
printf ("enter your chioce: \n"
"1 to insert an element into the list. \n"
"2 Print free place. \n"
"3 to end. \n" );
}
void insert (passptr *sptr, int t, int p, char* value){
passptr newptr, previousptr, currentptr, timeptr;
newptr=new Pass;
if (newptr != NULL){
strcpy(newptr->dest , value);
newptr->time = t;
newptr->place = 0;
newptr->nextPtr = NULL;
previousptr = NULL;
currentptr = *sptr;
timeptr = NULL;
while (currentptr !=NULL){
if (currentptr-> time==t){
timeptr=currentptr;
}
previousptr=currentptr;
currentptr=currentptr ->nextPtr;}
if (previousptr==NULL) {
newptr->nextPtr = *sptr;
*sptr=newptr;
if (timeptr == NULL) {
newptr->place=1;
}
}
else{
previousptr->nextPtr=newptr;
newptr->nextPtr = currentptr;
newptr->place= timeptr->place+1;

}
}
else
printf("%c not inserted. no memory available. value");
}
int isempty(passptr sptr){
return sptr==NULL;
}
void printlist(passptr sptr){
passptr currentptr;
currentptr=sptr;
while (currentptr !=NULL){
printf ("Time: %i\n",currentptr->time);
printf ("Place: %i\n",currentptr->place);
printf ("Dest: %s\n\n",currentptr->dest);
currentptr=currentptr->nextPtr;
}
}
Сразу говорю, я начинающий новичок, ногами не бить!
Ошибка выскакивает, когда заносишь "человека" на другое время, отличное от введенного ранее. Например, если вначале записал "человека" на первый рейс, то при записи другого "человека" на второй или на третий рейс - выскакивает это плохая ошибка...

редактор показывает что ошибка в этой строчке:
Код:
newptr->place= timeptr->place+1;
Может кто поможет разобраться?
pashka вне форума Ответить с цитированием
Старый 30.05.2009, 02:09   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Так особо в задании не разбирался. Но вот что нашел. На примере:
Введем 3-х пассажиров.
Двоих на время 1, а третьего - на время 2.
Теперь смотрим, что происходит при добавлении третьего:
Код:
timeptr = NULL;  // обратить внимание

 while (currentptr !=NULL)
  {
  if (currentptr->time==t)  // это условие не выполнится ни разу...
   {
   timeptr=currentptr;   
   }
            
  previousptr=currentptr;
  currentptr=currentptr->nextPtr;
  }
// вышли из цикла. timeptr по-прежнему == NULL

 if (previousptr==NULL)  // сюда не заходим!!!
 {
 newptr->nextPtr = *sptr;
 *sptr=newptr;
 if (timeptr == NULL)   // сюда тоже не доберемся
  {
  newptr->place=1;
  }
 }
 else       // а вот сюда мы попадаем
  {
  previousptr->nextPtr=newptr;
  newptr->nextPtr = currentptr;
  newptr->place= timeptr->place+1;  // и вот тут-то и обращаемся к неизвестно чему
     //... т.к. timeptr == NULL
  }
-------------
Как я понимаю, нужно вынести вот этот блок:
Код:
if (timeptr == NULL)   // сюда тоже не доберемся
  {
  newptr->place=1;
  }
Из внешнего if'а. Программа вылетать не будет, но там появляется другой косяк. Но, думаю, там вы разберетесь.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

Большое спасибо. воспользовался вашим советом, кое что добапил/подправил и все работает как надо
pashka вне форума Ответить с цитированием
Старый 30.05.2009, 22:29   #4
pashka
 
Регистрация: 30.05.2009
Сообщений: 6
По умолчанию

Это снова я) появился новый вопросик.
Ниже код рабочей задачи, как бы он жалко и убого не выглядел, он работает, а это главное.
Тепрь сам вопрос:
У меня считается свободное место в транспорте в точке А (исходя из условия задачи), это я сделал. А как можно переделать, что бы считались свободные места в Промежуточном (опять же из условия) пункте B? Вроде выглядит просто: от максимального числа мест (5) отнимаем пасажиров едущих рейсом A->C, это и будет колличество свободых мест в точке В. А теперь помогите реализовать это в язык с++ пожалуйста, недостаток знаний и отсутствие опыта мешают мне сделать это самому
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct pass
{
  int time;
  int place;
  char dest[30];
  struct pass *nextPtr;
};
int exitt=0;
typedef struct pass Pass;
typedef Pass *passptr;
void insert(passptr *,int , int , char*);
int isempty (passptr);
void printlist (passptr);
void instructions(void);
int main()
{
  clrscr();
  passptr startptr = NULL;
  int t;
  int p;
  int choice;
  char item[30];
  int Time1;
  int Time2;
  int Time3;
  passptr currentptr;
  instructions();
  printf ("Choice?");
  scanf ("%d",&choice);
  while(choice !=3)
  {
    switch (choice)
    {
      case 1:
      printf ("Enter a time:");
      scanf ("\n%i", &t);
      printf ("Enter a dest:");
      scanf ("\n%s", item);
      insert(&startptr, t, p, item);
      printlist(startptr);
      break;
      case 2:
      Time1=5;
      Time2=5;
      Time3=5;
      currentptr=startptr;
      while (currentptr !=NULL)
      {
        if (currentptr->time==1)
        {
          Time1--;
        }
        if (currentptr->time==2)
        {
          Time2--;
        }
        if (currentptr->time==3)
        {
          Time3--;
        }
        currentptr=currentptr->nextPtr;
      }
      printf ("Free place on time 1: %i\n", Time1);
      printf ("Free place on time 2: %i\n", Time2);
      printf ("Free place on time 3: %i\n", Time3);
      break;
      case 3:
      break;
      default:
      printf("invalid choice. \n\n");
      instructions() ;
      break;
    }
    printf("Choice?");
    scanf("%d", &choice);
  }
  printf("End of run. \n");
  getch();
  return 0;
}
void instructions (void)
{
  printf ("enter your chioce: \n"
  "1 to insert an element into the list. \n"
  "2 Print free place. \n"
  "3 to end. \n" );
}
void insert (passptr *sptr, int t, int p, char* value)
{
  passptr newptr, previousptr, currentptr, timeptr;
  newptr=new Pass;
  if (newptr != NULL)
  {
    exitt=0;
    strcpy(newptr->dest , value);
    newptr->time = t;
    newptr->place = p=1;
    newptr->nextPtr = NULL;
    previousptr = NULL;
    currentptr = *sptr;
    timeptr = NULL;
    while (currentptr !=NULL)
    {
      if (currentptr->time==t && strcmp(currentptr->dest, value)==0 &&    currentptr->place==5)
      {
        exitt=1;
        printf ("Error. Place is not available! \n");
        break;
      }
      if (currentptr-> time==t)
      {
        timeptr=currentptr;
      }
      previousptr=currentptr;
      currentptr=currentptr ->nextPtr;
    }
    if (exitt==0)
    {
      if (previousptr==NULL)
      {
        newptr->nextPtr = *sptr;
        *sptr=newptr;
      }
      else
    {
    previousptr->nextPtr=newptr;
    newptr->nextPtr = currentptr;
    newptr->place= timeptr->place+1;
    }
    }
  }
  else
  printf("%c not inserted. no memory available. value");
}
int isempty(passptr sptr)
{
  return sptr==NULL;
}
void printlist(passptr sptr)
{
  passptr currentptr;
  currentptr=sptr;
  while (currentptr !=NULL)
  {
    printf ("Time: %i\n",currentptr->time);
    printf ("Place: %i\n",currentptr->place);
    printf ("Dest: %s\n\n",currentptr->dest);
    currentptr=currentptr->nextPtr;
  }
}
pashka вне форума Ответить с цитированием
Старый 30.05.2009, 22:54   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от pashka
А теперь помогите реализовать это в язык с++ пожалуйста, недостаток знаний и отсутствие опыта мешают мне сделать это самому
Ну опыт сам не придет, если не будете писать код.
Цитата:
Вроде выглядит просто: от максимального числа мест (5) отнимаем пасажиров едущих рейсом A->C, это и будет колличество свободых мест в точке В.
Как я понимаю, просто вместе с
Код:
 Time1--;
и другими уменьшаете количество мест в B.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 23:39   #6
pashka
 
Регистрация: 30.05.2009
Сообщений: 6
По умолчанию

Цитата:
...уменьшаете количество мест в B.
чего то я маленько не понял... но зато вот что придумал...
если предположим, что тут:
Код:
      
case 1:
      printf ("Enter a time:");
      scanf ("\n%i", &t);
      printf ("Enter a dest:");
      scanf ("\n%s", item); //вот тут
      insert(&startptr, t, p, item);
      printlist(startptr);
      break;
вводим только числа 2 или 3 (Соответственно пунктам B и С), либо буквы B или С. Тут:
Код:
      
case 2:
      Time1=5;
      Time2=5;
      Time3=5;
      currentptr=startptr;
      while (currentptr !=NULL)
      {
        if (currentptr->time==1 && значение введенное выше==3(либо С)) //что надо сделать, что бы было так? я не знаю:(
        {
          Time1--;
        }
        if (currentptr->time==2 && значение введенное выше==3(либо С))
        {
          Time2--;
        }
        if (currentptr->time==3 && значение введенное выше==3(либо С))
        {
          Time3--;
        }
        currentptr=currentptr->nextPtr;
      }
      printf ("Free place on time 1: %i\n", Time1);
      printf ("Free place on time 2: %i\n", Time2);
      printf ("Free place on time 3: %i\n", Time3);
      break;
pashka вне форума Ответить с цитированием
Старый 30.05.2009, 23:46   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну вот заводите 2 переменные. B и C (это количества свободных мест в этих пунктах). Изначально равны 5.
А в цикле после первых трех if'ов (которые смотрят на time) добавляете еще 2:
Код:
if(currentptr->dest==2) B--;
if(currentptr->dest==3) C--;
примерно так.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 31.05.2009, 00:07   #8
pashka
 
Регистрация: 30.05.2009
Сообщений: 6
По умолчанию

я так пробывал уже, прировнять dest к числу, нельзя так, ругается, вот что пишет: не может конвертировать 'int' в 'char *'
pashka вне форума Ответить с цитированием
Старый 31.05.2009, 00:16   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от pashka
я так пробывал уже, прировнять dest к числу, нельзя так, ругается, вот что пишет: не может конвертировать 'int' в 'char *'
Ну я же для примера написал.
Ну делайте так:
Код:
if(strcmp(currentptr->dest,"2")==0) B--;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 31.05.2009, 00:37   #10
pashka
 
Регистрация: 30.05.2009
Сообщений: 6
По умолчанию

Огромное вам спасибо теперь работает все отлично) вот что я сделал
Код:
while (currentptr !=NULL)
{
	if (currentptr->time==1 && strcmp(currentptr->dest,"3")==0)
	{
		Time1--;
	}
	if (currentptr->time==2 && strcmp(currentptr->dest,"3")==0)
	{
		Time2--;
	}
	if (currentptr->time==3 && strcmp(currentptr->dest,"3")==0)
	{
		Time3--;
	}
	currentptr=currentptr->nextPtr;
}
Теперь свободные места показываются на все три "времени" в промежуточном пункте В
еще раз большое вам спасибо!
pashka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите разобраться!!!!! Даринка Microsoft Office Excel 1 25.04.2009 00:19
Помогите разобраться. littlecoder Общие вопросы Delphi 5 21.12.2008 20:30
Помогите разобраться Proof БД в Delphi 13 19.05.2008 10:59
Помогите разобраться! Holodok Помощь студентам 12 02.05.2008 18:13