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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2015, 17:26   #1
Вероника92
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 35
По умолчанию Вылетает после ввода матрицы

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

  const
    n=10;
    type
      t1= array[1..n] of Integer;
var
   x:t1;
   i:integer;

procedure Input(x:t1);
  var i:Integer;
  begin
     Write('ââåäèòå 10 ÷èñåë: ');
     for i:=1 to n do
         read(x[i]);
  end;
 //-------------------------------------
   function Seach(const x: t1; d:Byte): Integer;
var
  y,i: Integer;
begin
  y:=1;
  while d<>0 do
    begin
      y:= y*10;
      Dec(d)
    end;

  Seach:=((x[i] div (y div 10)) mod 10);
end;
 //-------------------------------------
  function change(x:t1):Integer ;
  var a,b,i:Integer;
  begin
    a:= Seach(x,2);
    b:= Seach(x,3);
    change:=(x[i]div 1000)*1000+a*100+b*10+x[i]mod 1000
  end;
 //-------------------------------------
begin
 SetConsoleOutputCP(1251);
 Input(x);
 for i:=1 to n do
 begin
   x[i]:=change(x);
   write( x[i],'  ');
 end;
 
 Readln
end.
нужно в массиве чисел поменять 2 и 3 цифру в каждом числе местами. после ввода массива окно консоли закрывается

Последний раз редактировалось Вероника92; 11.05.2015 в 17:37.
Вероника92 вне форума Ответить с цитированием
Старый 11.05.2015, 18:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

read(x[i]); замени на readln(x[i]);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2015, 18:28   #3
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Плюс к сообщению Stilet.

Смотри, переменная i - локальная и нигде нет присвоения, но в последней формуле (для x[i]) она используется. Это легко определяется при пошаговой отладке.
Код:
//-------------------------------------
  function change(x:t1):Integer ;
  var a,b,i:Integer;
  begin
    a:= Seach(x,2);
    b:= Seach(x,3);
    change:=(x[i]div 1000)*1000+a*100+b*10+x[i]mod 1000
  end;
FPaul вне форума Ответить с цитированием
Старый 11.05.2015, 18:42   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Кстати да. На это я не обратил внимание.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.05.2015, 18:58   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Я догадываюсь, что процесс обучения сорвётся, но предложил бы такой вариант кода. Разница в том, что я не привязываюсь к числам определённой разрядности.
Сначала выделяю цифры в позициях 2 и 3, потом получаю новое число из 3-х цифр, и дополняю его оставшимися цифрами.
Код:
program Digit2and3;

const
  N = 10;
type
  TArray = array [1..N] of integer;

  procedure ShowArray(const a: TArray; N: integer);
  var
    i: integer;
  begin
    for i := 1 to N do
      Write(a[i]: 8);
    writeln;
  end;

  procedure ChangeDigits2and3(var a: integer);
  var
    r: integer;
    d2, d3: integer;
  begin
    r  := a;
    a  := a mod 10;
    r  := r div 10;
    d2 := r mod 10;
    r  := r div 10;
    d3 := r mod 10;
    r  := r div 10;
    a  := a + d3 * 10 + d2 * 100;
    a  := a + r * 1000;
  end;

const
  x: TArray = (1, 12, 123, 1234, 12345, -1, -12, -123, -1234, -12345);
var
  i: integer;
begin
  ShowArray(x, N);
  for i := 1 to N do
    ChangeDigits2and3(x[i]);
  ShowArray(x, N);
end.
Естественно, способ дополнения сильно зависит от изучаемой темы. Я сделал просто, а можно было бы продолжать выделять цифры и умножая их на 10^i складывать с результатом. Например
Код:
  procedure ChangeDigits2and3(var a: integer);
  var
    r: integer;
    d2, d3: integer;
    m: integer;
  begin
    r  := a;
    a  := a mod 10;
    r  := r div 10;
    d2 := r mod 10;
    r  := r div 10;
    d3 := r mod 10;
    r  := r div 10;
    a  := a + d3 * 10 + d2 * 100;
    m  := 100;
    while r <> 0 do
    begin
      m := m * 10;
      a := a + m * (r mod 10);
      r := r div 10;
    end;
  end;
Если делать универсальную процедуру с обменом k и m цифр - придётся помудрить. Но этого нет на повестке и в условии.
FPaul вне форума Ответить с цитированием
Старый 11.05.2015, 19:16   #6
Вероника92
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 35
По умолчанию

По условию задачи необходимо использовать эту функцию:
Программным путем в заданных целых числах переставить между собой цифры во 2-м и 3-м (считая справа) разрядах, используя функцию, находящую цифру произвольного разряда целого числа, и вывести результат.
Вероника92 вне форума Ответить с цитированием
Старый 11.05.2015, 19:25   #7
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Ой, а я пока ждал ответ накатал универсальный вариант:
Код:
  procedure ChangeDigits2and3(var a: integer; k, n: integer);
  var
    r: integer;
    Dk, Dn, Mk, Mn: integer;
    i, m: integer;
  begin
    {для упрощения принимаем, что k<n}
    if k > n then
    begin
      r := k;
      k := n;
      n := r;
    end;
    r := a;
    a := 0;
    m := 0;
    for i := 1 to n do
    begin
      if m > 0 then  {чтобы избежать переполнения}
        m := m * 10
      else
        m := 1;
      if i = k then
      begin
        Mk := m;
        Dk := r mod 10;
      end
      else if i = n then
      begin
        Mn := m;
        Dn := r mod 10;
      end else
      begin
        a := a + m * (r mod 10);
      end;
      r := r div 10;
    end;
    a := a + r * 10 * m;
    a := a + Mn * Dk + Mk * Dn;
  end;
А озвучь изначальное задание...
FPaul вне форума Ответить с цитированием
Старый 11.05.2015, 19:36   #8
Вероника92
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 35
По умолчанию

задание на картинке
Изображения
Тип файла: jpg Снимок экрана 2015-05-11 в 19.34.53.jpg (12.2 Кб, 118 просмотров)
Вероника92 вне форума Ответить с цитированием
Старый 11.05.2015, 19:52   #9
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Ладно, чтобы не испортить самостоятельную работу просто подскажу.
В твоей реализации Search несколько ошибок.
1. Среди параметров массив x (не число, а именно массив).
2. Значение переменной i перед использованием не определено.
3. Если ты ищешь разряд номер d, логично использовать цикл for.
Код:
  function Search(a: integer; d: byte): integer;
  var
    i: integer;
  begin
    for i := 1 to d - 1 do
      a := a div 10;
    Search := a mod 10;
  end;
А дальше просто - принцип как в моём универсальном варианте - пропускаешь k и n цифры (правда, запоминаешь их множители), а потом их с перестановкой добавляешь.
Заметь, в функцию я передал не массив, а всего лишь число.
FPaul вне форума Ответить с цитированием
Старый 11.05.2015, 19:53   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Для этой цели можно воспользоваться строками, если такое допустимо.
Вот функция, которую требовалось записать в задании:
Код:
function getNthDigit(const n: integer): byte;
var
	st: string;
	ie: integer;
begin
	val(n, st, ie);
	getNthDigit:=st[n];	
end;
Вадим Мошев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проваливается после цикла ввода С++ makashello Помощь студентам 4 12.07.2013 17:06
После загрузки XP постоянно вылетает ошибка.... otes1976 Операционные системы общие вопросы 7 27.04.2012 20:59
переход в другое поле после ввода буквы ГОСЕАН Помощь студентам 6 10.01.2012 09:36
как сохранить значения ячеек после ввода ubun JavaScript, Ajax 3 24.11.2011 14:00
защита строки после ввода данных Akmal-Sharipov Microsoft Office Excel 5 09.12.2010 08:40