BG Development


Страници: (5) [1] 2 3 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Въпроси относно задача на C#
Dnes
Публикувано на: 14-04-2018, 14:09
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 1
Регистриран на: 14.04.18



Накратко искам да се науча да решавам задачите давани на изпити по информатика в ПУ, обаче някои неща ми убягват и не успявам да ги намеря в нета, а пък решения на задачите има само в един сайт, където са само варианти от 2009 и 2010 решени и при това на C++, затова моля вас за помощ. Ето един примерен вариант, тъй като всяка година се дава подобна задача:

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

1. За всеки служител се въвеждат данни в следния вид:

 име (знаков низ, не по-дълъг от 50 знака);

 ЕГН (ЛНЧ) (низ с дължина до 15 знака)

 име с латински букви (знаков низ, не по-дълъг от 50 знака);

 местоживеене: държава, пощенски код, град (низове до 30 знака).

Броят на новоназначените служители е по-малък от 50.

2. Извежда на екрана данни за служителите, сортирани по държава, а тези които са от една и съща държава – сортирани по азбучен ред на името. На всеки отделен ред се извеждат: име, ЕГН, име с латински букви и местоживеене. Данните да бъдат разделени със запетая и интервал. Например: Иван Петров Иванов, 234567890, Ivan Ivanov, България, , Пловдив

3. Приемаме, че някои полета са задължителни, т.е. в тях не трябва да има празни низове. Задължителните полета са: име, ЕГН, име на английски и държава. Да се изведе списък със служителите, за които не са въведени задължителните полета. Списъкът да е сортиран по ЕГН.

4. За всеки един от служителите трябва да се генерира име на служебна поща по следния начин (данните извличаме от името с латински букви, ако не е празно): ‹Фамилия›_‹Име›_‹Първата буква от бащиното име›@nncomputers.com. Ако в името на английски липсват бащино, или първо и бащино име, те се пропускат при генерирането на пощата. Да се изведе списък с имената на новите служители и пощата, за които името на пощата е генерирано успешно. За примера в точка две резултатът ще бъде: Иван Петров Иванов, email: Ivanov_Ivan@nncomputers.com


Някои от нещата, които не знам, е как да задам някаква максимална стойност на низовете (30, 50...) и въобще трябва ли да им я задам тази стойност, или това е просто описание на какво въвежда потребителя и какво да очаквам като input? Като цяло постигнах някакъв резултат с do while цикъл, който се повтаря ако въведена стойност не е в допустимите граници, но не знам дали това е най-ефикасният начин. Сега като се замисля мога например на string name да дам name = name.Substring(0, length) и ако потребителя е надвишил стойността да се използват само допустимите диапазони на низа в задачата.

Освен това, някой от вас ако случайно е правил изпит в ПУ или подобен, за сортиране предполагам, че трябва да използвам алгоритми? Защото в програмата за изпита пише, че трябва да се научат алгоритми за сортиране на масив от числа, което ме навежда до мисълта, че не мога да си нащракам Array.Sort или нещо подобно.

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

Знам, че въпросите ми сигурно са малоумни, то ще изскочат и още такива докато решавам тия задачи, но от скоро се уча на тия неща и по-добре да питам, отколкото да напиша някакви простотии. Всяка помощ ми е от... помощ
PMEmail Poster
Top
pgpanayotov
Публикувано на: 29-04-2018, 22:41
Quote Post



Име: Пламен Панайотов
Група: Потребител
Ранг: Новопостъпил

Мнения: 4
Регистриран на: 29.04.18



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

CODE
using System;
using System.Collections.Generic;

namespace zad17_2
{
   struct Slujiteli
   {
       public string name;
       public string EGN;
       public string name_lat;
       public string country;
       public string pk;
       public string town;
   }
   class Program
   {
       static void Main()
       {
           var list = new List<Slujiteli>();
           for (var i = 0; i < 50; i++)
           {
               var slujitel = new Slujiteli();
               Console.WriteLine("Информация за служител № " + (list.Count + 1));
               Console.Write("Въведете име: ");
               slujitel.name = Console.ReadLine();
               Console.Write("EGN: ");
               slujitel.EGN = Console.ReadLine();
               Console.Write("Име на латиница: ");
               slujitel.name_lat = Console.ReadLine();
               Console.Write("Държава: ");
               slujitel.country = Console.ReadLine();
               Console.Write("Пощенски код: ");
               slujitel.pk = Console.ReadLine();
               Console.Write("Град: ");
               slujitel.town = Console.ReadLine();
               list.Add(slujitel);

               Console.Write("Има ли още служители ? ");
               string answer = Console.ReadLine().ToLower();
               if (answer == "не" || answer == "ne")
               {
                   break;
               }
           }

           list.Sort((x, y) =>
           {
               var ret = string.Compare(x.country, y.country);
               if (ret == 0) ret = string.Compare(x.name, y.name);
               return ret;
           });

           for (var i = 0; i < list.Count; i++)
           {
               Console.Write(list[i].name + ", ");
               Console.Write(list[i].EGN + ", ");
               Console.Write(list[i].name_lat + ", ");
               Console.Write(list[i].country + ", ");
               Console.Write(list[i].pk + ", ");
               Console.WriteLine(list[i].town);
           }

           var list1 = new List<Slujiteli>();
           for (var i = 0; i < list.Count; i++)
           {
               if (string.IsNullOrEmpty(list[i].name) || string.IsNullOrEmpty(list[i].EGN) || string.IsNullOrEmpty(list[i].name_lat))
                   list1.Add(list[i]);                
           }

           list1.Sort((x, y) => string.Compare(x.EGN, y.EGN));

           for (var i = 0; i < list1.Count; i++)
           {
               Console.Write(list1[i].name + ", ");
               Console.Write(list1[i].EGN + ", ");
               Console.Write(list1[i].name_lat + ", ");
               Console.Write(list1[i].country + ", ");
               Console.Write(list1[i].pk + ", ");
               Console.WriteLine(list1[i].town);
           }

           for (var i = 0; i < list.Count; i++)
           {
               if (!string.IsNullOrEmpty(list[i].name_lat))
               {
                   var names = list[i].name_lat.Split(' ');
                   if (names.Length == 2)
                       Console.WriteLine("{0}_{1}@nncomputers.com", names[1], names[0]);
                   else if (names.Length == 3)
                       Console.WriteLine("{0}_{1}_{2}@nncomputers.com", names[2], names[0], names[2][0]);
                   else
                       Console.WriteLine("{0}@nncomputers.com", list[i].name_lat);
               }
           }
       }
   }
}
PMEmail Poster
Top
Stilgar
Публикувано на: 29-04-2018, 23:42
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 11949
Регистриран на: 13.05.08



Това с дължините е за да може тея дето пишат на C++ да не се чудят какъв char[] да декларират. Иначе може да провериш с някви if-ове или с do/while


--------------------
Опитахме се да го направим както трябва, но стана както винаги.
PMEmail PosterUsers Website
Top
SuN
Публикувано на: 30-04-2018, 06:42
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 6482
Регистриран на: 27.01.05



QUOTE (Stilgar @ 29-04-2018, 23:42)
Това с дължините е за да може тея дето пишат на C++ да не се чудят какъв char[] да декларират. Иначе може да провериш с някви if-ове или с do/while

Не е вярно. Имаме си std::string.

Това мнение е било редактирано от SuN на 30-04-2018, 06:47


--------------------
Копирай лесно ударено и - ѝ Ѝ
Замърсяване на въздуха в София - http://aqicn.org/city/bulgaria/sofia/druzhba/
PMEmail Poster
Top
Stilgar
Публикувано на: 30-04-2018, 08:37
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 11949
Регистриран на: 13.05.08



QUOTE (SuN @ 30-04-2018, 06:42)
QUOTE (Stilgar @ 29-04-2018, 23:42)
Това с дължините е за да може тея дето пишат на C++ да не се чудят какъв char[] да декларират. Иначе може да провериш с някви if-ове или с do/while

Не е вярно. Имаме си std::string.

бе ти може и да имаш


--------------------
Опитахме се да го направим както трябва, но стана както винаги.
PMEmail PosterUsers Website
Top
Gamma Goblin
Публикувано на: 30-04-2018, 08:43
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1095
Регистриран на: 21.02.18



Обаче решението е класически пример как да не се ползва "var"


--------------------
Напред! Живота е сраженье!
Напред! И прав всегда ходи!
Напред, макар към поражение!
Ако ще паднеш, прав падни!
---
Axis of faith; Raw, and untamed in spirit
To do and undo...
We chew this world; And Spit it out
PMEmail PosterUsers Website
Top
stewie
Публикувано на: 30-04-2018, 09:31
Quote Post



Име: Голям Черен Негър
Група: Форумен член
Ранг: Почетен член

Мнения: 3853
Регистриран на: 14.07.16



QUOTE (Gamma Goblin @ 30-04-2018, 09:43)
Обаче решението е класически пример как да не се ползва "var"

И къде е проблемацията ? инт-а на string.Compare ?
PM
Top
Gamma Goblin
Публикувано на: 30-04-2018, 09:43
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1095
Регистриран на: 21.02.18



QUOTE (stewie @ 30-04-2018, 09:31)
QUOTE (Gamma Goblin @ 30-04-2018, 09:43)
Обаче решението е класически пример как да не се ползва "var"

И къде е проблемацията ? инт-а на string.Compare ?

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

Къде е ползата от вар тука:

CODE
for (var i = 0; i < 50; i++)


Колко повече усилия изисква

CODE
for (int i = 0; i < 50; i++)


Или пък тук:

CODE
var names = list[i].name_lat.Split(' ');


Ако пък беше някакъв лайнян метод от не знам къде си, който трябва да му отвориш дефиницията за да разбереш какво връща ?


--------------------
Напред! Живота е сраженье!
Напред! И прав всегда ходи!
Напред, макар към поражение!
Ако ще паднеш, прав падни!
---
Axis of faith; Raw, and untamed in spirit
To do and undo...
We chew this world; And Spit it out
PMEmail PosterUsers Website
Top
pgpanayotov
Публикувано на: 30-04-2018, 12:05
Quote Post



Име: Пламен Панайотов
Група: Потребител
Ранг: Новопостъпил

Мнения: 4
Регистриран на: 29.04.18



Приемам критиката ви, относно използването на var. Може би трябва да разкарам ReSharper-а като plugin, защото най-често той ми казва и коригира някои неща в кода, и всяка променлива която декларирам ми казва, че е по-добре да е var. Мисля, че на този етап такъв тип Plugin само би ме объркал...

Това мнение е било редактирано от pgpanayotov на 30-04-2018, 12:06
PMEmail Poster
Top
stewie
Публикувано на: 30-04-2018, 15:13
Quote Post



Име: Голям Черен Негър
Група: Форумен член
Ранг: Почетен член

Мнения: 3853
Регистриран на: 14.07.16



QUOTE (Gamma Goblin @ 30-04-2018, 10:43)
QUOTE (stewie @ 30-04-2018, 09:31)
QUOTE (Gamma Goblin @ 30-04-2018, 09:43)
Обаче решението е класически пример как да не се ползва "var"

И къде е проблемацията ? инт-а на string.Compare ?

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

Къде е ползата от вар тука:

CODE
for (var i = 0; i < 50; i++)


Колко повече усилия изисква

CODE
for (int i = 0; i < 50; i++)


Или пък тук:

CODE
var names = list[i].name_lat.Split(' ');


Ако пък беше някакъв лайнян метод от не знам къде си, който трябва да му отвориш дефиницията за да разбереш какво връща ?

За инт-а съм съгласен, макар да не е за червен картон. за names обаче е позволено. Бтв от тука помирисвам, че не си фен на var, в който и да е език. И аз не бях, ама свикнах, няма да отварям стари дискусии.
PM
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (5) [1] 2 3 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0