This is one of my first C programs. I am trying to make a guess the number game and I have used the debugger to work out that the line where I am calling for the rand_number function the variable 'r' is going back to '1'. I can't work out why.
If I put the code into the main() the program works as expected but I am wanting to use a function for experience
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void rand_number (int r) //Function to generate a random number and assign it to 'r'.
{
srand(time (NULL));
r = rand()%1000+1;
}
int main()
{
int guess, r, correct=0;
rand_number (r); //Run the random number function (This is where 'r' is switching back to '1'
printf("Guess a number!\n"); //User takes a guess
scanf("%d", &guess);
while (correct != 1) //Loop to give the user multiple guesses until they are correct
{
if(guess == r)
{
correct++;
}
else if (guess < r)
{
printf("Too low, please guess again.\n");
scanf("%d", &guess);
}
else
{
printf("Too high, please guess again.\n");
scanf("%d", &guess);
}
}
printf("Congratulations! You guessed it!");
return 0;
}
You are passing r to rand_number() by value, that means rand_number() can only modify it on it's local scope.
If you want it to modify the original variable in the caller you have to pass it as a pointer.
void rand_number(int *r)
{
*r = rand()%1000;
}
int main()
{
int r;
rand_number(&r);
...
}
Or simply return the value.
int rand_number()
{
return rand()%1000;
}
int main()
{
int r = rand_number();
....
}
Another problem is that you are calling srand() every time. You are supposed to seed it only once, if you keep calling this function you will reset the random number generator and it will keep generating the same number.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int rand_number ()
{
srand(time (NULL));
return rand()%1000+1;
}
int main()
{
int guess, r, correct=0;
r = rand_number (); //return the value here
//rest of the code
}
use the return method to retrieve the value from rand_number
In C, if you want to change a value of a variable inside a function, you have to pass a pointer to the function like this:
void rand_number(int* r)
{
srand(time(NULL));
*r = rand()%1000 + 1;
}
and call it byrand_number(&r). Another way is to return the random number inside the function and assign it to r, like this:
int rand_number()
{
srand(time(NULL));
return rand()%1000 + 1;
}
Related
I Wrote this code which can identify whether a number is a Armstrong number or not
#include <stdio.h>
#include <stdlib.h>
int n;
const int input()
{
printf("insert n:");
scanf("%d",&n);
return n;
}
int Num_amount()
{
int amount=0;
while(n>=10)
{
amount++;
n=n/10;
if(n<10)
amount++;
}
return amount;
}
int Armstrong()
{
n=input();
int v;
int z=0;
int y=10
int x=Num_amount();
int m[100]={};
int i;
for(i=0;n>=10;i++)
{
v=n%10;
m[i]=pow(v,x);
z=z+m[i];
y=y*10;
}
return z;
}
int main()
{
int z=Armstrong();
printf("%d",z);
}
When run with n=153 i always get 0.After several debugging,I found out the problem is somewhere in the Armstrong function(most likely)
int Armstrong()
{
n=input();
int v;
int z=0;
int y=10
int x=Num_amount();
int m[100]={};
int i;
for(i=0;n>=10;i++)
{
v=n%10;
m[i]=pow(v,x);
z=z+m[i];
y=y*10;
}
return z;
}
The debug watches indicate that instead of execute the for loop,it went straight to the return z line,I have tried everything but still can't figure it out.Can you tell me what the problem is?
You are getting the wrong result because of some logical error. When you are choosing a variable to be global, you need to consider that the variable value can be modified by any function and in this case, you have already modified its value in num_amount function. You have also made some logical error in Num_amount and Armstrong function.
You haven't included math.h header file for pow.
Here is your modified code,
#include <stdio.h>
#include <stdlib.h>
#include<math.h> //<-------------Should have included
int n;
const int input()
{
printf("insert n:");
scanf("%d",&n);
return n;
}
int Num_amount() //<------------modified
{
int z = n; //<--------take a copy of global n
int amount=0;
while(z>0)
{
amount++;
z=z/10;
}
return amount;
}
int Armstrong() //<------------modified
{
n=input();
int v;
int z=0;
int x=Num_amount();
int i;
while(n>0)
{
v=n%10;
z+=pow(v,x);
n/=10; //<-------modification of global n
}
return z;
}
int main()
{
int z=Armstrong();
printf("%d",z);
}
Found a lot problems with the code. Here is a modified version.
1. Do not use a global variable.
2. Make calculation for power easier.
3. Return the status of result, not the result. You want to check whether number is Armstrong or not.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int no_digits(int n){
int digits = 0;
while(n){
digits++;
n = n/10;
}
return digits;
}
int armstrong(){
int n;
printf("insert n:");
scanf("%d",&n);
int digits = no_digits(n);
int curnum = 0,original = n;
while(n){
curnum += pow(n%10,digits);
n /= 10;
}
if(original == curnum)
return 1;
return 0;
}
int main(){
if(armstrong())
printf("Is Armstrong\n");
else printf("Not Armstrong\n");
}
Let's take a look at your loop:
for(i=0;n>=10;i++)
{
v=n%10;
m[i]=pow(v,x);
z=z+m[i];
y=y*10;
}
What's the value of n at this point? You've set it in the previous call to Num_amount like so:
while(n>=10)
{
amount++;
n=n/10;
if(n<10)
amount++;
}
So, after Num_amount has finished executing, n must be less than 10, meaning the loop in Armstrong won't execute.
This is a big reason why you shouldn't use globals, even in a toy program like this. If you use it for different purposes in different places, you just create headaches like this.
At the very least, you should change your code such that n is passed as a parameter to Num_amount and Armstrong.
Your function Num_amount() return "n" value is already less than 10 and for loop never run.
I need to write a function to compute a^b but I am not allowed to use pow. Any ideas? I am lost.
It looks like problem is in main now...
Somewhere it gets that vys is what i characterise it. So if i set that vys=1 in main i get 1 in output..
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <unistd.h>
void multiplied(int b, int n)
{
int i=1, vys=1;
while (i<=n)
{
vys *=b;
i++;
}
return vys;
}
main(void)
{
int b=0, n=0, vys=1;
printf("Give numbers b and n but they must be in interval <0,10>!\n");
scanf("%d %d", &b, &n);
if ((b < 0 || b>10) || (n<0 || n>10))
{
printf("Numbers are not in interval <0,10>!\n");
}
else
{
printf("Number is in interval so i continue...\n");
sleep(2);
vys= multiplied(&b, &n);
printf("%d", vys);
}
Let's be explicit.
First, this
void multiplied(int *b, int *n)
returns an int, so say so.
int multiplied(int *b, int *n)
Next, you initialised variables in main: do the same here.
int i, vys;
Like this:
int i=1, vys=1;
Now let's look at the loop:
while (i<=n)
{
vys=*b**b;
i++;
}
As it stands, you are setting vys to something over and over again in the loop.
You want to multiply up, e.g. 2, then 2*2, then 2*2*2, .... if you want a power of two:
while (i<=n)
{
vys *= *b;
i++;
}
Now, you don't need to pass pointers.
int multiplied(int b, int n)
{
int i=1, vys=1;
while (i<=n)
{
vys *= b;
i++;
}
return vys;
}
Edit:
Watch out for when you call the function:
main(void)
{
int b=0, n=0, vys;
//input and checking code as you have it
multiplied(&b, &n); //<---- return ignored
printf("%d", vys); //<-- print uninitialsed local variable
}
Change you last two lines:
vys = multiplied(&b, &n); //<---- return captured
printf("%d", vys); //<-- print returned variable
Edit 2:
With the change to use int in the function and not pointers, pass the ints not their addresses:
vys = multiplied(b, n); //<---- pass the ints not their addresses
printf("%d", vys); //<-- print returned variable, which should vary now
Here you have a simple code:
#include <stdio.h>
long long intpow(int a, int b)
{
long long tempres = 1;
while(b--)
tempres *= a;
return tempres;
}
int main(void) {
printf("%lld\n", intpow(5,10));
return 0;
}
you need much larger int to accommodate the result.
You can play with it yourself: https://ideone.com/4JT6NQ
What's wrong with my code? It always returns the last number but not the largest? I have spent the last half and hour scratching my head & I still can't find what's wrong here..
Please help
// Largest among ten numbers
#include <stdio.h>
#include <conio.h>
int num[10],large,b; // Global Variables
int largest(int a); // Function protype
int main()
{
for(int i=0;i<5;i++)
{
printf("Enter number %d = ",i+1);
scanf("%d",&num[i]);
large = largest(num[i]); // Calling Function
/*
printf("Num(%d)= %d",i,num[i]); // Testing
printf("\nLargest for now = %d\n\n",large); // Testing
*/
}
printf("\n\n\n%d is the largest",large);
getch();
}
int largest(int a) // Function definition
{
if (a>=b)
{
return a;
b=a;
}
else
{
return b;
}
}
The problem is here:
if (a>=b)
{
return a;
b=a;
}
You return before assigning so b is always 0. Just do the assignment before returning i.e.
if (a>=b)
{
b=a;
return a;
}
Demo
I can't seem to figure out what is wrong in my code, when It comes to the first scanf in do while loop, I enter a number and it just stops there.
If I put printf("Something"); after that scanf, it isn't printed so it isn't a infinite loop. Also program does not just freeze, when I go into Task Manager, it takes up CPU, so it is doing something.
My program is supposed to load resistors and calculate their parallel equivalent, until I type in 'done', and then print out the calculated number.
#include <stdio.h>
#include <stdlib.h>
typedef struct o{char om[20];}RESISTOR;
int finish(char *s)
{
if( s[0]=='d' && s[1]=='o' && s[2]=='n' && s[3]=='e' && s[4]==0 )
return 0;
else return 1;
}
int power(int n, int pows)
{
int expo=1;
while (pows)
{
expo*=n;
pows--;
}
return expo;
}
int convert(char *s)
{
int broj,c;for(c=-1;s[c];c++);
for(int i=0;s[i];i++)
{broj+=(s[i]-0x30)*power(10,c-i);}
return broj;
}
double paralel(double old, int new)
{
double num;
num=((double)new*old)/(old+(double)new);
return num;
}
int main()
{
int n=0;double para;
RESISTOR *p=(RESISTOR *)malloc(1*sizeof(RESISTOR));
int *convertnum=(int *)malloc(1*sizeof(int));
do
{
printf("R%d= ",n+1);
scanf(" %s", (p+n)->om);
convertnum[n]=convert((*(p+n)).om);
if(n==0) para=convertnum[n];
else if (finish((*(p+n)).om)) para=paralel(para,convertnum[n]);
n++;
if(finish((*(p+n-1)).om))
{
p=(RESISTOR *)realloc(p, n*sizeof(RESISTOR));
convertnum=(int *)realloc(convertnum, n*sizeof(int));
}
}while(finish((*(p+n-1)).om));
printf("\n");printf("\n");
printf("Re= %.2f",para);
free(p);free(convertnum);
printf("\n");
return 0;
}
for(c=-1;s[c];c++); accesses s[-1], which might be 0, which means c-i in power(i,c-i) is negative, and thus the while(pows){pows--} has to go through 2^64 loops which may take a while. Your program should not take any measurable cpu time.
#include <stdio.h>
#include <stdlib.h>
int get_num(int num);
void read_num(int num);
int main()
{
int num;
do
{
get_num(num);
if(num == 1)
read_num(num);
}while(num != 0);
}
int get_num(int num)
{
printf("Please enter an integer from 0 and 2\n");
scanf("%d", &num);
if (num == 1)
return num;
}
void read_num(int num);
{
printf("Hello.\n");
}
When the user enters 1, the read_num function never gets called? I don't understand why? I thought return num; returns what num back to main. And if num == 0, the program terminates, and if num == 1, then the read_num function should be called.
There is quite a lot wrong with your code:
main() and getNum() are both declared as returning an int, yet main() never returns anything and getNum() returns only if the user enters 1. If you have a function returning anything other than void, make sure that every possible control flow has an appropriate return statement.
Then there is the issue with call by value vs call by reference. You should really look that up, because this is not the right place to explain and many people have written about better than I can.
read_num(num);
num is undefined here, you might understand that better once you know how C passes parameters.
The same goes for returning values. Functions in C return values (declared by the return type as in int get_num(). When you call a function like that you can assign the return value to a variable. In main you could write int number = get_num()
Your code could look a little bit like that, but I'm not sure if that's what you really want it to do:
int main()
{
int num;
do {
num = get_num();
if(num == 1) {
printf("%d\n", num);
}
} while(num != 0);
return 0;
}
int get_num(int num)
{
printf("Please enter an integer from 0 and 2\n");
scanf("%d", &num);
if (num == 1)
return num;
return 0;
}
C uses pass by value not pass by reference, as such your are just working with a COPY of the value stored in the variable "num" of your main function, when you enter get_num. Manipulation the value of the variable "num" in get_num won't do any change to the value of the variable "num" in your main function.
To use the "calculated" value in your main function you have to assign the return value of your get_num function to the variable "num" in your main function.
Just replace the line
get_num(num);
with
num = get_num(num);
and everything should be fine.
EDIT: To return more than one value you would have to pass pointers to the desired storage location of the return values to a function.
As an example here a variation of your program using a pointer instead.
#include <stdio.h>
#include <stdlib.h>
int get_num(int num);
void read_num(int num);
int main()
{
int num = 0; /* better give it a defined value here */
int n_args_read;
do
{
n_args_read = get_num(&num);
if(n_args_read == 1)
read_num(num);
}while(num != 0);
}
int get_num(int *num)
{
printf("Please enter an integer from 0 and 2\n");
return scanf("%d", num);
}
void read_num(int num);
{
printf("Hello.\n");
}