Loading...
kenderov.emil avatar kenderov.emil 6 Точки

Деклариране на потребителски методи-проблем

Имам проблем с декларирането на потребителски методи - Visual Studio-то ми ги отхвърля непрекъснато, като ги подчертава с червено. Ето пример с код, върху когото работих - исках да си направя свой метод за пресмятане на факториел(домашно):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication31
{
    class Program
    {
        public uint FindFact(uint n)
        {
            int result;
          
            {

            }
        }

   
        static void Main(string[] args)
        {
        }

        
    }
}

 

А ако намеря в интернет някакъв метод и го копи-пейстна, го приема, дори и аз да започна да го променям като име и съдържание след това:

http://www.tutorialspoint.com/csharp/csharp_methods.htm

(вижте примера с number manipulator).

Чудя се къде е грешката - при мен, Visual Studio-то или някъде другаде? Студиото подчертава името на моя метод FindFact в червено и го отхвърля, давайки грешка not all code paths return a value. Мерси предварително за разясненията.

Тагове:
0
Programming Basics
aanguelov avatar aanguelov 219 Точки

Здравей, отговорът на проблема ти се съдържа в името на грешката, която получаваш - така както си написал сигнатурата на метода, трябва да връщаш uint, а ти всъщност не връщаш нищо. Този int result дето си го декларирал там го направи uint и накрая като го изчислиш, го return-и

1
LoKSET avatar LoKSET 160 Точки

Освен, както каза колегата че очевидно трябва да връщаш нещо ако методът не е void, също поне засега на твоето ниво всички методи, които ще правиш ще се ползват само в Main метода. Като цяло това което е направено в примерите е безсмислено. Инстанцират класа, за да може да викат някакви методи. По-добре е просто да си ги правиш статични и по този начин можеш директно да ги използваш.

public static int FindMax(int num1, int num2)

{...}

Main

ret = FindMax(a, b);

1
kenderov.emil avatar kenderov.emil 6 Точки

Оправих нещата именно като направих и метода и променливата от един и същи тип(в случая избрах да са BigInteger защото работя с факториели), след което декларирах вътре в самия метод трета (result) пак като BigInteger и дадох return result. И нещата се оправиха, а после извиках така създадения от мен метод FindFactoriel много лесно - чрез името на класа. Ето го и кодът който написах(на задача 8 за Catalain Numbers):

Нарушена точка 12 от Правилата.

0
21/10/2015 19:20:42
aanguelov avatar aanguelov 219 Точки

Направи метода FindFactoriel static и си го ползвай директно в мейна. 

Това - result = q.FindFactoriel(2 * n) / (q.FindFactoriel(n + 1) * q.FindFactoriel(n));   не го изчислявай на един ред, ами си декларирай три отделни променливи.

0
jumpforjoy avatar jumpforjoy 12 Точки

Здравей,

Оправил си проблема, човече, понеже си добавил "return result;", който е типа, който се очаква да върне метода, а не защото метода връща същия тип какъвто е и параметъра "n".

public BigInteger FindFactoriel(BigInteger n)

  {          

            BigInteger result = 1;

...

            return result;

  }

Ако типа на "result" и посочения след "public" се различават ще имаш грешка, но какъв ще е типа на параметъра "n" не се регулира от това, което връща самия метода. Може, например, да имаш параметър "string", а метода да връща "int" и това е абсолютно редовно. Това е така защото параметъра "n" е входа на метода, а "result" е това, което отива на изхода и "n" не участва пряко в изчислението на "result". Нито се събират, нито делят, нито нищо. Ти го използваш, за да контролираш цикъла. Въпроса е как си взаимодействат променливите и оттам как да се съгласуват типовете.

BigInteger n = uint.Parse(Console.ReadLine());

В тази линия обявяваш, че създаваш променлива "n" от тип "BigInteger", а я парсваш като "uint". Вярвам, че по-правилно е да се обяви така:

uint n = uint.Parse(Console.ReadLine());

И без това после в метода си я сравняваш с променлива от тип "uint": for (uint c = 1; c < n + 1; c++). И накрая мисля, че е по-добре да няма "Console.ReadLine();"

Ако ти е интересно, човече, аз бих го направил така:

Нарушена точка 12 от Правилата.

Надявам се да съм бил полезен!

Успех! :)

1
21/10/2015 19:21:29
slavpetroff avatar slavpetroff Trainer 155 Точки

Един съвет, не прави така "ConsoleApplication31" :D

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.