Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2012, 18:54   #1
Надежда1286
Пользователь
 
Аватар для Надежда1286
 
Регистрация: 26.10.2011
Сообщений: 16
По умолчанию Написать программу на C#

Необходимо решить задачу на C#: Описать класс «ВосьмеричноеЧисло» для работы
со строкой, позволяющей хранить только восьмерич-
ное число и выполнять с объектами данного класса
следующие операции:
– инициализацию объекта заданным значением с
проверкой допустимости значений.
В случае недопустимых значений выбрасывать ис-
ключения.
Выполнять над объектами класса операции
– сложения;
– вычитания;
– умножения и
– целочисленное деление.
Описать свойства для получения состояния объекта.
Написать программу, демонстрирующую все разра-
ботанные элементы класса.
Результат решения задачи внести в файл Outlet.out.
Ввод (файл Inlet.in):
anan−1 : : : a1a0(8) (где ai i =
0; n – строка цифр )
Число1(8)
Число2(8)
Вывод (файл Outlet.out):
anan−1 : : : a1a0
SnSn−1 : : : S1S0 – сумма
RnRn−1 : : :R1R0 – разность
PnPn−1 : : : P1P0 – произведение
CnCn−1 : : :C1C0 – целая часть
частного от деления
чисел Числа1(8) и Число2(8)

Есть задача, решённая на Delphi. Необходимо переписать на C#. Очень нужно!!!Перевод из 10 в 8 и наоборот можно не делать(в написанной задаче есть).
Надежда1286 вне форума Ответить с цитированием
Старый 19.11.2012, 18:55   #2
Надежда1286
Пользователь
 
Аватар для Надежда1286
 
Регистрация: 26.10.2011
Сообщений: 16
По умолчанию

Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  const ss: byte = 5 ;
implementation
{$R *.dfm}
{$R WinXP.res}
function deg(a,b:real):integer;
begin
  DEG:=strtoint(floattostr( exp(b*ln(a))));
end;


function vDes(chislo : string) : integer;
var   otvet : integer;
      p, i  : integer;
begin
  otvet:=0;
  p:=1;
  for i:=length(chislo) downto 1  do
    begin
      otvet:=otvet+ strtoint(chislo[p])*deg(ss,i-1);
      inc(p);
    end;  
  vDes:=otvet;
end;


function izDes(chislo : integer) : string;
var   otvet,otvet1 : string;
      t, i  : integer;
begin
  otvet:='';
  while chislo>=ss do
    begin
      t:= chislo mod ss;
      chislo:=chislo div ss;
      otvet:=otvet+inttostr(t);
    end;
  otvet:=otvet+inttostr(chislo);
  otvet1:='';
  for i:=length(otvet) downto 1 do
    otvet1:=otvet1+otvet[i];
  izDes:=otvet1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
isx,otv:string;

begin
isx:=edit3.Text;
otv:=izDes(strtoint(isx));
edit5.Text:=otv;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
isx,otv:string;
begin
isx:=edit3.Text;
otv:=inttostr(vDes(isx));
edit5.Text:=otv;
end;

function sum(a,b:string):string;
var
i:integer;
a1,b1,o1:array [0..1000] of integer;
s,summ:string;
begin
  for i:=0 to 1000 do
    begin
      a1[i]:=0;
      b1[i]:=0;
      o1[i]:=0;
    end;
  if length(a)>length(b)
    then begin
      for i:=1 to length(a)-length(b) do
        b:='0'+b;
    end
    else begin
      for i:=1 to length(b)-length(a) do
        a:='0'+a;
    end;
  for i:=1 to length(a) do
    begin
      a1[i]:=strtoint(a[i]);
      b1[i]:=strtoint(b[i]);
    end;
  for i:=length(a) downto 1 do
    begin
      o1[i-1]:=(o1[i]+a1[i]+b1[i]) div ss;
      o1[i]:=(o1[i]+a1[i]+b1[i]) mod ss;
    end;
    summ:='';
  if o1[0]=0
    then begin
      for i:=1 to length(a) do
        summ:=summ+inttostr(o1[i]);
    end
    else begin
      for i:=0 to length(a) do
        summ:=summ+inttostr(o1[i]);
    end;
  sum:=summ;
end;

function razn(a,b:string):string;
var
i:integer;
a1,b1,o1:array [0..1000] of integer;
s,raznn:string;
begin
  for i:=0 to 1000 do
    begin
      a1[i]:=0;
      b1[i]:=0;
      o1[i]:=0;
    end;
  if length(a)>length(b)
    then begin
      for i:=1 to length(a)-length(b) do
        b:='0'+b;
    end
    else begin
      for i:=1 to length(b)-length(a) do
        a:='0'+a;
    end;
  for i:=1 to length(a) do
    begin
      a1[i]:=strtoint(a[i]);
      b1[i]:=strtoint(b[i]);
    end;
  for i:=length(a) downto 1 do
    begin
      o1[i]:=o1[i]+a1[i]-b1[i];
      if o1[i]<0
        then begin
          o1[i]:=o1[i]+ss;
          o1[i-1]:=o1[i-1]-1;
        end;
    end;
    raznn:='';
  if o1[1]=0
    then begin
      for i:=2 to length(a) do
        raznn:=raznn+inttostr(o1[i]);
    end
    else begin
      for i:=1 to length(a) do
        raznn:=raznn+inttostr(o1[i]);
    end;
  razn:=raznn;
end;

function ymn(a,b:string):string;
var
i,k,j,l:integer;
a1,b1,o1:array [0..1000] of integer;
s,ymnn:string;
begin
  for i:=0 to 1000 do
    begin
      a1[i]:=0;
      b1[i]:=0;
      o1[i]:=0;
    end;
  l:=1;
  for i:=length(a) downto 1 do
    begin
      a1[l]:=strtoint(a[i]);
      inc(l);
    end;
  l:=1;
  for i:=length(b) downto 1 do
    begin
      b1[l]:=strtoint(b[i]);
      inc(l);
    end;
  ymnn:='0';
  for i:=1 to length(b) do
    begin
      k:=0;
      s:='';
      for j:=1 to length(a)do
        begin
          o1[j]:=((a1[j]*b1[i])+k) mod ss;
          k:= (a1[j]*b1[i]+k) div ss;
        end;
      o1[length(a)+1]:=k;
      for l:=length(a)+1 downto 1 do
        begin
          s:=s+inttostr(o1[l]);
        end;
      for l:=1 to i-1 do
        s:=s+'0';
      ymnn:=sum(ymnn,s);
    end;
  ymn:=ymnn;
end;
Надежда1286 вне форума Ответить с цитированием
Старый 19.11.2012, 18:56   #3
Надежда1286
Пользователь
 
Аватар для Надежда1286
 
Регистрация: 26.10.2011
Сообщений: 16
По умолчанию продолжение

Код:
function bolshe(a,b:string):boolean;
var
i:integer;
a1,b1,o1:array [0..1000] of integer;
begin
  for i:=0 to 1000 do
    begin
      a1[i]:=0;
      b1[i]:=0;
      o1[i]:=0;
    end;
  if length(a)>length(b)
    then begin
      for i:=1 to length(a)-length(b) do
        b:='0'+b;
    end
    else begin
      for i:=1 to length(b)-length(a) do
        a:='0'+a;
    end;
  for i:=1 to length(a) do
    begin
      a1[i]:=strtoint(a[i]);
      b1[i]:=strtoint(b[i]);
    end;
  for i:=length(a) downto 1 do
    begin
      o1[i]:=o1[i]+a1[i]-b1[i];
      if o1[i]<0
        then begin
          o1[i]:=o1[i]+ss;
          o1[i-1]:=o1[i-1]-1;
        end;
    end;
  if o1[0]<0
    then bolshe:=false
    else bolshe:=true;
end;

function del(a,b:string):string;
var
i,k,j,l:integer;
a1,b1,o1:array [0..1000] of integer;
s,dell:string;
begin
  for i:=0 to 1000 do
    begin
      a1[i]:=0;
      b1[i]:=0;
      o1[i]:=0;
    end;
  if not(bolshe(a,b))
    then del:='0+ остаток'+a
    else begin
      s:='';
      dell:='';
      for i:=1 to length(a) do
        begin
          s:=s+a[i];
          if not(bolshe(s,b))
            then dell:=dell+'0'
            else begin
              l:=0;
              while bolshe(s,b) do
                begin
                  s:=razn(s,b);
                  inc(l);
                end;
              dell:=dell+inttostr(l);
            end;
        end;
    end;
  del:=dell+ ' + остаток '+s;
end;


procedure TForm1.Button3Click(Sender: TObject);
var
perv,vtor,otvet:string;
begin
  perv:=edit3.text;
  vtor:=edit4.text;
  otvet:=sum(perv,vtor);
  edit5.Text:=otvet;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
perv,vtor,otvet:string;
begin
  perv:=edit3.text;
  vtor:=edit4.text;
  otvet:=razn(perv,vtor);
  edit5.Text:=otvet;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
perv,vtor,otvet:string;
begin
  perv:=edit3.text;
  vtor:=edit4.text;
  otvet:=ymn(perv,vtor);
  edit5.Text:=otvet;
end;

procedure TForm1.Button6Click(Sender: TObject);
var
perv,vtor,otvet:string;
begin
  perv:=edit3.text;
  vtor:=edit4.text;
  otvet:=del(perv,vtor);
  edit5.Text:=otvet;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
Form1.Close;
end;


end.
Надежда1286 вне форума Ответить с цитированием
Старый 19.11.2012, 18:58   #4
Надежда1286
Пользователь
 
Аватар для Надежда1286
 
Регистрация: 26.10.2011
Сообщений: 16
По умолчанию

Описание класса и операция сложения на C# тоже есть:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ОперацииС_Восьмеричными
{
    class ВосьмеричноеЧисло : IEnumerable
    {
        ArrayList число;
        char знакЧисла = ' ';
        /// <summary>
        /// Конструктор по умолчанию. Формирует "пустое" число
        /// </summary>
        public ВосьмеричноеЧисло() 
        {
            число = new ArrayList();
        }
        /// <summary>
        /// Конструктор с аргументом. Формирует число по его строковому представлению
        /// с контролем за корректностью указания цифр 8-ого представления числа
        /// </summary>
        /// <param name="число"> - строковое предсталение числа</param>
        /// 
        public ВосьмеричноеЧисло(string число)
        {
            this.число = new ArrayList(число.Length);
            знакЧисла = число[0];
            if (знакЧисла == '-' || знакЧисла == '+' || знакЧисла == ' ')
            {
                число = число.Remove(0, 1);
            }
            else
            {
                if (знакЧисла < '0' || знакЧисла > '7')
                {
                    throw new Exception("В начале числе ни знак числа, ни восьмеричная цифра");
                }
            }
            foreach (char цифра in число)
            {
                if (((int)цифра - 48 <= 7) && ((int)цифра - 48 >= 0))
                {
                    this.число.Add((int)цифра - 48);
                }
                else
                {
                    throw new Exception("Не восьмеричная цифра");
                }
            }

        }
        /// <summary>
        /// Свойство 
        ///   - выводящее значение длины числа (по записи)
        ///   - принимающее значение длины (по чтению)
        /// </summary>
        public int длинаЧисла
        {
            get
            {
                return число.Count;
            }
            set
            {
                if (число.Capacity != value)
                {
                    число.Capacity = value;
                }
            }
        }
        /// <summary>
        /// Итератор, дающий возможность "просматривать" цифры числа
        /// </summary>
        /// <returns></returns>
        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < число.Count; i++)
                yield return число[i];
        }
        /// <summary>
        /// Метод возвращающий значение числа (в виде строки)
        /// </summary>
        /// <returns></returns>
        public string значение()
        {
            string стрЧисло="";
            foreach (int цифра in число)
                стрЧисло=стрЧисло+цифра;
            return знакЧисла+ стрЧисло;
        }
        /// <summary>
        /// Переопределение операции "+"
        /// </summary>
        /// <param name="слагаемое1"> - первое слагаемое</param>
        /// <param name="слагаемое2"> - второе слагаемое</param>
        /// <returns></returns>
        public static ВосьмеричноеЧисло operator +(ВосьмеричноеЧисло слагаемое1, ВосьмеричноеЧисло слагаемое2)
        {
            ВосьмеричноеЧисло сумма = new ВосьмеричноеЧисло();
            сумма.длинаЧисла = слагаемое1.длинаЧисла > слагаемое2.длинаЧисла ? слагаемое1.длинаЧисла + 1 : слагаемое2.длинаЧисла + 1;
            int суммаЦифр, единицаПереноса = 0, поз1 = слагаемое1.число.Count - 1, поз2 = слагаемое2.число.Count - 1;
            while (поз1 >= 0 && поз2 >= 0)
            {
                суммаЦифр = (int)слагаемое1.число[поз1] + (int)слагаемое2.число[поз2]+единицаПереноса;
                единицаПереноса = суммаЦифр / 8;
                сумма.число.Insert(0, суммаЦифр - единицаПереноса * 8);
                поз1--;
                поз2--;
            }
            while (поз1 >= 0)
            {
                суммаЦифр = (int)слагаемое1.число[поз1] + единицаПереноса;
                единицаПереноса = суммаЦифр / 8;
                сумма.число.Insert(0, суммаЦифр - единицаПереноса * 8);
                поз1--;
            }
            while (поз2 >= 0)
            {
                суммаЦифр = (int)слагаемое2.число[поз2] + единицаПереноса;
                единицаПереноса = суммаЦифр / 8;
                сумма.число.Insert(0, суммаЦифр - единицаПереноса * 8);
                поз2--;
            }
            if (единицаПереноса!=0)
                сумма.число.Insert(0, единицаПереноса);
            return сумма;
        }
    }
}
Надежда1286 вне форума Ответить с цитированием
Старый 19.11.2012, 19:49   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что-то типа такого?:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Octan {
        private int val;
        public  Octan(string v) { val = Convert.ToInt32(v, 8); }
        public static Octan operator +(Octan Sorce, Octan Dest)
        {
            return new Octan(Convert.ToString(Sorce.val + Dest.val,8));
        }
        public static Octan operator -(Octan Sorce, Octan Dest)
        {
            return new Octan(Convert.ToString(Sorce.val - Dest.val, 8));
        }
        public static Octan operator *(Octan Sorce, Octan Dest)
        {
            return new Octan(Convert.ToString(Sorce.val * Dest.val, 8));
        }
        public static Octan operator /(Octan Sorce, Octan Dest)
        {
            return new Octan(Convert.ToString(Sorce.val / Dest.val, 8));
        }
        public string Result { get { return val.ToString(); } }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Octan q = new Octan("10");
            Octan w = new Octan("20");
            Octan e = q + w;
            Console.WriteLine("{0}", e.Result);
            Console.ReadKey();
        }
    }
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2012, 19:57   #6
Надежда1286
Пользователь
 
Аватар для Надежда1286
 
Регистрация: 26.10.2011
Сообщений: 16
По умолчанию

А можно немного пояснить. =)
Надежда1286 вне форума Ответить с цитированием
Старый 19.11.2012, 20:43   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что именно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2012, 20:50   #8
Надежда1286
Пользователь
 
Аватар для Надежда1286
 
Регистрация: 26.10.2011
Сообщений: 16
По умолчанию

Ну, я так понимаю, это реализация всей программы. Просто, в С# я совсем плохо разбираюсь, ну а в Delphi ещё более-мение. Ваша программа получилась очень маленькой, даже по сравнению с реализацией одной арифметической операцией сложения, которую мне дал преподаватель. Неужели не нужно сравнивать длинну чисел в 8-ичной системе счисления при выполнении арифметических операций???
Надежда1286 вне форума Ответить с цитированием
Старый 19.11.2012, 21:32   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Неужели не нужно сравнивать длинну чисел в 8-ичной системе счисления при выполнении арифметических операций???
Ну а ты понимаешь что если брать сверхдлинное число, придется использовать длинную арифметику?
Ты можешь определиться в каких рамках будут числа? Неужели под 100 знаков и больше?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу на С++ mellowhype Помощь студентам 1 23.04.2012 20:38
Написать программу для перевода из 16-ричной системы счисления в 10-тичную, использовать процедурую(написать Delphi) BLADIMIR Помощь студентам 3 07.09.2011 16:35
Написать программу Holzz Фриланс 3 16.07.2011 12:27
Написать программу на С++ Goldcoding Фриланс 3 18.06.2010 13:29
Написать программу в С Лоя Помощь студентам 30 19.04.2009 18:18