Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Programming (http://www.chiefdelphi.com/forums/forumdisplay.php?f=51)
-   -   C Programming Homework Help Needed (http://www.chiefdelphi.com/forums/showthread.php?t=57552)

EricVanWyk 01-07-2007 15:39

Re: C Programming Homework Help Needed
 
The function you are looking for is called "sprintf".

Use it just like you would use printf to print a float. The trick is that it throws it into a string, rather than at the console.

Code:

char * buffer = new char[10];
float f = 12.4;
sprintf(buffer,"%f",f);

I think... I don't have a C compiler in front of me.

Pat McCarthy 01-07-2007 20:48

Re: C Programming Homework Help Needed
 
Is there a header file you need to include?
I'm getting a 'no prototype for function' error for the sprintf function.

chris31 01-07-2007 21:05

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by Pat McCarthy (Post 633535)
Is there a header file you need to include?
I'm getting a 'no prototype for function' error for the sprintf function.

I believe you need to include stdio.h.

Pat McCarthy 01-07-2007 21:25

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by chris31 (Post 633538)
I believe you need to include stdio.h.

That made that error go away but I still don't really understand how to use the function.
The first line:

char * buffer = new char[10];

is confusing me.

eugenebrooks 01-07-2007 22:28

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by Pat McCarthy (Post 633546)
That made that error go away but I still don't really understand how to use the function.
The first line:

char * buffer = new char[10];

is confusing me.

The use of the "new" operator is C++ speak, not C speak.

char buffer[10]; /* bigger than 10 is a good idea */

If a static or automatic array (depending on the location
of the declaration) is good enough, or

char *buffer;

buffer = malloc(10); /* again, bigger than 10 is a good idea */

to allocate the storage using the heap allocator in C.

Eugene

Pat McCarthy 01-07-2007 22:40

Re: C Programming Homework Help Needed
 
1 Attachment(s)
I am using this code:
Code:

#include <stdio.h>

int main(void)
{
        char *buffer;

        buffer = malloc(10);
        float f = 12.4;
        sprintf(buffer,"%f",f);

        return 0;
}

Attached is the compile errors I am getting.

eugenebrooks 01-07-2007 22:46

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by Pat McCarthy (Post 633565)
I am using this code:
Code:

#include <stdio.h>

int main(void)
{
        char *buffer;

        buffer = malloc(10);
        float f = 12.4;
        sprintf(buffer,"%f",f);

        return 0;
}

Attached is the compile errors I am getting.

malloc() is likely declared in stdlib.h

Pat McCarthy 01-07-2007 23:01

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by eugenebrooks (Post 633568)
malloc() is likely declared in stdlib.h

It was. Thanks.

Now how can I use the char value?

I tried:
printf("%c", buffer);

But that printed out an an arrow pointing up.:p

eugenebrooks 01-07-2007 23:11

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by Pat McCarthy (Post 633570)
It was. Thanks.

Now how can I use the char value?

I tried:
printf("%c", buffer);

But that printed out an an arrow pointing up.:p

The result of sprintf is a null, '\0', terminated string.

printf("%s", buffer);


printf("%c", buffer[0]);
would print the first char

Eugene

Pat McCarthy 01-07-2007 23:14

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by eugenebrooks (Post 633573)
The result of sprintf is a null, '\0', terminated string.

printf("%s", buffer);


printf("%c", buffer[0]);
would print the first char

Eugene

Thanks! I think that should do it for this week!;)

Astronouth7303 03-07-2007 13:02

Re: C Programming Homework Help Needed
 
Quote:

Originally Posted by Pat McCarthy (Post 633570)
It was. Thanks.

Now how can I use the char value?

I tried:
printf("%c", buffer);

But that printed out an an arrow pointing up.:p

If you just want to print the value of the float, skip the sprintf() call and go straight to printf():
Code:

float f = 12.4;
printf("%f",f);

The *printf() family of functions (sprintf(), fprintf(), printf(), etc.) all work similarly. Becoming familiar with them will help.

If you ever have a simple question about a function, Google is your friend. (Just put in the function name or "C functionName".) Even Wikipedia has an article about most standard functions.

Pat McCarthy 02-09-2007 19:41

Re: C Programming Homework Help Needed
 
1 Attachment(s)
This code is supposed to convert a base 10 number, 123, into binary and display the value. Somewhere in the conversion, the division loop stops before it should, for a reason that I cannot identify.
Output with some diagnostic print statements attached.
Code:

/* Patrick McCarthy */

#include <stdio.h>
#include <math.h>

void base_convert(int base);
void convert_to_binary(int base, int number);
void divide(int D, int N, int *pq, int *pr);

int main(void)
{
        int base;
        int base_error;

        /* Gets the base from user and validates the value */
        do{
                base_error = 0;

                /* Collects base value from user */
                printf("Please enter an integer between 2 and 10 =>");
                fflush(stdin);
                scanf("%d",&base);

                /* Validate entry */
                switch (base)
                {
                        case 2:
                        case 3:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                        case 8:
                        case 9:
                        case 10:
                                break;
                        default:
                                base_error = 1;
                                printf("Invalid entry\n");
                }
        }
        while(base_error);

        /* Finds base N value of NUMBER */
//        base_convert(base);

        /* Converts number to Binary */
        convert_to_binary(base, 123);

        return 0;
}

void base_convert(int base)
{
        int i;
        int new[3];
        int NUMBER[3];
        int answer;

        //The base 10 number to be converted
        NUMBER[0] = 3;
        NUMBER[1] = 2;
        NUMBER[2] = 1;

        for(i = 0; i < 3; i++)
        {
                new[i] = ( NUMBER[i] * pow(base,i) );

                // Diagnostic
//                printf("i = %d; NUMBER[i] = %d; new[i] = %d\n", i, NUMBER[i], new[i]);
        };

        answer = new[0] + new[1] + new[2];

        printf("%d%d%d(Base 10) = %d(Base %d)", NUMBER[2],NUMBER[1],NUMBER[0],answer, base);

        return;
}

void convert_to_binary(int base, int number)
{
        int j,h;
        int q[16];
        int r[16];

        q[0] = number;

        for(j = 1; q[j] >= 0; j++)
        {
                printf("j=%d\n",j);
                divide(base, q[j-1], &q[j], &r[j]);
        }

        for(h = j; h <= 0; h--)
        {
                printf("%d", r[h]);
        }
}

void divide(int D, int N, int *pq, int *pr)
{
        int q,r;

        q = N / D;
        r = N % D;
       
        printf("Quotient: %d\nRemainder: %d\n\n", q,r);

        *pq = q;
        *pr = r;
}


EricVanWyk 02-09-2007 20:04

Re: C Programming Homework Help Needed
 
A few notes to make your life easier:

The switch(base) structure is confusing. I suggest replacing it with something that more clearly states what you want. I'd recommend something like

Code:

if(base <2 || base > 10) { Error !!}
I do like your use of the do while. However, I'd rather it set base_error=0.

Your printf statement doesn't really tell the user what you are going to do with the number. Put a more informative request in there.

"Please enter the base of the number (between 2 and 10)"

Please comment what q and r are. They are probably quotient and remainder, but explicit = maintainable.

Okay, enough with the picky details. Pain in the patookus, but trust me, you'll thank me later.


To clarify divide, I've used pass by reference, rather than by pointer. Also, I've added some more debuggging!
Code:

void divide(int D, int N, int &q, int &r)
{
        q = N / D;
        r = N % D;
       
        printf("%d/%d :: Quotient: %d\nRemainder: %d\n\n", N,D,q,r);
}



_____________________________________

Thought of a few more helper functions.
Code:

int convertFromBaseToBinary(int base, char * number_string)
{
        int num=0;        //number converted from string
        for(;number_string;number_string++)        //Scroll through the letters, starting with the most significant digit
                num = num*base+charToNumber(*number_string)       
        //num now holds the correct number
        return num;
}
int charToNumber(char a){
        return int(a-'0');
}
char numberToChar(int i){
        return char(i+'0');
}

EDIT 2
__________________________
Just noticed another bug.
for(j = 1; q[j] >= 0; j++)
will never terminate. I think you want q[j]>0 or maybe even q[j-1]>0

Edit 3
_________________________
And for more giggles, here is some Python
Code:

def convertToBase(num, base):
        s=[]
        while num is not 0:
                s=[num%base]+s
                num/=base
        return s


Pat McCarthy 02-09-2007 20:43

Re: C Programming Homework Help Needed
 
1 Attachment(s)
I'm having a little bit of trouble now. See output.
Code:

/* Patrick McCarthy */

#include <stdio.h>
#include <math.h>

void base_convert(int base);
void convert_to_binary(int base, int number);
void divide(int D, int N, int &q, int &r);

int main(void)
{
        int base;
        int base_error;

        /* Gets the base from user and validates the value */
        do{
                base_error = 0;

                /* Collects base value from user */
                printf("Please enter the base of the number (between 2 and 10) =>");
                fflush(stdin);
                scanf("%d",&base);

                /* Validate entry */
                if(base <2 || base > 10)
                {
                        base_error = 1;
                        printf("Invalid entry\n");
                }
               
        }
        while(base_error);

        /* Finds base N value of NUMBER */
//        base_convert(base);

        /* Converts number to Binary */
        convert_to_binary(base, 123);

        return 0;
}

void base_convert(int base)
{
        int i;
        int new[3];
        int NUMBER[3];
        int answer;

        //The base 10 number to be converted
        NUMBER[0] = 3;
        NUMBER[1] = 2;
        NUMBER[2] = 1;

        for(i = 0; i < 3; i++)
        {
                new[i] = ( NUMBER[i] * pow(base,i) );

                // Diagnostic
//                printf("i = %d; NUMBER[i] = %d; new[i] = %d\n", i, NUMBER[i], new[i]);
        };

        answer = new[0] + new[1] + new[2];

        printf("%d%d%d(Base 10) = %d(Base %d)", NUMBER[2],NUMBER[1],NUMBER[0],answer, base);

        return;
}

void convert_to_binary(int base, int number)
{
        int j,h;
        int q[16];
        int r[16];

        q[0] = number;

        for(j = 1; q[j]>0; j++)
        {
                printf("j=%d\n",j);
                divide(base, q[j-1], &q[j], &r[j]);
        }

        for(h = j; h <= 0; h--)
        {
                printf("%d", r[h]);
        }
}

void divide(int D, int N, int &q, int &r)
{
        int q,r;

        /* q is the quotient and r is the remainder */

        q = N / D;
        r = N % D;
       
        printf("%d/%d :: Quotient: %d\nRemainder: %d\n\n", N,D,q,r);
}


EricVanWyk 02-09-2007 20:54

Re: C Programming Homework Help Needed
 
You only half integrated my changes to divide.

q and r are coming in as references. You do not need to declare them again.

Also,
divide(base, q[j-1], &q[j], &r[j]);
should read as
divide(base, q[j-1], q[j], r[j]);

I'm going to be offline for a while. Good luck!


All times are GMT -5. The time now is 13:22.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi