#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);
}
Ссылки и массивы
Вот условие: дано целое число в десятичной системе счисления. Требуется сформировать массив из цифр этого числа.
Требования: должно быть три ф-ции, и все типа void.Вся передача параметров идет через список передачи параметров. Не должно быть глобальных переменных. Главная ф-ция состоит из вызова ф-ций и декларации переменных, которые стоят в списке параметров.
Ф-ции:
1. ввод числа (нет входных парметров, выходные параметры - само число)
2. Алгоритм получения чисел(входные - число, выходные - массив и его реальный размер)
3. Вывод результата(входные - массив и его реальный размер, выходных - нет).
Алгоритм: представляет собой последовательное деление числа на основании СС для получения частного и остатка. Остаток дает очередную цифру числа от младшей к старшей. Каждую очередной остаток записываем в массив, при этом индекс массива увеличиваем на единицу. Процесс продолжается до тех пор, пока частное больше или равно 10.
Вот мой исходник:
Код:
Цитата:
... Процесс продолжается до тех пор, пока частное больше или равно 10.
по идее до тех пор пока частное больше нуля.
Цитата:
int mas[5];
размер массива 5 => i[COLOR=blue]nt[/COLOR] == 2 байта, это вам такое условие дали?
Код:
while(chastnoe != 0)
{
ostatok = chastnoe%10;
chastnoe = chastnoe/10;
mas = ostatok; //Cохраняю в массив
cout<<ostatok<<endl; // для себя для контроля
i++;
}
{
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;
}
}
{ int j;
for(j=0;j<[COLOR=red]i+1[/COLOR];j++)
{
cout<<"Number "<<j<<" = "<< mas[j]<<endl;
}
}
Код:
#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();
}
#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();
}
Код:
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]}
{[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]}
извини конечно, но интересно, зачем писать такой тяжелый алгоритм, добавлять ненужные циклы, когда решение весьма простое?
ну добавил проверку на ноль, даже допустим она нужна, но остальное ...
Кстати, а что мешает просто привести число в строку (символьный массив), и потом выводить посимвольно :confused:.
извини конечно, но интересно, зачем писать такой тяжелый алгоритм, добавлять ненужные циклы, когда решение весьма простое?
ну добавил проверку на ноль, даже допустим она нужна, но остальное ...[/QUOTE]Допустим вводится 1234. Ваш алгоритм, переводит его в 4321 и выводит число в обратном порядке. Т.е. решение простое, но неправильное.
На счет тяжелого алгоритма... :) Я дописал минимальный код к коду Fimы, чтоб прога делала, то что нужно.
не мой алгоритм, а 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;
}
{
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;
}
Мимоходом в коде выше есть одна ошибка. Если учесть, что она состоит более чем из 30 строк, то это не так уж и много.
может поделишься какая?
Цитата:
Если учесть, что она состоит более чем из 30 строк, то это не так уж и много.
согласна :D
а насчет arr[[COLOR=red]5[/COLOR]] - это не ошибка, а работа со старым компилятором. если автора это устраивает, то мне и подавно все равно ....
согласна :D[/QUOTE]Просто нужно представить на минутку, что тот код я писал. И она сразу же будет бросаться в глаза.
форум - это не игра. ваши сообщения удалены как флуд. на будущее за подобные вещи замечание будет не устным.
ЗЫ: хм... а зачем удалять? судя по цитатам - не так уж далеко товарищь отклонился от темы топика. и вообще, коллеги модеры.. что то вы разудалялись
хм... а зачем удалять? судя по цитатам - не так уж далеко товарищь отклонился от темы топика. [/quote]
думаешь форум "Студенты" можно подвести на уровень "Отдохнем" тема "Загадочка"? Товарищь говорил о несуществующей ошибкe (в моих постах можно прочесть его удаленные), а если такова существует его просили указать - он не смог. поэтому все вышепреведенное воспринимается как флуд.
Цитата:
и вообще, коллеги модеры.. что то вы разудалялись
лично я не злоупотребляю :), если есть не согласные все разборки в приват или в зак. форум на всеобщее судилище.
Баг: программа число 0 не переводит.
никто вашу прогу не критиковал, просто поинтересовалась зачем вы так написали. лично мне интересны мнения программистов со стажем.
[quote=Merlin]?", то самая малость, что этот же человек в своей программе сам заметить свои баги. Но в данном случае этого не произошло.
Баг: программа число 0 не переводит[/quote]
для вас это баг, а для меня это не баг, т.к. ноль числом не считаю. имхо.
именно поэтому я прошу, не надо здесь без надобности викторин устраивать, т.к. мнения могут быть самые разные.
ваши сообщения восстановлены
[/quote]
Оля, тон был взят не очень верный, ИМХО.
[quote=OlgaKr]
для вас это баг, а для меня это не баг, т.к. ноль числом не считаю. имхо.
именно поэтому я прошу, не надо здесь без надобности викторин устраивать, т.к. мнения могут быть самые разные.
[/quote]
:eek: 0 не число? нет уж, это баг. и еще какой. и двух мнений быть тут не может. потому что если мы число 10 превращаем в символьный массив и получаем {1} то грош цена программе.
:eek: 0 не число? нет уж, это баг. и еще какой. и двух мнений быть тут не может. потому что если мы число 10 превращаем в символьный массив и получаем {1} то грош цена программе.[/quote]
10 - это число которое состоит из цифр 1 и 0 что прога и выдает;
0 - в данной задачи для меня это не число, мнения других для меня конечно интересны, но ничего в данном случаи не меняют. видать последствия моего образования, при решении такой задачи у нас ноль за число не считали, а вообще все зависит и не стоит споров.
Цитата:
Оля, тон был взят не очень верный, ИМХО.
насчет тона, думаю у всех нас юпитеров и не юпитеров бывает, ИМХО. с господином Merlin мы достаточно давно знакомы, так что разберемся как нибудь ...
ну на этом и порешим. мир, дружба, балайка :)
А моя переводит? Должна :D :D
Я её не проверял (не было тогда компилятора, сейчас - времени), но писал её именно с расчётом на такую ситуацию :D
Код:
Size = 1; //Инициализация кол-ва цифр
for (int Test = 10; Test < Value; Size++)
Test *= 10; // Определение длины числа
for (int Test = 10; Test < Value; Size++)
Test *= 10; // Определение длины числа
То есть, при любом раскладе, введённое число будет обозначено, как имеющее хотя бы один символ.
ВЫ мне очень помогли! С Вашей помошью я сдал эту лабу. :))
OlgaKr тебе отделное спасибо. А также вопрос. Что значит это выражение: *arr-- = num %10;
Правая часть мне ясна, а вот левая (*arr--) не очень. Я понимаю, что мы записываем правую часть, а вернее ее результат по адресу arr--. Но для чего эти минусы?
Спасибо.
ВЫ мне очень помогли! С Вашей помошью я сдал эту лабу. :))
OlgaKr тебе отделное спасибо. А также вопрос. Что значит это выражение: *arr-- = num %10;
Правая часть мне ясна, а вот левая (*arr--) не очень. Я понимаю, что мы записываем правую часть, а вернее ее результат по адресу arr--. Но для чего эти минусы?
Спасибо.[/QUOTE]
*arr-- = num %10;
эквивалентна записи:
*arr = num %10;
arr = arr - 1;