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

[Exam Problems] C# Basics - the Explorer

Здравейте,

Опитвам се да реша задачата, като създавам метод, който рисува съответния ред, след като му се зададат параметри. Отпечатва ми, обаче повече "_", отколкото смятам, че съм задала. Някой вижда ли къде е грешката?

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

//At the only input line you will be given
//the width of the diamond. The char that forms the outline of the diamonds is '*'
//and the surrounding parts are made of '-' (see the examples).
//Your task is to print a diamond of given size n.
class Explorer
{
    static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine());
        string form = "*";
        string fill = "_";
      
        Console.Write(Repeat(fill,n/2));
        Console.Write(form);
        Console.WriteLine( Repeat(fill, n / 2) );
        
        for (int i = 2; i <= n / 2 + 1; i++)
        {
            Console.Write(Repeat(fill, n / 2 - (i - 1)));
            Console.Write(form);      
            Console.Write(Repeat(fill,i - 1));
            Console.Write(form);
           Console.WriteLine(Repeat(fill, n / 2 - (i - 1)) );
        }

        for (int i = n / 2 + 2; i < 2; i--)
        {
            Console.Write(Repeat(fill, n / 2 - (i - 1)));
            Console.Write(form);
            Console.Write(Repeat(fill, i - 1));
            Console.Write(form);
            Console.WriteLine(Repeat(fill, n / 2 - (i - 1)));
        }

        Console.Write(Repeat(fill, n / 2));
        Console.Write(form);
        Console.WriteLine(Repeat(fill, n / 2));

    }
    public static string Repeat(string str, int count)
    {
        for (int i = 1; i <= count; i++)
        {
            Console.Write("{0}", str);
        }
        return str;
    }
}

Тагове:
boyanov avatar boyanov 65 Точки

Незнам къде ти е грешката но това е моето по-простичко решение. Можеш да си изтеглиш тестовете които използва Judge и да си дебъгнеш програмата. Аз обикновено така си намирам грешките в изпитни задачи.

0
Nexus avatar Nexus 119 Точки

Привет,

 

Опитах се да направя собствено решение но доста се затрудних. 

Твоето е чудесно. 

Ето леко модифициран код. 

http://pastebin.com/bUETqQFn

0
Filkolev avatar Filkolev 4428 Точки

Първата ти грешка е, че ползваш долна черта вместо тире.

Смени освен това Repeat с new string(). new string взима два аргумента - символ и брой повторения на символа, т.е. в началото трябва да декларираш като символи звездата и тирето.

В горната част броят на вътрешните тирета трябва да се промени: 2*(i - 1) - 1.

Дотук горната половина е ОК. С долната поиграх малко, но ми се спи и няма да мога да довърша. Утре пак ще я погледна ако не се справиш дотогава.

 

2
yankozlatanov avatar yankozlatanov 10 Точки

Смятам че грешката идва от деленеte  "n/2".

 Ето аз как съм я решил задачата  http://pastebin.com/c8P50qvM.

Моля за мнение и някакви препоръки за евентуални подобрения.

в judge системата премина успешно 100 / 100 но всепак сигурно може да се поопрости малко.

0
Filkolev avatar Filkolev 4428 Точки

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

0
Nexus avatar Nexus 119 Точки

Здравейте,

 

Мога ли да помоля и аз за малко насока. 

Докарах кода си до положение да работи с n=5 и n=7.

За по-високи стойности обаче се получават разминавания.

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

http://pastebin.com/JGCRQbVq

0
21/11/2014 19:05:05
dimmarinov avatar dimmarinov 29 Точки

Здравей,

Според мен се дължи на факта, че проверките които правиш са с константи (3 и 4 -> n-3; n-4). А те вършат работа само за частни случаи, както е с n=5 или 7. Т.к не съм сигурен на 100% дали съм разбрал логиката, която си вложил не се ангажирам да ти дам по-точен съвет как да ги изразиш.  Но ми се струва, че с увеличаване стойността на n, ще ти се налагат все повече проверки.
На ред 31 ти липсва оператор и така част от кога ти не се изпълнява. Може липсващият statement да е проблема :)

Ето моят вариант за решение на задачата. Логиката ми е донякъде подобна, така че се надявам да ти е от полза.

А това, което мога да те посъветвам е:

  • опитай се да намериш завсимостта и да я изразиш чрез динамичните проленливи.
    Аз опитах да ги заместя с n-3 -> n - n/2 -1 и n-4 -> n-n/2-2, но не ми се получи. Но може да ги ползваш като отправна точка ;)
  • да изпозлваш не само if (имаш няколко един след друг), но и if - else;
  • използвай по-малко вложени "ифове" (if statement) - много е лесно понякога човек да се обърка кой къде свършва. Разбира се понякога е наложително и няма как :) Но в случая може да ползваш:
    if-else или "if- else if - else";
  • и последно. По условие n трябва да се въвежда от конзолата.

    Успех!
1
21/11/2014 22:42:07
Kamigawa avatar Kamigawa 750 Точки

Здравей,

Както е споменал колега - кода ти е нагоден за примерите. Реших я задачата преди малко ето и кода - http://pastebin.com/NCZTS3FQ . Като цяло при такива задачи е много по-лесно да се намери някаква закономерност в началото и да се изведе като променлива и след това в loop-овете да се добавят или махат някакви стойности за да се получи фигурата.

0