[C#] Arrays - 12 задача


2

Условие:

12. Write a program that creates an array containing all letters from the alphabet (A-Z). Read a word from the console and print the index of each of its letters in the array.
 
Мое решение:
 



Отговори



0

Колега не ти работи коректно решението. Извежда ти индексите с единица по малко. За 'А' казва, че е на позицията 0, а за 'М'  12. 
Добави на j единица  Console.WriteLine(j + 1);

Ето едно решение от мен дето работи с главни и малки букви:
https://github.com/martinivanovit/SimpleProjects/blob/master/AlphabetIndexes


от Mahata231 (1351 точки)


0
Благодаря за корекцията. То е малко подвеждащо, защото се иска index in the array, което значи позицията в самия масив, а не в латинската азбуката и за това така съм го оставил. Може и да греша. :)

от ivaylo.kenov (30760 точки)

0
Може и така да е, според мен е позицията в азбуката, но да кажат хората дето са писали задачите :D

от Mahata231 (1351 точки)



0
Мое решение за главни и малки букви : http://pastebin.com/iwciCsvt

от B.Jivkov (350 точки)


0
Здравей като предложение за съкращаване на код можеш да направиш един масив с азбуката само с главни или само с малки букви. После когато въведеш string променливата да я превърнеш директно към главни или малки букви с .ToUpper() или .ТоLower(); Както в случая променливата ти се казва word, съответно ще стане word.ToUpper(); или word.ToLower(); зависи кой вариант си използвал. Отделно аз лично го направих с binary search от 11та задача :)

от vlad0 (6103 точки)

0
Благодаря за съвета сега ще го пробвам :)

от B.Jivkov (350 точки)


6

Решение:

http://pastebin.com/VnA08QpA

Обяснение:

Ще приемем, че "а" съответства на позиция 1, а не на 0 в масива с букви, с чисто естетическа цел ( няма нищо грешно да се направи и като 0, зависи как се разбира задачата )

1. Декларираме си char масив за всички букви - малки и големи - с големина 53 т.к. искаме да започва от 1, а не от 0.

2. Пръвия for цикъл пълни масива с малко букви, с помоща на един просто трик -> 'a' + 1 = 'b' . Като вместо 1 използваме брояча на цикъла.

3. Със втория for попълваме масива със големите букви, пак с трика от предишната точка, но тук декларираме една допълнителна променлива k която се увеличава до 25 т.к. броенето на главния брояч започва от 26 ( това е с цел да започнем попълването на масива от 26та позиция )

4. Сравнението се извършва по елементарен начин - с един цикъл обикаляме по букваите на думата ( най-подходящи според мен тук са for или foreach ) а със втория по масива с букви. Ако има съвпадение изписваме резулата и break; - ваме обхождането по масива с букви. Защо break; - ваме ? Ами една буква може да се среща само 1 път в масива с букви :)


от Teodor92 (13062 точки)


0
Доста елегантно решение. Хареса ми как си се сетил да добавиш малки и големи букви в масива. Аз се мъчих по други начини, но така и несупявах :).

от Svetli (280 точки)

0
Задачата има доста интересни решения, така че не се отказвай и от предишния си опит. Всяко различно решение на даден проблем е плюс :)

от Teodor92 (13062 точки)



0
Аз не видях никъде да пише, че трябва да се сканира цялата дума буква по буква. Пише само да се принтира индекса на всяка буква в масива на азбуката: http://ideone.com/53pmh0

от petromaxa (577 точки)


4

 

  1.  
Ето и моето директно ги конвертирам към малка буква да няма големи малки.
 
  1. using System;
  2.  
  3. class PrintLetterIndex
  4. {
  5.     static void Main()
  6.     {
  7.         char[] arr = new char[26];
  8.         string word = (Console.ReadLine().ToLower());
  9.  
  10.         for (int i = 0; i < 26; i++)
  11.         {
  12.             arr[i] = Convert.ToChar('a' + i);                      
  13.         }
  14.  
  15.         for (int J = 0; J < word.Length; J++)
  16.         {
  17.             Console.WriteLine("{0} [{1}]", word[J], word[J] - 'a');
  18.         }                        
  19.     }
  20. }

 


от iwitass (3695 точки)


0
Колега, решението ти работи, но имам 2 препоръки :
1. J е променлива, и като такава май трябва да е с малка буква. 2. По начина който си решил задачата, ти си я свел до 2 отделни задачи. Реално ако махнеш частта за декларирането на масива от букви, то пак ще си намира индексите на буквите. По-скоро идеята според мен тук е да се търси в масива от букви и да се връща стойност (индекс)



0

Ето и едно решение с foreach и for като може да се използва и 2 пъти foreach.

http://pastebin.com/894aEvev


от ScorpS (1542 точки)


1

Ето моя вариант.

1. Буквите в латинската азбука са 26, аз съм създала масив от 27, като на елемента с нулевия индекс не задавам стойност, с цел индекса на буквите да отговаря на поредния им номер в азбуката.

2. С метода ToUpper() си гарантирам, че дори да се въведат от потребителя малки букви, те ще бъдат преобразувани до големи и съответно ще им бъде намерен индекса от масива.

3.  С foreach цикъл обикалям всички букви от думата, а с цикъл for обикалям масива и търся съответствието.

http://pastebin.com/jFC1yvQm




0
Кристина здравей :)
Забелязах, че не използваш някакво по-специално търсене, а директно сравняваш буквата със всички букви от масива и при съвпадение изписваш резултата. С други думи, ти винаги и задължително обикаляш целия масив, което не е нужно. Можеш да използваш BinarySearch или друг алгоритъм, чрез който да намалиш итерациите. Ако решиш да го оставиш така, поне сложи "break;" след принтирането на резултата, с цел да прекъснеш цикъла да не върти излишно ( примерно ако е буквата "А", след първата итерация, цикълът ще спре да цикли и ще преминеш към следващата буква)
Поздрави ^^

от valentinvs (1327 точки)

0
Мерси, сложих break;-) Поздрави



0
http://pastebin.com/yPmWHE33
Какво прави решението?
Както е казано в условието правя един масив с буквите от A-Z. Оставям първата празна, за да няма объркване с номерацията на буквите.
След това вземам първата буква на думата и я правя малка, за да не сравнявам малки с големи.
След това във втория цикъл сверявам дали буквата от думата съвпада с някоя от масива.
Намирам индекса и брейквам.
Обърнете внимание, че при изписване на думата на конзолата, ако има голяма буква я изписва отново голяма. Това е защото променливата letterInWord е направена, за да пази буквата като малка(дори и да е голяма).

от kirov (4821 точки)


6

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

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


от jasssonpet (6814 точки)


0
Евала Пич. Като ти видя решенията и виждам че всъщност имаме цялото време на света за решаването на задачите, стига да знаем какво правим.

от Tsanko (139 точки)

0
Само да споделя, че при логиката на твоето решение, първите ти два реда може би са излишни :D

от ZliaShnur (132 точки)



1

Аз пък я направих с двоично търсене, мисля че всичко трябва да е разбираемо. Алгоритъма ми допада повече от хамалското търсене :D

 

  1. using System;
  2.  
  3. class ArrayIndexOfLetters
  4. {
  5.     static void Main()
  6.     {
  7.         int[] letters = new int[26];
  8.  
  9.         //Initialize every letter code
  10.         for (int i = 0; i < letters.Length; i++)
  11.         {
  12.             letters[i] = 'a' + i;
  13.         }
  14.  
  15.         //Read the word from the console
  16.         string word = Console.ReadLine().ToLower();
  17.  
  18.         //Find every letter position in alphabet(array) by binary search.
  19.         for (int i = 0; i < word.Length; i++)
  20.         {
  21.             int middleElement = 0;
  22.             int firstElement = 0;
  23.             int lastElement = letters.Length - 1;
  24.  
  25.             while (firstElement <= lastElement)
  26.             {
  27.                 middleElement = (firstElement + lastElement) / 2;
  28.  
  29.                 if (word[i] < letters[middleElement])
  30.                 {
  31.                     lastElement = middleElement - 1;
  32.                 }
  33.                 else if (word[i] > letters[middleElement])
  34.                 {
  35.                     firstElement = middleElement + 1;
  36.                 }
  37.                 else // Print letter position
  38.                 {
  39.                     Console.WriteLine("Letter {0} in alphabet is at position: {1}", word[i], middleElement + 1);
  40.                     break;
  41.                 }
  42.             }
  43.         }
  44.     }
  45. }

от VGeorgiev (2890 точки)


0
И аз използвах вече готовия ми алгоритъм от предишната задача за търсенето ;)

от kdikov (3407 точки)

0
И аз така, промених го просто да е char. А и използвах foreach (char letter in word) да си обходя думата :).

от Cheesus (272 точки)