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
tpelev avatar tpelev 2 Точки

Това е моето решение. Пробвах да добавя и шестнадесетичен код.

 

using System;

namespace problem14PrintTheASCIITable
{
class Program
{
static void Main()
{
Console.Write("Decimal".PadRight(15));
Console.Write("ASCII".PadRight(15));
Console.Write("Hex".PadRight(15));
Console.WriteLine();

int min = 0;
int max = 255;
for (int i = min; i < max; i++)
{

char c = (char)i;


string display = string.Empty;
if (char.IsWhiteSpace(c))
{
display = c.ToString();
switch (c)
{
case '\t':
display = "\\t";
break;
case ' ':
display = "space";
break;
case '\n':
display = "\\n";
break;
case '\r':
display = "\\r";
break;
case '\v':
display = "\\v";
break;
case '\f':
display = "\\f";
break;
}
}
else if (char.IsControl(c))
{
display = "control";
}
else
{
display = c.ToString();
}

Console.Write(i.ToString().PadRight(15));
Console.Write(display.PadRight(15));
Console.Write(i.ToString("X2"));
Console.WriteLine();
}
}
}
}

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Здравейте,

 

Аз до 33 ги пропуснах, понеже реално не са символи и няма как да бъдат представени коректно на конзолата. Само 7 оставих да писука. След това от 33 до 128 и от 160 до края пуснах цикли. оТ 128 ДО 160 каквито и шрифтове и кодировки да слагам, не успях да го накарам да изкара символите коректно, използвайки номерата на аски кодовете. Затова изведох номерата от 128 до 160 по възможно най-бабешкия начин:

Console.WriteLine("€\n \n‚\nƒ\n„\n…\n†\n‡\nˆ\n‰\nŠ\n‹\nŒ\n \nŽ\n \n \n‘\n’\n“\n”\n•\n–\n\n—\n˜\n™\nš\n›\nœ\n \nž\nŸ");

Все пак се замислям дали не може да се пусне някакъв цикъл и тук. Unicode на тези символи е реално аски кодът им в шестнайсетична бройна система. Има ли начин да направим някакъв цикъл от рода на:

for (i=128; i<=160; i++)

{

Console.Writeline('\u(i)');

}

Това не е точно код, Вижуал студио не го приема, но схващате идеята. Някак си да принтираме стойността на i в скобите ма Console.WriteLine. Например да обърнем изписването на i в шестнайсетична бройна система в стринг и да сложим променливата, съдържаща стринга в скобите. Рових в Гугъл, но не разбрах има ли такъв вариант.

1
mihayloff14 avatar mihayloff14 824 Точки

Мисля че това може да свърши работа:

symbol = '\u0127';


for (int i = 128; i < 160; i++)
{
    symbol++;
    Console.WriteLine(symbol);
}

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Благодаря ти за помощта. Не знаех, че може да се извършват математически действия към char, зададен като уникод. Но явно е заложено. Само малка поправка - не symbol = '\u0127'. а symbol = '\u007E' понеже \u работи по подразбиране с шестнайсетична бройна система. Иначе цикълът тръгна. За съжаление обаче отпечатването пак не се състоя. Продължава да вади питанки и с уникод. Та засега оставям бабешкото решение. Само не ми е ясно защо ги изписва, когато са копирани в самия код в такъв случай.

С учудване установих, че има няколко варианта на разширената аски таблица. Но мисля, че този, който ползвам, е този, който възприема компютърът по подразбиране.

0
quickben avatar quickben 966 Точки

Колега виж ТУК  може да ти помогне нещо при мен всичките символи се принтират. Само на "Raster Fonts" не се показват 4 символа(7. 8. 9. 13) мислех да направя така, че да се сменя фонта на някой от двата които работят добре със символи и намерих начин как да стане това, но засега съм решил да не го правя този финт :)

0
SimeonSimeonov avatar SimeonSimeonov 77 Точки

Аз имам следният странен проблем:
Пиша 2 цикъла които на теория трябва да правят абсолютно едно и също нещо,просто са написани по различен начин.
Единия работи без проблем а другия крашва на 122рия елемент в конзолата(при i=123).

Кода който работи нормално и изписва цялата ASCII таблица е:
for (int i = 0; i < 256; i++)
{
Console.WriteLine(i+ " is " + (char)i + " in ASCII");
}

 

Кода който стига до 122ри елемент и гърми е:
for (int i = 0; i < 256; i++)
{
Console.WriteLine("{0} is " + (char)i + " in ASCII",i);
}

Както виждате единствената разлика между двете е че във 1вия случай използвам i+ за да добавя i към стринга,а в другия използвам {0}.

Въпросът ми е защо гърми във втория случай програмата,данеби синтаксисът {0} да има някакво числово ограничение(от 123) и има ли как да оправя този краш използвайки 2рия синтанксис(със {0} )?

0
Filkolev avatar Filkolev 4482 Точки

Когато ползваш параметри трябва да ги изброяваш накрая. Малко се губи смисъла да ги ползваш и едновременно с това да ползваш и конкатенация. Пробвай така:

for (int i = 0; i < 256; i++)
     {
          Console.WriteLine("{0} is {1} in ASCII", i, (char)i);
     }

Не съм много сигурен защо точно на 122-ри ти гърми, но явно тогава става проблемно ползването по този начин на плейсхолдъра.

0
crazy7 avatar crazy7 177 Точки

Това е правилния начин за второто:

for (int i = 0; i < 256; i++)
{
    Console.WriteLine("{0} is {1} in ASCII", i, (char)i);
}

 

Проблема е от там че второто използва StringBuilder и 123 ти елемент е "{" и от там го чупи защото чака и затварящата

3
SimeonSimeonov avatar SimeonSimeonov 77 Точки

Мерси за отговорите колеги,явно наистина тоя знак { го бърка и кара да гърми.
Чудно все пак,когато го написах както Fikolev е казал( Console.WriteLine("{0} is {1} in ASCII", i, (char)i); )тогава тези скоби {} не го карат да гърми и си изписва всичко до 255.

0
AntonPortenov avatar AntonPortenov 102 Точки

Здравейте,

 

предлагам ви и моето решение.

http://pastebin.com/u5tEJBjC

има един момент, при който 2рия цикъл ми изяждаше N11 и затова му зададох директно стойност след като излиза от него. :)

 

0
Leprikona avatar Leprikona 108 Точки

Тук е моето решение. Просто използвах метода ".ToChar", който връща символа на дадената позиция от цикъла, и съвета от beBoss, цикъла да започва от 33, за да прескочим празните символи.

 

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