Loading...
krum_43 avatar krum_43 756 Точки

Проблем при 1 зад от допълнителните задачи за списъци и речници-Immune system C#-tech modula

Условието на задачата може да се види от линка по долу.

Въпросът ми е защо в моето проектно-решение не се изпълнява foriech-a при първата итерация на while цикъла.(т.е. не се изпълнява нито едно от двете условия в него.Странното е ,че при другите итерации условията във него се изпълняват.При първата итерация списъка е празен,но дори и да му дам някакви неща,не се изпълняват условията в цикъла.

https://softuni.bg/trainings/resources/officedocument/31796/more-exercise-problem-descriptions-optional-programming-fundamentals-may-2018/1939.

Ето моето решение:

namespace Imunne_Sysrem
{
    class Program
    {
        static void Main(string[] args)
        {
            int inicialhealth = int.Parse(Console.ReadLine());
            int remeininghealt = inicialhealth;
            List < string >nameofvirus= new List<string>();                               
            while(true)
            {
                string virusname = Console.ReadLine();                      
                if (virusname=="end")
                {
                    Console.WriteLine($"Final Health: {remeininghealt}");
                    break;
                }
                int virusstrench;
                int sum = 0;
                int timetodefeat = 0; ;
                for (int i = 0; i <virusname.Length; i++)
                {
                    sum +=virusname[i];
                }
                virusstrench =sum / 3;
                foreach (string name in nameofvirus)
                {
                    if (name == virusname)
                    {
                        timetodefeat = (int)virusstrench * virusname.Length / 3;
                        break;
                    }
                    else
                    {
                        timetodefeat = virusstrench * virusname.Length;
                    }
                }          
                int timeminute = timetodefeat / 60;
                int timeseconds = timetodefeat % 60;
                 remeininghealt = remeininghealt- timetodefeat;                
                    if(inicialhealth>=virusstrench)
                    {
                        Console.WriteLine($"Virus {virusname}: {virusstrench} => {timetodefeat} seconds");
                        Console.WriteLine($"{virusname} defeated in {timeminute}m {timeseconds}s." );
                        Console.WriteLine($"Remaining health: {remeininghealt}");

                    }
                    else
                    {
                        Console.WriteLine("Immune System Defeated.");
                        return;
                    }
                remeininghealt=(int)Math.Round(remeininghealt*1.2);
                if (remeininghealt > inicialhealth)
                {
                    remeininghealt= inicialhealth;
                }
                nameofvirus.Add(virusname);
            }
          }
      }
  }
 

Тагове:
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки
Best Answer

така едно по едно, нормално е да не влиза в foreach като е празен списъка ти добавяш вируса чак накрая на цикъла и ще се случи при втора итерация...

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

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

 for (int i = 0; i <virusname.Length; i++)
                {
                    sum +=virusname[i];
                }

и това тук е вероятно да ти изгърми добавяш към int char ако не го cast-неш на int веровятно ще изгърми runtime но не съм сигурен но е syspicios.

Общо взето оправи си масива да е речник вложен и добавяи вируса веднага след четенето иначе никога няма да ти проработи

      nameofvirus.Add(virusname); това трябва да ти е след    string virusname = Console.ReadLine();    а не накрая на true цикъла. А и изписването ти е грешно искат го накрая за всички вируси не след всеки,затова ти е речника общо взето много проблеми има това решение.

да не говорим че и тея вложени If... 1-2 bool проверки ще го направят много по-четимо.

0
22/10/2018 09:28:33
krum_43 avatar krum_43 756 Точки

Здравей Теодоре,

Маркирах ти отговора като най-добър понеже едва ли някой ще даде по изчерпателен от твоя,но в тази задача има и нещо друго,което не е обяснено добре в условието, а то е че ако даден вирус ни порази втори път времето за поражение,което при мен е timetodefeat се дели на 3.За това добавям virusname в края на цикъла.Идеята е при първата атака на деден вирус(н.р.ebola) да го няма в списъка.Така ще начисля време за поражение,което се смята по определен начин.При втора атака на същият вирус се начислява времето/3.

Лек и успешен ден.

 

 

0
TeodorStefanovPld avatar TeodorStefanovPld 1274 Точки

Е това ще го направиш много лесно една bool проверка прочиташ името на вируса проверяваш го дали вече го имаш и ако го имаш бам делиш 1/3 и презаписваш само новите неща в речника. Защото ако си опиташ пак да го добавиш ще изгърмиш че ключа съществува.това че записваш вирса още в началото няма никакво значение. Как ще направиш после нещата. Ти така или иначе в речник може един път да вкараш един ключ.

Условието е ок. Ти просто подхождаш по кофти начин към него.

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