Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ссылки и массивы

379
28 сентября 2006 года
Fima
109 / / 07.11.2002
Не могу найти ошибку.
Вот условие: дано целое число в десятичной системе счисления. Требуется сформировать массив из цифр этого числа.
Требования: должно быть три ф-ции, и все типа void.Вся передача параметров идет через список передачи параметров. Не должно быть глобальных переменных. Главная ф-ция состоит из вызова ф-ций и декларации переменных, которые стоят в списке параметров.
Ф-ции:
1. ввод числа (нет входных парметров, выходные параметры - само число)
2. Алгоритм получения чисел(входные - число, выходные - массив и его реальный размер)
3. Вывод результата(входные - массив и его реальный размер, выходных - нет).
Алгоритм: представляет собой последовательное деление числа на основании СС для получения частного и остатка. Остаток дает очередную цифру числа от младшей к старшей. Каждую очередной остаток записываем в массив, при этом индекс массива увеличиваем на единицу. Процесс продолжается до тех пор, пока частное больше или равно 10.
Вот мой исходник:
Код:
#include <iostream.h>
#include <math.h>
 
void vvod(int &ch) //Ф-ция осуществляющая ввод числа
{ cout<<"Enter number:";
cin>>ch;
ch = abs(ch); //отбрасываем минус, если введено отрицательное число
 
}
 
void algoritm(int ch, int *mas, int &i)
{
int ostatok, chastnoe;
i=0;
chastnoe = ch;
 
do
{
chastnoe = chastnoe/10;
ostatok = chastnoe%10;
mas = ostatok; //Cохраняю в массив
cout<<ostatok<<endl; // для себя для контроля
cout<<mas<<endl; //// для себя для контроля
i++;
ch/=10;
}while(ch>=10);
    mas = ostatok;
}
/*
void algoritm(int ch, int *mas, int &i)
{
int ostatok, chastnoe;
i=0;
chastnoe = ch;
 
while(chastnoe>=10)
{
ostatok = chastnoe%10;
chastnoe = chastnoe/10;
mas = ostatok; //Cохраняю в массив
cout<<ostatok<<endl; // для себя для контроля
i++;
}
}
*/
void vivod(int mas[5], int i) //Ф-ция осуществляющая ввод числа
{ int j;
for(j=0;j<i+1;j++)
{
cout<<"Number "<<j<<" = "<< mas[j]<<endl;
}
}
void main()
{
int ch;
int mas[5];
int i;
vvod(ch);
algoritm(ch, mas, i);
vivod(mas,i);
}
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
а какая ошибка? писать надо.
Цитата:
... Процесс продолжается до тех пор, пока частное больше или равно 10.


по идее до тех пор пока частное больше нуля.

Цитата:
int mas[5];


размер массива 5 => i[COLOR=blue]nt[/COLOR] == 2 байта, это вам такое условие дали?

242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
1. попробуй так:
 
Код:
while(chastnoe != 0)
{
ostatok = chastnoe%10;
chastnoe = chastnoe/10;
mas = ostatok; //Cохраняю в массив
cout<<ostatok<<endl; // для себя для контроля
i++;
}

-------------------------------------------------------------------------
2. почему i+1 ? просто i.
 
Код:
void vivod(int mas[5], int i) //Ф-ция осуществляющая ввод числа
{ int j;
for(j=0;j<[COLOR=red]i+1[/COLOR];j++)
{
cout<<"Number "<<j<<" = "<< mas[j]<<endl;
}
}
3.0K
29 сентября 2006 года
Мerlin
267 / / 25.07.2006
Код:
#include <iostream.h>
#include <math.h>
#include <conio.h>
 
void vvod(int &ch) //Ф-ция осуществляющая ввод числа
{
  cout<<"Enter number:";
  cin>>ch;
  ch = abs(ch);
}
 

void algoritm(int ch, int *mas, int &i)
{
  if(ch==0)
  {
    i = 1;
    mas[0] = 0;
  }
  else
  {
    i = 0;
    int pwr = 1;
    while(pwr<ch)
    {
      i++;
      pwr*=10;
    }
    pwr/=10;
    for(int j=0;pwr!=0;j++)
    {
      mas[j] = ch/pwr;;
      ch%=pwr;
      pwr/=10;
    }
  }
}

void vivod(int mas[], int i) //Ф-ция осуществляющая в[color=red]ы[/color]вод числа
{
  for(int j=0;j<i;j++)
    cout<<"Number "<<j<<" = "<< mas[j]<<endl;
}

void main()
{
  int ch;
  int mas[[color=red]11[/color]];
  int i;
  vvod(ch);
  algoritm(ch, mas, i);
  vivod(mas,i);
  getch();
}
309
29 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Алгоритм расчитан на вывод чисел любой разрядности :)

Код:
void Read_Value (int &Value, int &Size)
{[INDENT]cin >> Value;
Value = abs(Value); //отбрасываем минус, если введено отрицательное число
Size = 1; //Инициализация кол-ва цифр
for (int Test = 10; Test < Value; Size++)
     Test *= 10; // Определение длины числа
[/INDENT]}

void Analise (int Value, int Size, int *Array)
{
// Заполнение массива с конца значений[INDENT]for (int i = Size - 1; i >= 0; i--)
{[INDENT]
Array  = Value % 10;
Value /= 10;
[/INDENT]}
[/INDENT]}

void Write_Array (const int *Array, int Size)
{
// Вывод массива [INDENT]for (int i = 0; i < Size; i++)
     cout << "Number " << i << " = " << Array  << endl;
[/INDENT]}

void main ()
{[INDENT]int Size, Value;
Read_Value (Value, Size);
int *Array = (int*) calloc (sizeof (int), Size); //Выделение памяти под массив
Analise (Value, Size, Array);
Write_Array (Array, Size);
free (Array); // Освобождение памяти
[/INDENT]}
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
2Merlin
извини конечно, но интересно, зачем писать такой тяжелый алгоритм, добавлять ненужные циклы, когда решение весьма простое?
ну добавил проверку на ноль, даже допустим она нужна, но остальное ...
309
29 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Кстати, а что мешает просто привести число в строку (символьный массив), и потом выводить посимвольно :confused:.
3.0K
29 сентября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=OlgaKr]2Merlin
извини конечно, но интересно, зачем писать такой тяжелый алгоритм, добавлять ненужные циклы, когда решение весьма простое?
ну добавил проверку на ноль, даже допустим она нужна, но остальное ...[/QUOTE]Допустим вводится 1234. Ваш алгоритм, переводит его в 4321 и выводит число в обратном порядке. Т.е. решение простое, но неправильное.

На счет тяжелого алгоритма... :) Я дописал минимальный код к коду Fimы, чтоб прога делала, то что нужно.
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=Мerlin]Допустим вводится 1234. Ваш алгоритм [/quote]
не мой алгоритм, а Fimы.

[quote=Merlin]переводит его в 4321 и выводит число в обратном порядке. Т.е. решение простое, но неправильное.[/quote]
если верить тому что написано в условии задачи - это правильно.
[quote=Fima]Алгоритм: представляет собой последовательное деление числа на основании СС для получения частного и остатка. Остаток дает очередную цифру числа от младшей к старшей. [COLOR=blue]Каждую очередной остаток записываем в массив, при этом индекс массива увеличиваем на единицу[/COLOR]. [/quote]
[quote=Merlin]На счет тяжелого алгоритма... :) Я дописал минимальный код к коду Fimы, чтоб прога делала, то что нужно.[/quote]
никто не мешает заполнять массив с конца, или расспечатывать с конца ... .
Код:
void algoritm(int num, int *arr, int &size)
{
 size = 0;
 while(num != 0)
 {
  *arr-- = num % 10;
  num /= 10;
  size++;
 }
}
void output(int *arr, int size)
{
 for(int i = 0; i < size; i++)
  cout << arr;
 cout << endl;
}
void input(int &n) //Ф-ция осуществляющая ввод числа
{
 cout<<"Enter a number:";
    cin >> n;
    n = abs(n); //отбрасываем минус, если введено отрицательное число
 
}
int main(void)
{
 int arr[5], size, num;
 input(num);
 algoritm(num, &arr[4], size);
 output(&arr[5-size], size);
 return 0;
}
3.0K
29 сентября 2006 года
Мerlin
267 / / 25.07.2006
Да. действительно нужно заполнить массив в обратном порядке.

Мимоходом в коде выше есть одна ошибка. Если учесть, что она состоит более чем из 30 строк, то это не так уж и много.
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=Мerlin]Мимоходом в коде выше есть одна ошибка. [/quote]
может поделишься какая?
Цитата:
Если учесть, что она состоит более чем из 30 строк, то это не так уж и много.

согласна :D

а насчет arr[[COLOR=red]5[/COLOR]] - это не ошибка, а работа со старым компилятором. если автора это устраивает, то мне и подавно все равно ....

3.0K
29 сентября 2006 года
Мerlin
267 / / 25.07.2006
[QUOTE=OlgaKr]может поделишься какая?
согласна :D[/QUOTE]Просто нужно представить на минутку, что тот код я писал. И она сразу же будет бросаться в глаза.
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=Мerlin]Просто нужно представить на минутку, что тот код я писал. И она сразу же будет бросаться в глаза.[/quote]
форум - это не игра. ваши сообщения удалены как флуд. на будущее за подобные вещи замечание будет не устным.
2
29 сентября 2006 года
squirL
5.6K / / 13.08.2003
вообще в задаче неоговорено, как именно должно быть представлен конечный массив. поэтому получение из числа 1234 - массива {'4', '3', '2', '1'} - вполне возможно. спор ваш из пальца высосан

ЗЫ: хм... а зачем удалять? судя по цитатам - не так уж далеко товарищь отклонился от темы топика. и вообще, коллеги модеры.. что то вы разудалялись
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=squirL]
хм... а зачем удалять? судя по цитатам - не так уж далеко товарищь отклонился от темы топика. [/quote]
думаешь форум "Студенты" можно подвести на уровень "Отдохнем" тема "Загадочка"? Товарищь говорил о несуществующей ошибкe (в моих постах можно прочесть его удаленные), а если такова существует его просили указать - он не смог. поэтому все вышепреведенное воспринимается как флуд.
Цитата:
и вообще, коллеги модеры.. что то вы разудалялись


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

3.0K
29 сентября 2006 года
Мerlin
267 / / 25.07.2006
Если человек чужую программу, критикует за стиль, "почему так сложно?", то самая малость, что этот же человек в своей программе сам заметить свои баги. Но в данном случае этого не произошло.
Баг: программа число 0 не переводит.
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=Мerlin]Если человек чужую программу, критикует за стиль, "почему так сложно ...[/quote]
никто вашу прогу не критиковал, просто поинтересовалась зачем вы так написали. лично мне интересны мнения программистов со стажем.
[quote=Merlin]?", то самая малость, что этот же человек в своей программе сам заметить свои баги. Но в данном случае этого не произошло.
Баг: программа число 0 не переводит[/quote]
для вас это баг, а для меня это не баг, т.к. ноль числом не считаю. имхо.
именно поэтому я прошу, не надо здесь без надобности викторин устраивать, т.к. мнения могут быть самые разные.

ваши сообщения восстановлены
2
29 сентября 2006 года
squirL
5.6K / / 13.08.2003
[quote=OlgaKr]никто вашу прогу не критиковал, просто поинтересовалась зачем вы так написали. лично мне интересны мнения программистов со стажем.
[/quote]
Оля, тон был взят не очень верный, ИМХО.
[quote=OlgaKr]
для вас это баг, а для меня это не баг, т.к. ноль числом не считаю. имхо.
именно поэтому я прошу, не надо здесь без надобности викторин устраивать, т.к. мнения могут быть самые разные.
[/quote]
:eek: 0 не число? нет уж, это баг. и еще какой. и двух мнений быть тут не может. потому что если мы число 10 превращаем в символьный массив и получаем {1} то грош цена программе.
242
29 сентября 2006 года
Оlga
2.2K / / 04.02.2006
[quote=squirL]
:eek: 0 не число? нет уж, это баг. и еще какой. и двух мнений быть тут не может. потому что если мы число 10 превращаем в символьный массив и получаем {1} то грош цена программе.[/quote]
10 - это число которое состоит из цифр 1 и 0 что прога и выдает;
0 - в данной задачи для меня это не число, мнения других для меня конечно интересны, но ничего в данном случаи не меняют. видать последствия моего образования, при решении такой задачи у нас ноль за число не считали, а вообще все зависит и не стоит споров.
Цитата:
Оля, тон был взят не очень верный, ИМХО.


насчет тона, думаю у всех нас юпитеров и не юпитеров бывает, ИМХО. с господином Merlin мы достаточно давно знакомы, так что разберемся как нибудь ...

2
29 сентября 2006 года
squirL
5.6K / / 13.08.2003
ну на этом и порешим. мир, дружба, балайка :)
309
30 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=Мerlin]Баг: программа число 0 не переводит.[/QUOTE]
А моя переводит? Должна :D :D
Я её не проверял (не было тогда компилятора, сейчас - времени), но писал её именно с расчётом на такую ситуацию :D

 
Код:
Size = 1; //Инициализация кол-ва цифр
for (int Test = 10; Test < Value; Size++)
     Test *= 10; // Определение длины числа

То есть, при любом раскладе, введённое число будет обозначено, как имеющее хотя бы один символ.
379
01 октября 2006 года
Fima
109 / / 07.11.2002
Спасибо всем огромное! :)
ВЫ мне очень помогли! С Вашей помошью я сдал эту лабу. :))
OlgaKr тебе отделное спасибо. А также вопрос. Что значит это выражение: *arr-- = num %10;
Правая часть мне ясна, а вот левая (*arr--) не очень. Я понимаю, что мы записываем правую часть, а вернее ее результат по адресу arr--. Но для чего эти минусы?
Спасибо.
5.4K
01 октября 2006 года
Svyatozar
221 / / 11.09.2006
[QUOTE=Fima]Спасибо всем огромное! :)
ВЫ мне очень помогли! С Вашей помошью я сдал эту лабу. :))
OlgaKr тебе отделное спасибо. А также вопрос. Что значит это выражение: *arr-- = num %10;
Правая часть мне ясна, а вот левая (*arr--) не очень. Я понимаю, что мы записываем правую часть, а вернее ее результат по адресу arr--. Но для чего эти минусы?
Спасибо.[/QUOTE]
*arr-- = num %10;
эквивалентна записи:
*arr = num %10;
arr = arr - 1;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог