Loading...
ZvetanIG avatar ZvetanIG 907 Точки

[Homework] C# Basics - Problem 14. Print the ASCII Table

Здрасти, някой има ли идея за тази задача. Как да прескочим отпечатването на символите, които не се изобразяват на екрана?

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

using System;

class PrintASCIITable
{
    static void Main()
    {
        char c;
        for (int i = 0; i <= 255; i++)
        {
            c = (char)i;
            if (char.IsSymbol(c)  || char.IsLetter(c) || char.IsNumber(c))
            {
                Console.WriteLine("{0} -> {1}", i, (char)i);
            }
        }
    }
}

Тагове:
5
Programming Basics 08/11/2014 19:22:46
beBoss avatar beBoss 507 Точки
Best Answer

За да прескочиш празните символи, просто почни цикъла от 33

Ето два примера и от мен:

----------------------------------------------

using System;
  •  
  •  
  • class PrintsASCIITable
  • {
  •     static void Main()
  •     {
  •         Console.OutputEncoding = System.Text.Encoding.UTF8;
  •  
  •         //skip characters that cannot be displayed "000"
  •         for (char c = (char)033; c <= (char)255; c++)
  •         {
  •             Console.WriteLine(c);
  •         }
  •  
  •         //or simple way
  •         //for (int character = 0; character < 255; character++)
  •         //{
  •         //    char symbol = (char)character;
  •         //    Console.WriteLine("{0} -> {1}", character, symbol);
  •  
  •         //}
  •     }
  • }
  • 9
    dZf1aeA-KlimentHristov avatar dZf1aeA-KlimentHristov 56 Точки

    Аз също така я реших , направих два цикъла, единия от 33 до 127 , другия от 160 до 255 .

    Директно да не ги показва празните питанки :)

    0
    Fleshian avatar Fleshian 379 Точки
    Здравей Колега :)
    Тъй като голяма част от ASCII таблицата реално не са същестуващи знаци а по скоро функции които се ползват за различни неща, да ти кажа чесно и аз не знам за какво точно са. Това което можеш да направиш за да видиш повечето знаци е да напишеш кода даден от долу, но дори и с него пак няма да се принитсрат всички знаци, тъй като голяма част от тях реално не са съществуващи символи. Ето ти  линк да видиш какво точно съдържа таблицата.

    За да видиш всички изписани знаци разшири бъфера(скрола) на конзолата с кода:
    Console.BufferHeight = 256;

    Добави към библиотеките,
    using System.Text;

    а в кода:
    Console.OutputEncoding = Encoding.Unicode;

    В първите 31 символа се появяват някакви много весели емотиконки:D
    Поздрави Деян :)
    0
    coaster avatar coaster 412 Точки
    Да ви попитам - и при вас ли символите от 128 до 159 включително се показват като въпросчета? Пробвах с различните видове encoding (като се надявах най-вече на UTF8 i ASCII, не знам защо хаха), но в крайна сметка го оставих Unicode - логично.
    1
    pdechkova avatar pdechkova 95 Точки
    И при мен има много въпросителни
    0
    gbelcheva avatar gbelcheva 1 Точки

    Проверката в моя код 

    if (char.IsControl(ch)){нещо си}

    дава "нещо си" за символите с кодове 127-159, т.е. това са control characters, които не излизат нормално и могат да се пропуснат. Доколкото разбрах 

    "Codes 128–255, along with the ASCII set, make up the Extended ASCII or ISO Latin‑1 character set. This set is technically called ISO-8859‑1These characters are displayed here with a yellow background. Codes 128–159 in the Latin‑1 set are non-printing control characters.

    Characters 128–159 as shown on this chart do not belong to the Latin‑1 character set. They are part of the Windows-1252 character set..."

    http://www.danshort.com/ASCIImap/

    1
    rosenrusev avatar rosenrusev 175 Точки

    Здравейте,

    Аз използвам кодировка Windows 1252:

    Console.OutputEncoding = System.Text.Encoding.GetEncoding(1252);

    С малко допълнителна логика маймунките, които виждате се визуализират. За целта аз използвам уникодовете на съответните ASCII символи. Задачката е интересна за Extended ASCII Table. 

    Успех с визуализацията :)

    0
    mzografski avatar mzografski 189 Точки
    Ето и моята интерпретация с малко фукня :) но само за първите 128 символа. Все пак не са споменали екстендед ли да е или не...
    5
    p.tseperski avatar p.tseperski 21 Точки

    Много добро решение колега. Хареса ми подредбата и решението което си представил. :) Даже в моето решение си добавих и формата на печатане по конзолата като при теб. А в условието на задачата изрично пише от 0 до 255 символа, което си е неявно изказване за разширената таблица. ;) Ето го и условието:

    Problem 14. * Print the ASCII Table Find online more information about ASCII (American Standard Code for Information Interchange) and write a program to prints the entire ASCII table of characters at the console (characters from 0 to 255). Note that some characters have a special purpose and will not be displayed as expected. You may skip them or display  them differently. You may need to use for-loops (learn in Internet how).
    1
    rosenrusev avatar rosenrusev 175 Точки

    Здравей mzografski

    В условието на задачата е споменато следното"write a program to prints the entire ASCII table of characters at the console (characters from 0 to 255)", което според мен си е разширената таблица и изключва варианта до 128-ия символ само :)

    0
    g.stoyanov avatar g.stoyanov 776 Точки
     Ето едно така да се каже лошо решение от мен, лошо с оглед на това как не трябва да се пише код - толкова не-разбито, не-четимо и ОРИГИНАЛНО :))) Все пак всички сме почнали от начало все някога ;) CODE
    0
    rosenrusev avatar rosenrusev 175 Точки

    Браво!  И аз го направих по подобен начин на твоя това заместване преди два часа, за да проиграя решение, ама се боря сега за нещо по оптимално :) Уникодовете ги намерих тук: http://msdn.microsoft.com/en-US/goglobal/cc305145.aspx .

    Това е причината да не съм заспал още :)))

    0
    g.stoyanov avatar g.stoyanov 776 Точки
    Определено има по оптимално решение, просто като видях темата се сетих колко бях въодушевен преди 1 година да направя тази задача перфектно... И идеите които ми идваха но нямах знания, но с желание всичко се постига... Все пак се потрудих да направя нещо красиво но за съжаление неправилно от гледна страна на правилен код :). Сега също имам желание да подобря това си решение, пак въодушевен - какво да се прави съдба! Ще пусна новото веднага като го напиша.
    0
    kasskata avatar kasskata 492 Точки

    Console.OutputEncoding = Encoding.Unicode

     търсения от нас ред.Пробвайте ако не сте се сетили да продължите цикъла до char.MaxValue и добавете един StringBuilder за бързо изписване и гледайте...:D

    0
    dim4o avatar dim4o 288 Точки

    Ето и моето решение. Надявам се да помогне. Мисля, че изкарах всичките символи с изключение на тези, които не могат да се принтират. Би трябвало да върви и при всякакви настройки на конзолата. Същественото е, че се прави масив от тип byte[] с единствен елемент - поредния индекс, който после се енкодва: Encoding.GetEncoding(437). Нали е Американска схема това ACSII, затова използвам този код 437(таблицата долу). После използвам метода GetChar(byte[]), който връща масив със символа. После остава само да се извлече символа и да се принтира. За изключенията, когато не може да се принтира коректно използвам конструкцията switch-case. Цикъла ми е са byte, защото GetChar() работи с масив от байтове. Затова и накрая се налага да обработя 255 допълнително, а цикъла ми е до 254. Като стане 255, преди на навлезе в тялото имаме index++, т.е. там си пази вече 256, което вече е извън рамките на обхвата на byte. Затова ако сменим index < byte.MaxValue на index <= byte.MaxValue се получава зацикляне. Незнам дали го обясних добре, но просто не можах да измисля по-просто решение. Ако някой има решение, което да използва по-малко знания за принтиране на Extended ASCII ще се радвам да го видя. Сравнявал съм резултата за Extended ASCII от тук. Извинявам се за ужасното форматиране на кода, но не намерих никаква нормална функция за вграждане тук.

    P.S. ето кода и тук. Доста по-добре се чете така така.

     

    using System;

    using System.Text;

    namespace PrintTheASCIITable
    {
    class PrintTheASCIITable
    {
    static void Main()
    {
    Console.OutputEncoding = Encoding.Unicode;

    for (byte index = 0; index &amp;amp;lt; byte.MaxValue; index++)
    {
    byte[] byteArray = { index };
    char[] asciiArray = Encoding.GetEncoding(437).GetChars(byteArray);
    char asciiSign = asciiArray[0];
    //or: char asciiSign = Encoding.GetEncoding(437).GetChars(new byte[]{index})[0];

    switch (index)
    {
    case 0: Console.WriteLine("{0} = not visible (null)", index); break;
    case 7: Console.WriteLine(@"{0} = not visible (""beep!"" sound)", index); break;
    case 8: Console.WriteLine("{0} = not visible (backspace)", index); break;
    case 9: Console.WriteLine("{0} = not visible (horizontal tab)", index); break;
    case 10: Console.WriteLine("{0} = not visible (new line)", index); break;
    case 13: Console.WriteLine("{0} = not visible (carriage return)", index); break;
    case 127: Console.WriteLine("{0} = not visible (DEL)", index); break;
    case 32: Console.WriteLine("{0} = space", index); break;

    default: Console.WriteLine("{0} = {1}", index, asciiSign); break;
    }
    }
    char lastChar = Encoding.GetEncoding(437).GetChars(new byte[] { 255 })[0];
    Console.WriteLine("{0} = not visible", 255, lastChar);
    }
    }
    }

    4
    pepster avatar pepster 69 Точки

    Здравей dim4o. Много ми допадна твоето решение.Тази задачата доста ме затрудни, защото не успявах да отпечатам символите в съответсвие с таблицата. Рових много, прегледах и няколко публикувани решения ... твоето действително вади всички символи. Браво ! Само няколко козметични неща искам да допълня :

    1. Символи със специално предназначение. При начина, по който е използван switch-case-а се обработват онези случаи, в които на конзолата не се разпечатва символ. Не се покриват всички "специални". Например 3-ката в таблицата пише, че кодира край на текст, програмката вади сърчице... Нямам идея защо, ако някой знае - да каже ... . Моето предложение е конструкцията да се замени с един IF който проверява дали символа е "контролен" т.е със специално предназначение и ако да - да изписва че е такъв, ако не да разпечатва съответния символ и с това да се приключи въпроса. Това имам предвид: if (char.IsControl(asciiSign));

    2. Цикъла. Би могъл да не е byte а int. Просто когато се инициализира byte масива се каства index-а.Така отпада зациклянето, данни не се губят при кастването(защото така или иначе ще го въртим цикъла само до 255) и отпада кода за обработка на 255-тия елемент. Ето това имам предвид: 

    for (int index = 0; index <= byte.MaxValue; index++) 

    ....

    byte[] byteArray = { (byte)index }; 

    Иначе решението е супер! Поздравления

    0
    t.kanchev avatar t.kanchev 25 Точки

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

     

     

     

     

    using System;
    using System.Text;

    class PrintASCIITable
    {
          static void Main()
          {
                Console.OutputEncoding = Encoding.Unicode;
                for ( int i = 33; i < 127; i++)
               {
                       Console.WriteLine("{0} => {1}", i, (char)i);
                }

                Console.OutputEncoding = Encoding.Unicode;
                for (int i = 160; i < 255; i++)
                {
                        Console.WriteLine("{0} => {1}", i, (char)i);
                }
    }
    }

    0
    dim4o avatar dim4o 288 Точки

    Можеш да изкараш всички символи с този код. По-горе съм обяснил логиката накратко.

    0
    aslv1 avatar aslv1 304 Точки

    Стараейки се да бъда кратък, ще кажа, че щом трябва се работи с ASCII, не трябва да се намесва Unicode. И тъй като кодировката по подразбиране е UTF-8, трябва явно да се използва ASCII. Например ето така аз вземам кода:

    char c;
    for (byte i = min; i < max; i++)

    {
        // Get ASCII character.
        c = Encoding.ASCII.GetChars(new byte[] { i })[0];
        // ...
    }

    Пълният ми код - тук.

    1
    tdsamardzhiev avatar tdsamardzhiev 77 Точки

    Условието на задачата изрично изисква символи на позиции 0-255. Също така, символите 0-127 са индентични в ASCII/Unicode. A Encoding-a по подразбиране е най-добре да приемем, че не знаем какъв е: Encoding.Default 

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