Софтуерно Инженерство
Loading...
+ Нов въпрос
Niki_Mihov avatar Niki_Mihov 19 Точки

[Judge] C# Basics 19.12.2014 Problem 3 Boat

Здравейте , колеги ! Решавам задача от тип 3та на изпитните задачи (задачите с рисуване) , но ми възниква проблем... 

"unhandled exception input string was not in a correct format....." и ми изписва , че грешката ми е на ред 8(реда с leftDots) , след като го закоментирам 8мия ред ми изписва същата грешка на ред 9 и така и на ред 10 ... 

Пробвах първоначално да ги правя string leftDots = new string('.', (n - 1)); и след това по - надолу в един цикъл да ми принтва на конзолата разни редове , но така когато не са конвъртнати към int , не ми позволява да правя сравнения на променливите в цикъла (например вътре в цикъла да имам if конструкция , в която да пише , че ако leftDots < 0 ...еди какво си да става).

Много ще съм ви благодарен ако ми помогнете , защото търсих в stackoverflow-a за хора с моя проблем , и там ги съветват да конвъртнат променливите към int , и аз така и направих , но пак ми дава exception ...

Ето го кода: (съжалявам , че не e в gitHub) :

using System;

class Program
{
  static void Main()
    {
       int n = int.Parse(Console.ReadLine());
       int leftDots = Convert.ToInt32(new string('.', (n - 1)));
       int asteriks = Convert.ToInt32(new string('*', n - (n - 1)));
       int rightDots = Convert.ToInt32(new string('.', n));

     Console.WriteLine("{0}{1}{2}" , leftDots, asteriks , rightDots);

 

3
Programming Basics 25/04/2015 18:09:44
KatyaMarincheva avatar KatyaMarincheva 572 Точки
Best Answer

Здравей Ники,

Това което искаш да изпозваш се нарича string constructor (char, Int32)

Прилага се по този начин:

string leftDots = new string('.', (n - 1));

Супер идея е, че си решил да сведеш броя chars до числова проенлива, която после да увеличаваш или намаляваш според случая.

Може да стане така:

int leftDotsCount = n - 1;

string leftDots = new string('.', leftDotsCount);

хубавото в идеята ти е че ако сега кажеш:

leftDotsCount = leftDotsCount -1;

leftDots = new string('.', leftDotsCount);

този път стрингът ще е с един знак по-къс - ще можеш да му променяш дължината когато над него в кода промениш стойността на leftDotsCount.

Наистина супер идея!

2
Niki_Mihov avatar Niki_Mihov 19 Точки

Здравей , Катя ! Благодаря много за примера. Сега ще го оправя ! Май само ти ме разбра какво искам да направя :D 

2
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Идеята ти си е наистина хубава!

А разликата във виждането идва от background-a: аз много години съм работила като трейнър, и в тази работа за да може фирмата да печели от един служител - трябваше аз да намирам кое е най-ценното у него, за да може точно върху тази ценност да се гради.

1
Niki_Mihov avatar Niki_Mihov 19 Точки

Да, така е ! Все пак въпросният служител не трябва да разчита само на най - ценното си качество , а трябва да надгражда над него , като работи върху слабите си места и така да се стреми постоянно да се усъвършенства. :) 

2
Innos avatar Innos SoftUni Team 419 Точки

Първо опитваш се да конвертираш символи в числа (което не е невъзможно ако бяха тип char) но в този случаи конвертираш стринг (текстова репрезентация на символи) в число и гърми защото вземаш текстовата им репрезентация дори и да беше взел числовата им репрезентация щеше да ти върни ASCII кода им, което не мисля че ти трябва ако се опитваш да рисуваш

Кратък отговор смени "int"овете в "string"ове с изключение на 1вия където вземаш n

това:
int leftDots = Convert.ToInt32(new string('.', (n - 1)));

трябва да стане в това:

string leftDots = new string('.',(n-1));

Едит: Може би малко лошо го обясних stringa е текстова репрезентация, той числова стойност няма. Convert to int може да парсира числова стойност от текст, само ако текста е покрива условията за парсиране (т.е. само числа и макс знак за стойност пред тях(- или +), иначе Convert to int32 върху char  връща ASCII кода му.Благодаря на колежката за пояснението.

0
25/04/2015 22:01:31
Niki_Mihov avatar Niki_Mihov 19 Точки

По този начин , който ми казваш го бях направил първоначално , но при него не ми дава да извърша действието в if-a ... Дава ми следния error : "operator ' < ' cannot be applied to operands of type 'string' and 'int'" ... и не ми дава да направя leftDots -= 2;

using System;

class Program

{
  static void Main()
    {
       int n = int.Parse(Console.ReadLine());
       int leftDots = Convert.ToInt32(new string('.', (n - 1)));
       int asteriks = Convert.ToInt32(new string('*', n - (n - 1)));
       int rightDots = Convert.ToInt32(new string('.', n));

       for (int i = 0; i < n; i++)
         {
            if (leftDots < 0)
               {
                   leftDots += 2;
               }

             Console.WriteLine("{0}{1}{2}", leftDots, asteriks, rightDots);
             leftDots -= 2;
         }
    }
}

1
Innos avatar Innos SoftUni Team 419 Точки

Трябва да разграничиш 2те части една от друга ако искаш броя символи да се сменя, ще трябва да създаваш нов стринг или да форматираш.

int lDots = n-1;

string leftDots = new string('.',lDots);

lDots -=2;

leftDots = new string('.'lDots);

или

leftDots = String.Format("{0}",new string('.',lDots)); (което прави същото като new string но с повече текст)

тъй като най-вероятно ще го правиш това ти препоръчвам направо да използваш new string в Console.WriteLine-a

пример

int lDots = n-1;

ConsoleWriteLine("{0}", new string('.',lDots));

lDots += 2;

ConsoleWriteLine("{0}", new string('.',lDots));

Edit: Опа поправих го че бях писал пълни глупости сори. XD Това имах предвид сменяш външно променливата и правиш нов стринг като печаташ, който взема стйноста на lDots в момента на създаването си.

1
25/04/2015 17:55:25
Niki_Mihov avatar Niki_Mihov 19 Точки

Благодаря ! Сега ще го оправя :) !

1
Karlie avatar Karlie 438 Точки

Convert.ToInt32(string) превръща стринг в int, но САМО ако стрингът съдържа число, и то в определен формат, например "-9" или "465". Ти в момента се опитваш да превърнеш в число стринг от типа ".........", което няма как да стане.

Кажи поне коя задача се опитваш да решиш, да видим условието.

1
25/04/2015 17:37:36
Niki_Mihov avatar Niki_Mihov 19 Точки

Задачата се казва "Boat" и е 3та задача от изпита на 19 декември , 2014 , ако не се лъжа :) ! 

1
peterborisov avatar peterborisov 123 Точки

Всички задачи от конзолата ги решавам по този начин.Пиша първата линия после един for цикъл ,средната линия и оше един for цикъл и накрая последната линия.Вскички без исключение взимат 100 точки на judge-а.

0
quickben avatar quickben 974 Точки

Скрил съм ти пост-а, защото нарушава правилата на форума, ако ще постваш код по-дълъг от 12-15(макс 20) реда то трябва да го качиш в pastebin(примерно) и да пуснеш линка към него.

0
quickben avatar quickben 974 Точки

Колега, моля да си оправиш заглавието на темата според правилата на форума.

[Judge] C# Basics 19.12.2014 Boat - примерно.

Както виждаш хората се затрудняват да разберат за коя задача говориш и следователно ще им е по-трудно да ти помогнат.

1
nikigmi avatar nikigmi 23 Точки

Здравей!

Това е моето решение:

static void Main()
        {
            int n = int.Parse(Console.ReadLine());
            int print = 1;
            //Sail
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine("{0}{1}{2}", new string('.', n - print), new string('*', print), new string('.', n));
                if (i >= n / 2)
                    print -= 2;
                else print += 2;
            }
            print = n * 2;
            //Body
            for (int i = 0; i < (n - 1) / 2; i++)
            {
                Console.WriteLine("{0}{1}{2}", new string('.', (n * 2 - print) / 2), new string('*', print), new string('.', (n * 2 - print) / 2));
                print -= 2;
            }
        }

Много се извинявам, че не е със линк но в момента нямам къде да го кача.

Ако го правиш със променливи int, то те трябва да ти отбелязват колко пъти ще изкараш на конзолата даден симвул.

Ако искаш да принтваш променливи само, то трябва да имаш променливи от тип string който пазят тези "new string(.....)".

Надявам се че помогнах.

Поздрави!

 
 
 
0