|
if you want to be picky, shouldt it be
<< or >>? since they cant and dont use both at the same time..
*.*
|
|
|
|
|
std stream classes are type safe. Var arg nature of printf family is dangerous. Form the purist point of view std is more OO.
|
|
|
|
|
Thanks guys, I'm doing a lot of reading...every little bit helps.
|
|
|
|
|
I have been trying alter the following program to store 13 digit numbers, so I tried to use "double" instead of "int" for my return type. It doesn't work. I want to create a sort program that can store 13 digit part numbers and display corresponding character data relating to those numbers. Is a binary sort function good for this or should I consider a different type of function? If the binary sort will work good, how do I use 13 digit double data types with this function? Thanks.
------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int values[] = { 10, 20, 25, 40, 90, 100 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int main ()
{
int * pItem;
int key = 40;
pItem = (int*) bsearch (&key, values, 6, sizeof (int), compare);
if (pItem!=NULL)
printf ("%d is in the array",*pItem);
else
printf ("%d is not in the array",key);
return 0;
}
|
|
|
|
|
Why doesn't using double work? You only need to make a few changes:
double values[] = { 10.0, 20.0, 25.0, 40.0, 90.0, 100.0 };
int compare (const void * a, const void * b)
{
double _a = *(double*)a;
double _b = *(double*)b;
if( ABS(_a - _b) < 0.00000001 )
return 0;
else if( _a < _b)
return -1;
else
return 1;
}
int main ()
{
double * pItem;
double key = 40;
pItem = (double*) bsearch (&key, values, 6, sizeof (double), compare);
if (pItem!=NULL)
printf ("%lf is in the array",*pItem);
else
printf ("%lf is not in the array",key);
return 0;
} Since doubles are not exact, when you compare them, you might want to add in a delta value, where numbers that are within this amount of each other are considered equal, like I've put in the compare function. If you don't want this, then change the first if statement so it is just (_a == _b) .
BTW, when you're using int s, I don't recommend just returning the difference between them, rather return -1 if a < b or 1 if a > b or 0 if they are equal. Some implementations of the bsearch() function rely on these values being exact.
Hope this helps,
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ryan,
Question: what is ABS? I'm getting an error message saying it's an undeclared identifier.
Thanks, Dave
|
|
|
|
|
Oops, left that out . It just finds the absolute value.
#define ABS(a) ( (a) < 0 ? -(a) : (a) )
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
abs() instead of ABS() should do it (absolute value, takes the number without the sign), and if not, then add an #include<math.h>
~RaGE();
|
|
|
|
|
Your code worked Ryan! Thanks guys! I still have a couple questions though. Please look over my modified code below. As you can see, I've replaced the decimal numbers with my 13 digit numbers I'll be using in the program. I've also added a "cout" and "cin" statement so I can enter my own selections.
The problem is that when I enter one of the 13 digit numbers, the program tells me that the number is not in the array. Why might that be? Also, do I HAVE to use a decimal with type "double?" Am I using the right data type for a 13 digit number with no decimal?
----------------------------------------------------------
<br />
#include <stdio.h><br />
#include <math.h><br />
#include <iostream.h><br />
#include <stdlib.h><br />
<br />
<br />
double values[] = {5758020005287, 7937030006574, 4748020008574, <br />
4847020007584, 9500020004758, 3849573800596 ,5758020005007, <br />
7557030006574, 4745520008574, 4847020005584, 9585520004758, <br />
3849573846696 ,3748596078661 , 4615243374995 , 1115364759770};<br />
int compare (const void * a, const void * b)<br />
{<br />
#define ABS(a) ( (a) < 0 ? -(a) : (a) ) <br />
double _a = *(double*)a; <br />
double _b = *(double*)b; <br />
if( ABS(_a - _b) < 0.00000001 ) <br />
return 0; <br />
else if( _a < _b)<br />
return -1; <br />
else <br />
return 1;<br />
}<br />
int main ()<br />
{ <br />
double * pItem; <br />
cout<<"please enter an NSN number"<<endl; <br />
double key;<br />
cin>>key; <br />
pItem = (double*) bsearch (&key, values, 15, sizeof (double), compare); <br />
if (pItem!=NULL) <br />
printf ("%lf is in the array\n",*pItem); <br />
else <br />
printf ("%lf is not in the array\n",key); <br />
return 0;<br />
}<br />
--------------------------------------------------------
Thanks again, Dave
VC++ 6.0
|
|
|
|
|
Hi!
This is a very special question :
When debugging my .dll, which goes along with an intern software of our own, VC++ freezes after a few hit on F5. In debug or release, launching the app will work perfectly. Only when debugging. This does not happen when using only step by step (F10). It is just like another process uses 110 % of CPU, leaving VC++ with -10
VC6.0++ SP4 under XP SP1.0.
[Edit] Well, my question is : has already someone experienced something like that ? Any clue about what it could be ?
~RaGE();
|
|
|
|
|
I have never experienced your problem before but installing SP5 for VC6 fixes a lot of weird problems. Hopefully that would solve your problem as well.
// Afterall, I realized that even my comment lines have bugs
When one cannot invent, one must at least improve (in bed).-My latest fortune cookie
|
|
|
|
|
I was hoping someone would explain the line below to me...
printf ("sqrt(%lf) = %lf\n", x, result );
---------------------------------------------------
I know what the sqrt and printf functions do, but the
%1f\n lost me.
-----------------------------------------------------
The complete program is below...
#include <stdio.h>
#include <math.h>
#include <iostream.h>
int main ()
{
double x, result;
cout<<"please enter any number";
cin>>x;
result = sqrt (x);
printf ("sqrt(%lf) = %lf\n", x, result );
return 0;
}
thanks, Dave
|
|
|
|
|
The \n is a carriage return (begins a new line).
%1f indicates a double with at least one digit.
~RaGE();
|
|
|
|
|
In fact, the sqrt that is inside the printf function is just text so this is not the function !!!
For the '%1f\n' that means: you will have the third argument of printf (that means, result) formated (%) as a float (f) with minimum 1 (1) character and then followed by a newline (\n).
Everything you see in the printf function is just formated text , so in the end you will have something like that at the output: sqrt(9) = 3
Hope this helps
|
|
|
|
|
In fact, I think it is %lf and not %1f, l meaning that a "long" type would be used (it is an additional indication of size for the provided type), but this has no meaning with "f".
~RaGE();
|
|
|
|
|
I'm still confused on the line below...
printf ("sqrt(%lf) = %lf\n\n", x, result );
Where does the %lf get the square root value from to display? I see that x is passed as an argument into the sqrt function, but where does the return(the square root) output?
Thanks
--------------------------------------------------------
#include <stdio.h>
#include <math.h>
#include <iostream.h>
int main ()
{
double x, result;
cout<<"please enter any number";
cin>>x;
result = sqrt (x);
printf ("sqrt(%lf) = %lf\n\n", x, result );
return 0;
}
|
|
|
|
|
[Also look at the cedcric's post to get infos]
OK. Obviously you are not familiar with the printf function
printf works as follow : it takes as parameters a string, plus a certain quantity of variables, whose value you want to display in the string. The way the things are displayed (the formatting) will be set up in the string using a % sign followed by characters indicated precision, width andtype of variable.
So in your program,
cin>>x;
result = sqrt (x);
will put the square root of x, which is the variable you type in wenn running the programm, in the variable result.
printf ("sqrt(%lf) = %lf\n\n", x, result );
This actually displays the string "sqrt(%lf) = %lf\n\n", replacing the first occurency of %+formatting with the value of x, the second one with the value of result (since x and result are the two other parameters of printf). lf means in this case that the type is a double. So the display would be "sqrt(4) = 2" + two return carriage(the two \n), leaving two blank lines in your console, if x=4.0 (so result =2.0 )
The \n is a special caractère such as \r (which puts the cursor to the beginning of the line) or \\ which displays a \. This has nothing to do with printf.
~RaGE();
|
|
|
|
|
Rage wrote:
caractère
I thought we spoke english on CP!
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Excellent ! That's a lapsus ! Actually, someone went to talk to me while I was writing my answer ... somehow my French2English() thread got interrupted by a corrupted CEvent from my TalkFrench() function ... seems that intern synchronisation needs to be refined
Or maybe I need some vacation ...
~RaGE();
|
|
|
|
|
Rage wrote:
somehow my French2English() thread got interrupted by a corrupted CEvent from my TalkFrench() function ... seems that intern synchronisation needs to be refined
Or maybe I need some vacation ...
Either you're a robot, or you need some serious vacation.
Or maybe both, I guess
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
My other name is C3PO.
~RaGE();
|
|
|
|
|
Rage wrote:
My other name is C3PO.
Now it all makes sense
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
I think you don't understand really the printf function. The sqrt is NOT a function, this is just text. So, when you see the first '%' that means that the second argument of the sprintf function (wich has a variable number of arguments) will be formated in a certain way, here: as a float!
Everything else that is not recognized as a formating string will be sent as TEXT characters to the output. You then have a second '%' wich take the third parameter (result) and format it as a float and send it as TEXT to the output. So, to answer your question: the square root is then taken from the argument list of the printf function!
Example:
if you enter 9 in your program, x will be 9. Then, in result you will have 3. Then your printf function can be "shown" as:
printf("sqrt(%lf) = %lf\n\",9,3); (I replaced x and result with their respective values.
So, this function will print the following STRING: sqrt(9.00000) = 3.00000
with 2 newlines (\n that are not formating string).
You can replace "sqrt" in the printf function by anything you want, it will work but print the other string instead of "sqrt"
|
|
|
|
|
Incredible how these three lines of code are not easy to explain Fortunately your two answers are far more consistant than mine, so I think it is clear now ...
~RaGE();
|
|
|
|
|
I remember the first time I tried to understand this function! That was horrible: the documentation is not really clear
|
|
|
|
|