Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Коды C#, Вопросы 
V
    Опции темы
Legolas
Дата 14.2.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Здравствуйте! В этом году начал изучать C#. Работаю  в среде Visual Studio 2005. Возник вопрос по поводу написания программы:

Имеется некоторое предложение (слова разделяются символами подчеркивания - '_'). Используя треугольник Паскаля, зашифруйте исходное предложение по следующему правилу:
·   из предложения выделяется очередное слово;
·   из треугольника Паскаля выбирается строка с номером, равным числу букв в слове;
·   k-я буква исходного слова заменяется на букву, отстоящую от исходной на число букв, указанное в k-м столбце выбранной строки треугольника Паскаля (отсчет производится по кругу, т.е после 'я' идет 'а');

Пример:

_с т о л_    <- слово
  1 3 3 1     <- строка в треугольнике паскаля
Закодированное слово будет 'с'+1, 'т'+3, 'о'+3, 'л'+1, то есть "тхсм"  =))


PM MAIL   Вверх
nerezus
Дата 14.2.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Цитата

Возник вопрос по поводу написания программы
 Эм.... я даже перечитал, но вопроса так и не заметил.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Legolas
Дата 14.2.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Не могу написать код для расчета функции треугольника Паскаля и последующее подсиавление формулы в строку, заменяющую символы.
PM MAIL   Вверх
Idsa
Дата 15.2.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Вот примерный листинг необходимой тебе программы:
Код

  class Shifr
  {
    string str = "a_bc_def_klmnopqrstuvw";
    public int[] GetPaskal(int n)
    {
      if (n == 1)
        return new int[1] { 1 };
      else
      {
        int[] prev = new int[] { 1 };
        List<int> next = new List<int>();
        for (int i = 1; i < n; i++)
        {
          next.Add(1);
          for (int j = 0; j < prev.Length - 1; j++)
            next.Add(prev[j] + prev[j + 1]);
          next.Add(1);
          prev = next.ToArray();
          next.Clear();
        }
        return prev;
      }
    }
    public static void Main()
    {
      Shifr shifr = new Shifr();
      Console.WriteLine("Начальная строка: {0}", shifr.str);
      string[] words = shifr.str.Split('_');
      for (int i = 0; i < words.Length; i++)
      {
        int[] smeshenie = shifr.GetPaskal(words[i].Length);
        byte[] bytesOfTheWord = Encoding.ASCII.GetBytes(words[i]);
        for (int j = 0; j < words[i].Length; j++)
          bytesOfTheWord[j] += (byte)smeshenie[i];
        words[i] = Encoding.ASCII.GetString(bytesOfTheWord);
      }
      shifr.str = String.Join("_", words);
      Console.WriteLine("Конечная строка: {0}", shifr.str);
      Console.ReadLine();
    }
  }

Программку можно немного улучшить, но в общем она выполняет поставленную задачу.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Legolas
Дата 15.2.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Idsa, ты действительно шустрый!))) Большое спс за прогу - выручил!

Скажи пожалуйста, если я в программе должен задавать строку с клавиатуры, то в начале кода я должен писать: 
Код


str = Console.ReadLine();
? Просто если это так, то компилятор выдает ошибку...
PM MAIL   Вверх
Idsa
Дата 15.2.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Странно... Приведи побольше кода. Ошибка не в этой строке.

Это сообщение отредактировал(а) Idsa - 15.2.2007, 21:59


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Legolas
Дата 15.2.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Код


using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication33
{
     class Shifr
  {
    string str = Console.ReadLine(); //Это я изменил
    public int[] GetPaskal(int n)
    {
      if (n == 1)
        return new int[1] { 1 };
      else
      {
        int[] prev = new int[] { 1 };
        List<int> next = new List<int>();
        for (int i = 1; i < n; i++)
        {
          next.Add(1);
          for (int j = 0; j < prev.Length - 1; j++)
            next.Add(prev[j] + prev[j + 1]);
          next.Add(1);
          prev = next.ToArray();
          next.Clear();
        }
        return prev;
      }
    }
    public static void Main()
    {
      Shifr shifr = new Shifr();
      Console.WriteLine("Начальная строка: {0}", shifr.str);
      string[] words = shifr.str.Split('_');
      string rep;
        do
        {
      for (int i = 0; i < words.Length; i++)
      {
        int[] smeshenie = shifr.GetPaskal(words[i].Length);
        byte[] bytesOfTheWord = Encoding.ASCII.GetBytes(words[i]);
        for (int j = 0; j < words[i].Length; j++)
          bytesOfTheWord[j] += (byte)smeshenie[i];
        words[i] = Encoding.ASCII.GetString(bytesOfTheWord);
      }
      shifr.str = String.Join("_", words);
      Console.WriteLine("Конечная строка: {0}", shifr.str);
      Console.ReadLine();

            Console.WriteLine("------------------------------");
                Console.WriteLine("Berttucho's Production");
                Console.ReadLine();
                Console.WriteLine("для повторения введи  yes");
                Console.WriteLine("для выхода введи  exit и нажми Enter");
                rep = Console.ReadLine();
                Console.WriteLine();

            } while (rep == "yes" || rep == "Yes");
    }
  }
}



Компилятор выводит:

я_программист
Начальная строка: я_программист
Конечная строка: @_IIIIIIIIIII

Хотя нужно вывести вместо буквы я - а, а слово "программист" в соответствии с 11 строкой в треугольнике Паскаля (11 букв)...

Это сообщение отредактировал(а) Legolas - 15.2.2007, 22:11
PM MAIL   Вверх
Idsa
Дата 15.2.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Фишка в следующем: (MSDN)
Цитата

ASCIIEncoding encodes Unicode characters as single 7-bit ASCII characters. This encoding only supports character values between U+0000 and U+007F. Code page 20127. Also available through the ASCII property.

Получается, что .NET не поддерживает расширенную (8-битную) ASCII - кодировку. Было бы интересно узнать, почему это они один битик зажали? Может, решили таким образом подтолкнуть всех к переходу на Юникод?

В твоей ситуации оптимальным будет использовать UTF-8:
Цитата

UTF8Encoding encodes Unicode characters using the UTF-8 encoding. This encoding supports all Unicode character values. Code page 65001. Also available through the UTF8 property.

Однако имей в виду, что таблицы кодов и соответствующих символов в расширенной ASCII и в UTF8 не совпадают!

P. S. А что значит "code page 65001"?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Legolas
Дата 15.2.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



у меня возникла идея, в смысле я знаю как можно получить код ASCII каждого введенного символа, но не знаю как это связать с треугольником Паскаля...

Код


записываем в переменную а код символа ch

char ch;
int a;
a=(int)ch;

и наоборот

char ch;
int a;
ch=(char)a;

Console.WriteLine(ch);

PM MAIL   Вверх
Idsa
Дата 15.2.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Для того чтобы изменить кодировку, найди в коде строку Encoding.ASCII.GetBytes и замени ASCII, например, на UTF8.

Это сообщение отредактировал(а) Idsa - 15.2.2007, 22:52


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Legolas
Дата 15.2.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 14.2.2007

Репутация: 2
Всего: 5



Пеоменял,но компилятор пишет "?_?????????" в качестве шифровки строки...(
PM MAIL   Вверх
Idsa
Дата 15.2.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(Legolas @  15.2.2007,  22:42 Найти цитируемый пост)
Пеоменял,но компилятор пишет "?_?????????" в качестве шифровки строки...(

Да, действительно все не так просто:
Цитата

UTF-8, represents each code point as a sequence of one to four bytes.

Получается, что делать смещение тупым добавлением значения смещения мы не можем: буква может храниться вплоть до четырех ячеек нашего массива byte[].
У меня есть одна идея правильной реализации засчет GetByteCount... но это уже не сегодня. Если никто не предложит ничего более умного, завтра напишу код. А сейчас - спать smile.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 16.2.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Не нужно мудрить с byte[], GetBytes, кодировками и так далее. Строка состоит из char-ов, каждый из которых уже в юникоде, и обратиться к char-у строки можно по обычному индексу.


--------------------
user posted image
PM MAIL WWW   Вверх
Idsa
Дата 16.2.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(mr.DUDA @  16.2.2007,  10:34 Найти цитируемый пост)
Не нужно мудрить с byte[], GetBytes, кодировками и так далее. Строка состоит из char-ов, каждый из которых уже в юникоде, и обратиться к char-у строки можно по обычному индексу.

Да проблема-то не в этом! smile

Legolas, доделал я тебе прогу. Разбирайся:
Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Diagnostics;

namespace ConsoleApplication20
{
  using System;
  using System.Collections.Generic;
  using System.Text;

  namespace ConsoleApplication33
  {
    class Shifr
    {
      string str = Console.ReadLine();
      public int[] GetPaskal(int n)
      {
        if (n == 1)
          return new int[1] { 1 };
        else
        {
          int[] prev = new int[] { 1 };
          List<int> next = new List<int>();
          for (int i = 1; i < n; i++)
          {
            next.Add(1);
            for (int j = 0; j < prev.Length - 1; j++)
              next.Add(prev[j] + prev[j + 1]);
            next.Add(1);
            prev = next.ToArray();
            next.Clear();
          }
          return prev;
        }
      }
      public static void Main()
      {
        Shifr shifr = new Shifr();
        Console.WriteLine("Начальная строка: {0}", shifr.str);
        string[] words = shifr.str.Split('_');
        string[] words_sm = new string[words.Length];
        string rep;
        do
        {
          for (int i = 0; i < words.Length; i++)
          {
            int[] smeshenie = shifr.GetPaskal(words[i].Length);
            for (int j = 0; j < words[i].Length; j++)
              words_sm[i] += Convert.ToChar(((int)words[i][j]) + smeshenie[j]);
          }
          shifr.str = String.Join("_", words_sm);
          Console.WriteLine("Конечная строка: {0}", shifr.str);
          Console.WriteLine("------------------------------");
          Console.WriteLine("Berttucho's Production");
          Console.ReadLine();
          Console.WriteLine("для повторения введи  yes");
          Console.WriteLine("для выхода введи  exit и нажми Enter");
          rep = Console.ReadLine();
          Console.WriteLine();

        } while (rep == "yes" || rep == "Yes");
      }
    }
  }
}


Добавлено @ 13:31 
Input: а_бв
Output: б_вг

Добавлено @ 13:35 
В процессе написания программы я окончательно запутался в Unicod'е... Чтобы не флудить здесь, наверное, создам отдельную тему.

Это сообщение отредактировал(а) Idsa - 16.2.2007, 13:33


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Gelis
Дата 16.2.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 26.10.2006
Где: Брест

Репутация: 2
Всего: 4



Цитата(Legolas @  15.2.2007,  22:42 Найти цитируемый пост)
Пеоменял,но компилятор пишет "?_?????????" в качестве шифровки строки...(

Нужно использовать не
Encoding.ASCII
а кодировку
Encoding.GetEncoding(866)
Первая просто ничего не знаят об руском языке и нужно явно указать 866-кодовую страницу, которая используется для русского языка в консольных приложениях
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.