Задачата за 15 точки от последния учебен час по програмиране

57 views
Skip to first unread message

Даниел Илиев

unread,
Jun 17, 2013, 11:34:30 AM6/17/13
to prog1...@googlegroups.com
#include <stdio.h>
#include <stdlib.h>

typedef struct Stack Stack;
typedef struct StackNode StackNode;

struct StackNode
{
  int value;
  StackNode *next;
};

struct Stack
{
  StackNode *top;
  int count;
};

Stack *stack_init();
void stack_push(Stack *stack, int element);
int stack_pop(Stack *stack);
int stack_peek(Stack *stack);

int main()
{
  Stack *stack = stack_init();
  int number = 0;
  char c;
 
  while((c = getchar()) != EOF)
  {
    if(c >= '0' && c <= '9')
    {
      number = 10 * number + c - '0';
    }
  }
 
  while(number > 0)
  {
    if((number % 2) == 0)
    {
      stack_push(stack,0);
      number = number / 2;
    }
    if((number % 2) != 0)
    {
      stack_push(stack,1);
      number = number / 2;
    }
  }

  while(stack->count > 0)
  {
    printf("%d",stack_pop(stack));
  }

  return 0;
}

Stack *stack_init()
{
  Stack *stack = (Stack *)malloc(sizeof(Stack));
  stack->top = (StackNode *)malloc(sizeof(StackNode));
  stack->top->next = NULL;
  stack->count = 0;

  return stack;
}

void stack_push(Stack *stack, int element)
{
  StackNode* node = (StackNode *)malloc(sizeof(StackNode));
  node->value = element;
  node->next = stack->top;

  stack->top = node;
  stack->count++;
}

int stack_pop(Stack *stack)
{
  if(stack->count > 0)
  {
    int result = stack->top->value;
    StackNode *top_for_deleting = stack->top;
    stack->top = stack->top->next;
    free(top_for_deleting);
    stack->count--;
    return result;
  }
  else
  {
    return -1;
  }
}

int stack_peek(Stack *stack)
{
  if(stack->count > 0)
  {
    return stack->top->value;
  }
}

Така младежи това е кода на програмата, която беше дадена днес за 15 точки. Условието е да се преобразува десетично число във двоично, като за тази цел трябва да бъде използван стек.

Обяснение на кода :

1. Виждате че getchar-ваме елементите от in.txt файл, като ако те са числа ги записваме като едно цяло число използвайки 'number = number * 10 + c - '0'' // Обяснението защо използваме това е в един от въпросите в групата.

2. Започваме да делим числото number, което сме getchar-нали от in.txt файла на 2 и в случай че остатъка от делението е 0 в стек-а записваме 0, в случай че е 1-ца записваме в стек-а 1-ца.

3. Някой може да питат защо записваме само 0 и 1 и дали има други остатъци, затова и това ще го обясня с малко примери :

- 5 делено на 2 ни дава 2 като цяла част и 1 остатък.
 - 6 делено на 2 ни дава 3 като цяла част и 0 остатък.
 - 7 делено на 2 ни дава 3 като цяла част и 1 остатък.
 - 8 делено на 2 ни дава 4 като цяла част и 0 остатък.
И така нататък и така нататък.

4. Изкарваме елементите от стек-а с функцията pop() /* stack_pop(stack) */, като се има предвид че тя не принтира всичките елементи от стек-а, а само последния влязъл (Стек-а използва системата LIFO /Last in, first out/), затова трябва да направим цикъл, който да обходи целия стек, за да получим крайния резултат.


Надявам се да съм Ви бил полезен и мерси за вниманието :)
Reply all
Reply to author
Forward
0 new messages