0

For the life of me, I cannot figure out my my program is parsing out and not compiling. All my brackets seem on point. Thanks!

My task at hand is:

You are required to write a C program that accepts two decimal integers, say d and r. You may assume that the rst decimal integer d is nonnegative and that the second decimal integer r which represents the radix, will be one of 2, 3, 4, : : :, 15, 16. The program should convert the rst decimal integer d into its representation in radix r and print the result. Examples: (i) Suppose the rst decimal integer is 138 and the second decimal integer is 16. In this case, the output produced by your program should be 8A, which is the hexadecimal (radix 16) representation of the decimal integer 138. (ii) Suppose the rst decimal integer is 284 and the second decimal integer is 13. In this case, the output produced by your program should be 18B, which is the radix 13 representation of the decimal integer 284. (In base 13, the digits used are 0, 1, 2, : : :, 9, A, B and C, where A, B and C represent 10, 11 and 12 respectively.) Your program should be written so that it handles just one pair of integers. Thus, the outline for your program is as follows. (Note that no error checks are needed.) 1. Prompt the user to type two decimal integers. 2. Read the two integers. 13. Convert the rst integer into its representation in the radix specied by the second integer. 4. Print the representation and stop. Your program must read the two integers from stdin and write the answer to stdout. You may assume that when prompted, the user will type two integers separated by one or more spaces. Note: Recall that for any radix r 2, the digits to be used are 0, 1, : : :, r 1. Use the letters A, B, C, D, E and F to represent 10, 11, 12, 13, 14 and 15 respectively, as done in the hexadecimal system. Thus, representations in radix 11 can use the digits 0, 1, : : :, 9, A; representations in radix 12 can use 0, 1, : : :, 9, A, B, and so on.� Blockquote

My code thus far is:

#include <stdio.h>
#include <stdlib.h>
#define OFFA 55
#define OFF0 48

struct charNode{
  char digit;


struct charNode *next;}; struct charNode *head;
int NextParse(int *, int);
char charint( int ); char pop();
void push( char );



struct charNode *newCharNode( );
int main(void)

{int decimal,radix;

  printf( "Two num required:\n" );
  scanf( "%d%d", &decimal, &radix );
  do{push( charint( NextParse( &decimal, radix )));}



  while( decimal >0 );
  while( head != NULL )

  {printf( "%c", pop( ) );}
  printf( "\n" ); return 0;}



int NextParse( int *decimal,int radix )
{ int digit=*decimal%radix; *decimal = *decimal/radix;

  return digit;

char (int x) {
  if ( x > 35 )
  {
    printf("This radix is too large, try again"); exit(1);
  }
  else if (x > = 10) return (char) (x + OFFA);
  else return (char) (x + OFF0);
  }

void push(char digit) {
  struct charNode *temp; 
  if (head == NULL) {
    head = newCharNode(); head -> digit = digit; head -> next = NULL;}
  else {temp= newCharNode( ); temp -> digit=digit; temp -> next=head;head=temp;}
}
char pop(void) {
  char digit; struct charNode *temp;
  if (head == NULL) {
    printf("Cannot complete this task. Empty s tack");
    exit(2);}
  else {
    temp = head; digit = head -> digit;
    head = head -> next; free(temp); return digit;}}

struct charNode *newCharNode(void) {
 struct charNode *memory = (struct charNode *) malloc(sizeof(struct charNode)); //memory adress for new node
 if (memory == NULL) {
   printf("Could not allocate memory"); exit(3);
 }
 else return memory;
}

Thanks for helping out.

DumbCoder
  • 5,696
  • 3
  • 29
  • 40
  • 2
    Could you post the compile errors you've been given? Also, try to apply a coding convention and stick to it, I see various inconsistencies in your coding style which makes it hard to read. – pbond Oct 04 '13 at 22:52
  • 2
    Why is is tagged with `java`? – PM 77-1 Oct 04 '13 at 23:00
  • You've a rather glaring error around line 41 "char (int x) {". Are you sure you copied the code correctly? It looks like 'NextParse' has not been properly terminated (}), and that the next function was not given a name. pbond is also correct, find a coding style and stick with it. It will make finding such problems much easier for you as well as us. Here's one link to a list of such styles: http://www.maultech.com/chrislott/resources/cstyle/ – EdwinW Oct 04 '13 at 23:02
  • @pbond I am getting the following errors: `: In function `NextParse': :40: parse error before `char' : At top level: :44: parse error before `else'` Sorry for tagging java. My mistake. – redblue7293 Oct 04 '13 at 23:05

1 Answers1

0

On the assumption that the code posted above is correct, here is a better formatted version of the code. I make absolutely no guarantee that it does what you want, beyond the fact that the compiler doesn't immediately barf when I compile it.

/*
 * As suggested by pbond, pick a coding style and stick with it.  The
 * original code rather looked like you were using some IDE that was
 * deliberately hiding the formatting issues from you.  Here's the
 * code (sort of) corrected to one of many standards.
 */
#include <stdio.h>
#include <stdlib.h>
#define OFFA 55
#define OFF0 48

struct charNode {
  char digit;
  struct charNode *next;
};

struct charNode *head;

int NextParse(int *, int);
char charint( int );
char pop();
void push( char );
struct charNode *newCharNode( );

int main(void)
{
  int decimal,radix;

  printf( "Two num required:\n" );
  scanf( "%d%d", &decimal, &radix );
  do {
    push( charint( NextParse( &decimal, radix )));
  } while( decimal >0 );

  while( head != NULL ) {
    printf( "%c", pop( ) );
  }

  printf( "\n" );
  return 0;
}



int NextParse( int *decimal,int radix )
{
  int digit= *decimal % radix;
  *decimal = *decimal / radix;

  return digit;
}

/*
 * Here's where one of the errors was.  'NextParse' had not been terminated.  I've
 * added the closing bracket.
 */

/*
 * This is the other error.  It looked like it was supposed to be
 * the 'charint' function declared earlier.  However, the original
 * "char (int x)" wouldn't have passed the compiler.  That combined
 * with the failure to terminate 'NextParse' above, and a possibly
 * less than helpful compiler, lead to confusing syntax error messages.
 * The 'gcc' compiler correctly spotted the "char (int" error, and visual
 * examination after straightening out the style showed the 'NextParse'
 * error above.
 */
char charint (int x)
{
  if ( x > 35 )
    {
      printf("This radix is too large, try again"); exit(1);
    }
  else if (x >= 10)
    return (char) (x + OFFA);
  else
    return (char) (x + OFF0);
}

void push(char digit)
{
  struct charNode *temp; 
  if (head == NULL)
    {
      /*
       * Concatenating lines may look 'neat', but it makes maintenance a lot harder.
       */
      head = newCharNode();
      head -> digit = digit;
      head -> next = NULL;
    }
  else {
    temp= newCharNode( );
    temp -> digit=digit;
    temp -> next=head;
    head=temp;
  }
}

char pop(void) {
  char digit;
  struct charNode *temp;
  if (head == NULL)
    {
      printf("Cannot complete this task. Empty s tack");
      exit(2);
    }
  else
    {
      temp = head;
      digit = head -> digit;
      head = head -> next;
      free(temp);
      return digit;
    }
}

struct charNode *newCharNode(void) {
  struct charNode *memory
    = (struct charNode *) malloc(sizeof(struct charNode)); //memory adress for new node
  if (memory == NULL)
    {
      printf("Could not allocate memory");
      exit(3);
    }
  else
    return memory;
}

If you were using an IDE, I'd suggest one of two things:

1) Learn how to tune the IDE so that it puts your code into a standard style.

2) Pick a different IDE, this one is hiding way too much, and the error messages you've reported are not very informative.

If you weren't using an IDE, I'd suggest getting one and using suggestion (1) from above.

Which IDE you choose is dependent on your environment, and your personal preferences/style. IDE arguments are nearly religious in nature, so I've no intention of making any recommendations as to which IDE to use; only that you learn how to use it properly.

An ill-tuned IDE can cause you more grief than anything else.

EdwinW
  • 1,007
  • 2
  • 13
  • 32
  • As an aside: I've recently run into issues with Visual C++ users where the stock configuration of the compiler silently hides a plethora of warnings. Warnings that were actually crucial pointers to non-syntactical errors in the code. The 'gcc' compiler picked up on these issues. That lead to an argument about "(a) Visual C++ didn't complain, and (b) it's only a warning, it isn't important." – EdwinW Oct 04 '13 at 23:43
  • 1
    First, I don't care about (a), and (b) NO WARNING IS UNIMPORTANT UNTIL YOU UNDERSTAND WHY IT'S HAPPENING! Fix all warnings in your code. If you can't fix a warning, DOCUMENT IT IN THE CODE. See http://stackoverflow.com/questions/14288603/what-doesor-didvolatile-void-function-do – EdwinW Oct 04 '13 at 23:50