Recursion factorial code c# - "Invalid token" error - c#

I am attempting to write a recursion code that computes the factorial from a given number. (Factorial of 3 is "3*2*1 = 6"). I have written the following code, and the following error message is printed
"Invalid token '(' in class, struct, or interface member declaration"
I have checked my code and in my eyes, I can't see an error, is there anything I can do to fix the issue? The c# code is posted below.
(ps. I'm not a c# wizz.)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
public class Program
{
public static void Main(string[] args)
{
int num1;
int num2;
int num3 = 0;
Console.WriteLine("Insert number");
num1 = Console.ReadLine();
num2 = num1 -1;
factorial(num1, num2, num3);
Console.WriteLine("Your number is {0}", factorial());
}
Console.ReadKey();
static int factorial(int a, int b, int c)
{
if (a > 0)
{
a * b = c;
factorial(a - 1, c, c);
return c;
}
}
}
}

You have Console.ReadKey(); outside method declaration. Move it into public static void Main(string[] args) and it will work.

It wont like Console.WriteLine("Your number is {0}", factorial());
Your factorial function has 3 parameters, you've never declared one with none.
You need to keep the result and display it.
If you are interested, there are also ways to improve the actual factorial routine you've got too

There are a number of problems with your code, and it does not compile, lets go through each error
Invalid token '(' in class, struct, or interface member declaration
This, as pointed out in the other answers is the Console.Readkey() in the middle of your class outside of any method. Move it into the bottom of the Main method.
Cannot implicitly convert type 'string' to 'int'
This is due to the line num1 = Console.ReadLine(); as that method returns a string and you're trying to assign it to an int. The right way to deal with this is to check the user input, to ensure they have typed a number. For brevity I'll do it the wrong and just assume its right.
num1 = int.Parse(Console.ReadLine()); // Use TryParse here, and notify the user if they typed something wrong
No overload for method 'factorial' takes 0 arguments
This is because you've tried to call your factorial method with no arguments. I think you were trying to output the result from the call above.
var result = factorial(num1, num2, num3);
Console.WriteLine("Your number is {0}", result);
The type or namespace name 'a' could not be found (are you missing a using directive or an assembly reference?)
This is due to this line: a * b = c; which just doesn't make sense. I assume you meant c = a * b;
Finally
'Rextester.Program.factorial(int, int, int)': not all code paths return a value
You need to return a value outside the if of factorial. Here you then get into an endless loop, but at least your code compiles! Now just fix your algorithm. This is much simpler
static int factorial(int n)
{
if(n == 1)
return 1;
return factorial(n-1) * n;
}
Live example: http://rextester.com/OUCC98161

Related

(Hackerrank - Fair Rations) When return a string following error appears(C#). error CS0029: Cannot implicitly convert type string' to int

error CS0029: Cannot implicitly convert type string' to int
I'm trying to solve HackerRank's Fair Rations. I should return an Integer or string "NO". When I trying to return string "NO" the following error message appears
// Solution.cs(49,16): error CS0029: Cannot implicitly convert type `string' to `int'
Following is my code.
int temp = 0;
string s = "N0";
for(int i = 0; i < B.Length - 1; i++)
{
if(B[i] % 2 == 1)
{
B[i] = B[i] + 1;
B[i + 1] = B[i + 1] + 1;
temp += 2;
}
}
for(int i = 0; i < B.Length; i++)
{
if(B[i] % 2 == 1)
{
temp = 0;
}
}
if(temp > 0)
{
return temp;
}
else
{
return s;
}
How I return "NO" ?. When I use `Console.WriteLine()' following error messege appears
//Solution.cs(18,16): error CS0161: `Solution.fairRations(int[])': not all code paths return a value
I think I understand why you got confused. If you go to the site, and choose to write an answer in C#, this is the template you get:
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
using System.Text;
using System;
class Solution {
// Complete the fairRations function below.
static int fairRations(int[] B) {
}
static void Main(string[] args) {
TextWriter textWriter = new StreamWriter(#System.Environment.GetEnvironmentVariable("OUTPUT_PATH"), true);
int N = Convert.ToInt32(Console.ReadLine());
int[] B = Array.ConvertAll(Console.ReadLine().Split(' '), BTemp => Convert.ToInt32(BTemp))
;
int result = fairRations(B);
textWriter.WriteLine(result);
textWriter.Flush();
textWriter.Close();
}
}
But one of the requirements states:
If it's not possible to do this, print NO.
And the instructions say:
// Complete the fairRations function below.
That's a lousy template for a function that needs to also handle an additional condition of printing NO if the solution is not possible.
You'll have to modify the signature of the fairRations function to handle the case where the solution is not possible. You're also allowed to modify the code in Main, which is clearly inadequate for fulfilling the requirements of the challenge as is.
And if you need to write something other than the int result to the output, then you'll need to make a different textWriter.WriteLine call that outputs a string.
I strongly recommend the pattern used in functions like int.TryParse or Dictionary<TKey,TValue>.TryGetValue. That pattern is based on these two principles:
return a bool to indicate success/fail.
deliver the payload for the successful case (in this case: an integer) by means of an out parameter.
Modify the fairRations function like so:
static bool fairRations(int[] B, out int result) {
if (/* TODO: it is possible? */) {
result = /* TODO: whatever the result is */;
return true;
} else {
result = 0;
return false;
}
}
And you may want to modify the call in Main as follows:
change...
int result = fairRations(B);
textWriter.WriteLine(result);
to...
if (fairRations(B, out int result)) {
textWriter.WriteLine(result);
} else {
textWriter.WriteLine("NO");
}
Print a single integer taht denotes the minimum number of loaves that must be distributed so that every person has an even number of loaves. If it's not possible to do this, print NO.
This operations result can not be easily returned from a C# Functions. A C# Function has one return value, with a single type. And int and string are mutally exclusive return types.
Unless you are willing to go into complex and advaned machanics that do allow multiple return values (I would advise to copy the pattern used in TryParse, for bool/int return), you have to do the output inside the function with a Console.WriteLine(). That one can be given int or string. Wich also sounds more like what you are supposed to do. I would proably contain this whole code in the main function, at wich point no return makes sense.

Pipe sizing C# code gives unwanted result

I am new to C# and trying to figure out how to write simple codes to perform basic calculations. I tried to write code for pipe diameter and everything seems to be fine but the result is NaN.
I've tried to change locations for variables declarations as I suspect that there is a problem with. I tried also static keyword but without success.
This is the code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Pipe_Sizing
//This simple code is intended to calculate diameter of the pipe after getting flow and velcity values from the user
{
class Program {
//This method is created to read input from users and convert it to number
static void readnum(string inp, double num) {
inp = Console.ReadLine();
while ((num = double.Parse(inp)) < 0) {
Console.WriteLine("Sorry, you need value in digits");
inp = Console.ReadLine();
}
Console.WriteLine(num);
}
static string flo;
static double flox;
static string vel;
static double velx;
static void Main()
{
// Get the Flow value from thre user
Console.WriteLine("Please Enter the value of Flow in m3/hr");
readnum(flo, flox);
// Get the Velocity value from the user
Console.WriteLine("Please Enter the value of velcoty in m/s");
readnum(vel, velx);
double dd = (4 * flox) / (3.14 * velx);
double d = Math.Sqrt(dd);
Console.WriteLine("The diameter required for the pipe is " + d);
Console.ReadLine();
}
}
}
How to get the result as a number?
The method readnum does not return anything. The parameters of readnum (inp and num) are local variables to the method - changing their values will have no effect outside the method. Therefore in the Main method the variables flox and velx will still have their default values of 0.0. Change readnum so that it returns the num it parsed from the user input.
Many big No's in your code
static void readnum(string inp, double num)
This is not doing what you think it does (I assume): double is a value Type, meaning it get passed by value and not by reference: you code is going to modify the local (to readnum method) variable. Same for string inp: even if string is a reference type, it works as a value type in this context (for more on this google string c# immutable)
When in Main you call readnum, the variable you are passing are not modified
num = double.Parse(inp)
Parse will throw an exception if the input string is not convertible to a double (same for Parse methods for int, date, etc). You may want to use TryParse and check it return value before proceeding
static double flox;
static double velx;
You actually don't need to have these variables static (nor even class member): just declare them local for the function you are using them: the bigger the scope of a variable, the harder to handle it
static string flo;
static string vel;
Same as above more or less, you actually just need a local variable within readnum
double dd = (4 * flox) / (3.14 * velx);
.Net has a very convenient Math.Pi, much better then a 3.14
This can be a cleaner (and maybe working, not tested) version of your code:
using System;
using System.Text;
public class Program
{
//This method is created to read input from users and convert it to number
static double readnum()
{
string inp = Console.ReadLine();
double res;
while (!double.TryParse(inp, out res)) // add check for negative value
{
Console.WriteLine("Sorry, you need value in digits");
inp = Console.ReadLine();
}
Console.WriteLine(res);
return res;
}
public static void Main()
{
// Get the Flow value from thre user
Console.WriteLine("Please Enter the value of Flow in m3/hr");
double flox = readnum();
// Get the Velocity value from the user
Console.WriteLine("Please Enter the value of velcoty in m/s");
double velx = readnum();
double dd = (4 * flox) / (Math.PI * velx); //
double d = Math.Sqrt(dd);
Console.WriteLine("The diameter required for the pipe is " + d);
Console.ReadLine();
}
}

Converting Celcius to Fahrenheit - Double.TryParse

I have a successful clean code that does a conversion of Celcius to Fahrenheit using Double.Parse. However, I was curious on how it would look if I did a Double.TryParse but I can't seem to figure out how to complete the code. Once executed, I am able to present "Invalid Code", in my "if, else" but I still get this after my Invaild Output...
Please enter a value for conversion:
30x
Invalid code
The conversion from Celcius to Fahrenheit is: 32
using System;
using System.Text;
namespace CSharpBasics
{
class Program
{
public static double CelciusToFarenheit(string celciusTemperature)
{
//Converting string to a double for conversion
double celcius;
if (Double.TryParse(celciusTemperature, out celcius))
{
}
else
{
Console.WriteLine("Invalid code");
}
double fahrenheit = (celcius * 9 / 5) + 32;
return fahrenheit;
}
public static void Main(string[] args)
{
Console.WriteLine("Please enter a value for conversion:");
var input = CelciusToFarenheit(Console.ReadLine());
Console.WriteLine("The conversion from Celcius to Fahrenheit is: " + input);
}
}
}
You should verify your input before the conversion to make sure you never display invalid result for an invalid input but return a message notifying the wrong input first. Something like this:
public static double CelciusToFarenheit(double celcius)
{
double fahrenheit = (celcius * 9 / 5) + 32;
return fahrenheit;
}
public static void Main(string[] args)
{
Console.WriteLine("Please enter a value for conversion:");
var input = Console.ReadLine();
double celcius;
if (Double.TryParse(input, out celcius))
{
var result = CelciusToFarenheit(celcius);
Console.WriteLine("The conversion from Celcius to Fahrenheit is: " + result);
}
else
{
Console.WriteLine("Invalid code");
}
}
The method signature public static double CelciusToFarenheit(...) says that this method returns a value - and currently it does.
However, your program flow has to consider invalid input - and thus you need 2 information:
was the entered value a valid value
what's is the value
There are different methods to solve this issue, at least the following:
return a struct or object that holds both information
use the return value and indicate invalid results with exceptions
split the single method into 2 methods, one for checking validity and one for delivering the value.
Let's discuss the 3 options:
3) This might be looking nice, but when you look at Double.TryParse(), you'll likely introduce duplicate code. And when you look at the Main method, the abstraction level will not be the same.
2) Exceptions shall be used for exceptional cases. Wrong user input seems to be a rather usual thing. Not ideal for this case.
1) Sounds quite ok, except that the method might be responsible for 2 things: checking validity and calculating.
To implement that, you don't even need to write a new struct or class. You can simply use Nullable<double> or double?.
Since you're talking about clean code (potentially referring to R.C. Martin), I would start by looking at the main method. Basically I would say the code follows the IPO principle (input, processing, output). However, one line does 2 things:
var input = CelciusToFarenheit(Console.ReadLine());
Also, the variable name input is not so useful here, because it's not the input of the user, but the output after processing.
Proposal for that part:
public static void Main(string[] args)
{
var userInput = GetCelsiusInputFromUser();
var output = CelciusToFarenheit(userInput);
PrintOutput(output);
}
Also, the conversion method does not only convert, but print partial results as well:
Console.WriteLine("Invalid code");
I'd remove that piece and leave it to the output method to handle that case.
Full code:
using System;
namespace CSharpBasics
{
class Program
{
public static double? CelciusToFarenheit(string celciusTemperature)
{
//Converting string to a double for conversion
double celcius;
if (Double.TryParse(celciusTemperature, out celcius))
{
double fahrenheit = (celcius * 9 / 5) + 32;
return fahrenheit;
}
else
{
return null;
}
}
public static void Main(string[] args)
{
var userInput = GetCelsiusInputFromUser();
var output = CelciusToFarenheit(userInput);
PrintOutput(output);
}
private static void PrintOutput(double? output)
{
if (output == null)
{
Console.WriteLine("Invalid code");
}
else
{
Console.WriteLine("The conversion from Celcius to Fahrenheit is: " + output);
}
}
private static string GetCelsiusInputFromUser()
{
Console.WriteLine("Please enter a celsius value for conversion:");
var userInput = Console.ReadLine();
return userInput;
}
}
}
BTW: if you don't have a technical issue, https://codereview.stackexchange.com/ might be better suited for questions regarding clean code.

How to write a function that takes an integer as a parameter and calculates and returns the squared value

Ahoy! I have just started methods but I am a tad confused when it comes to methods with math. First post so be nice :) I'm aware I out in NumberToSquare way too many times!
Write a program that asks the user to enter a number. In your program write a function called SquareValue that takes an integer parameter and calculates the square of integer parameter and returns this squared value. Your program should take this returned square value and display it. An example of the output is:
Please enter a number to square: 8
/ 8 squared is: 64
What I have so far is not so comprehensible. I thought along a few different avenues and was unsure as to what to delete. Help please.
namespace SquareValue
{
class Program
{
static void Main(string[] args)
{
int number=NumberToSquare();
SquareValue(NumberToSquare * NumberToSquare);
string output;
Console.ReadKey();
}
public int SquareValue(NumberToSquare, NumberToSquare);
{
int result = NumberToSquare * NumberToSquare;
return result;
Console.WriteLine("{0} squared is "+result");
}
public int NumberToSquare()
{
Console.WriteLine("Please enter a number to square: ");
int NumberToSquare = Console.ReadLine();
return NumberToSquare;
}
}
I see no reason to over complicate this:
public int Square(int x)
{
return (x * x);
}
or
public int Square(int x)
{
return Math.Pow(x,2);
}
Or just use Math.Pow as it exists with 2 as the Power Of number.
You seem very green on programming and I'm not sure SO is a place to go to learn the basics, but I'll run through what you've done and explain what's going wrong.
Your original program concept is fine but there are many issues with basic syntax. I understand you mightn't be familiar with reading compiler errors so I'll explain the errors that I see just reading through the code...
You put a ; at the end of the SquareValue(..., ...) method which teeminates the declaration so the body in braces isn't part of the method, then things go haywire later on.
You're not passing in the value captured from the NumberToSquare method...
int number=NumberToSquare();
SquareValue(NumberToSquare * NumberToSquare);
NumberToSquare isn't a defined variable so NumberToSquare * NumberToSquare can't calculate, what you'd want is number * number where `number is the value entered by the user.
Your definition of int SquareValue(NumberToSquare, NumberToSquare) expects two parameters although you haven't speified the type. It should be
int SquareValue(int NumberToSquare, int NumberToSquare)
but you have the same variable declared twice which is another error and then you aren't passing two parameters anyway. You want to multiply a number by itself therefore you only have a single source number so why declared two parameters? You need a single parameter method
int SquareValue(int NumberToSquare)
and call like this
int number=NumberToSquare();
SquareValue(number);
Now the SquareValue() method returns an int but you never capture it in the calling code and display the result in the method. Follow the idea in this app that the Main method will do all the orchestration and display, but the SquareValue() method should ONLY do a calculation and not any I/O. I'd also rename the NumberToSquare() method a as what is actually happening ... GetNumberToSquareFromUser().
And there's also a stray " before the closing bracket.
Console.WriteLine("{0} squared is " + result");
And you defined a string output variable which is never used.
And your methods need to be static because main(..) is a static method, not instance. If you declare a Squaring class and instantiated it then you could call non static methods from that.
Also ReadLine() returns a string which can't be assigned to an int.
And finally the result line is implicitly using String.Format behind the scenes but you haven't specified the original number for the {0} token. You could also use interpolation. You could do either of these
Console.WriteLine("{0} squared is " + result, number);
Console.WriteLine($"{number} squared is " + result);
So here's your program revised
class Program
{
static void Main(string[] args)
{
int number = GetNumberToSquareFromUser();
int result = SquareValue(number);
Console.WriteLine("{0} squared is " + result, number);
Console.ReadKey();
}
public static int SquareValue(int numberToSquare)
{
return numberToSquare * numberToSquare;
}
public static int GetNumberToSquareFromUser()
{
Console.WriteLine("Please enter a number to square: ");
int NumberToSquare = int.Parse(Console.ReadLine());
return NumberToSquare;
}
}
I hope this help, I know it's alot to take in, but I hope you take the time to read and really understand rather than just blindly submit the revised version.
When writing your methods, make them reusable. When you start using a method to output to the console in addition to its primary purpose (i.e. to square a number), its re-usability becomes minimal. It is much better to keep specific code in your main method, and put sub tasks into separate methods, such as squaring a number. Now, whenever you need to square a number, you already have a perfectly good method for that.
I didn't handle the case for users entering bad input, but that can be done in the else of the TryParse if block.
static void Main(string[] args)
{
int squredNum = 0;
int NumberToSquare = 0;
Console.WriteLine("Please enter a number to square: ");
if(int.TryParse(Console.ReadLine(), out NumberToSquare))
{
squredNum = SquareValue(NumberToSquare);
Console.WriteLine("{0} squared is {1}", NumberToSquare, squredNum);
}
Console.ReadKey();
}
static int SquareValue(int numberToSquare)
{
return numberToSquare * numberToSquare;
}
p.s. I would not recommend using Math.Pow() to square a number. No need to kill a fly with a bazooka!
Here is an example of such program with robust handling:
using System;
namespace ConsoleApp1
{
internal static class Program
{
private static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter value to square or X to exit");
var line = Console.ReadLine();
if (line == null)
continue;
if (line.Trim().Equals("X", StringComparison.InvariantCultureIgnoreCase))
{
Console.WriteLine("Exitting ...");
break;
}
int result;
if (!int.TryParse(line, out result))
continue;
Console.WriteLine(result * result);
}
}
}
}
See the docs online, understand each statement, write your very own program then as your teacher will likely figure out you didn't pull that solely by yourself :)

working with console writeline c#

I need to output the value of d using the same Console.WriteLine. But i am only getting Result not the value of d in output. In what way i can achieve this?
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int a;
int b;
Console.WriteLine("Please Enter the first Digit");
a = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Please Enter the Second Digit");
b = Convert.ToInt32(Console.ReadLine());
int d = a + b;
Console.WriteLine("Result",(d));
}
}
}
Use:
Console.WriteLine("Result {0}", d);
You are using this overload.
UPDATE
If you look at the link above, you can read how it works. In short, first you specify the formatting, where {0} references the first value of the param object-array, {1} references the second value of the param object-array, etc. After the format, you give the objects to use.
So in your case, you need a single value, which means two arguments, a format, and a value. Hence "Result {0}" with d, which will become (when for example d=10) "Result 10".
Note: also removed the unnecessary parenthesis.
Use
Console.WriteLine("Result {0}", d);

Categories

Resources