Помогите разобраться

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Вы поняли, но не до конца. Когда формируете массив из цифр, то вы формируете его "по одной цифре", а не сразу целиком.
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Не понимаю,как это программно реализовать.Создать отдельный массив по типу "а":
numbers.conv=(numbers.num%base)+'0';
a=(numbers.num%base)+'0';
numbers.num=numbers.num/base;

:confused: :confused: :confused:
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Не понимаю,как это программно реализовать.Создать отдельный массив по типу "а":
Какой командой вы запишете в 3-ю позицию массива Conv результат остатка от деления 10/4, например?
P.S. Сделал задачу без всяких структур: main + ConvertNumber. Все работает, 42 строки всего

Попробуйте реализовать процедуру преобразования числа в троичную строку. Передается два параметра - число и ссылка на строку. Результат работы - строка с терминирующим нулем. Это вроде как не сложно и в этой программе 50% всего кода - это работа этой процедуры.
Внутри нее два цикла - первый вычисляет остатки от деления и сносит их в массив. А во втором обычное переворачивание цифр.
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Какой у вас алгоритм?
1. Ввести число
2. Конвертируя, заносить в массив
3.Реверсировать массив
4.Вывести число в таблице
5.Заново с пункта 1
Так?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Не совсем.
1. Ввод всех чисел в массив.
2. Для всех чисел в массиве:
2.1. Конвертировать число из массива в массив цифр
2.1.1 Преобразовать число в массив троичных цифр, используя остаток от деления
2.1.2 Реверсировать массив цифр
2.2. Вывести исходное число и полученный массив цифр на экран
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Может k не хватало?
{
numbers.conv[k]=(numbers.num%base)+'0';
k++;
numbers.num=numbers.num/base;

}
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Может k не хватало?
Конечно, вы ведь строите этот массив "по кусочкам", по одному символу. Но я все таки советую написать вам основной рабочий код процедуры convertNumber не привязанной к numbers. Вообще, очень плохая практика использовать обращения к глобальным переменным из функций и процедур. Старайтесь делать их независимыми участками программы и вы увидите, что это очень упрощает код, делает его более понятным, читабельным, релоцируемым. Если у вас получится написать convertNumber и реверс в одной процедуре без привязки к основному коду - то так и быть, скину весь свой код целиком.
Попробуйте:

Код: Выделить всё

void convertNumber(int num, char *result)
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Т.е функция принимает введенное число и второй аргумент-это ссылка на что?что должна передавать,как второй аргумент, функция main, при вызове функции convert. :confused:

Код: Выделить всё

void convertNumber(int num, char *result)
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Т.е функция принимает введенное число и второй аргумент-это ссылка на что?что должна передавать,как второй аргумент, функция main, при вызове функции convert.
Это ссылка на строку, куда попадет результат работы. Указывается просто название переменной. Например:

Код: Выделить всё

convertNumber(numbers[i], conv);
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Вроде программа работает,осталось только реверсировать строку. Возник следующий вопрос: как это сделать? :)

не забываем реверсировать строку (иными словами развернуть). Самый простой способ, это сначала вычислить её длину, а затем в цикле запустить два счётчика (левый и правый) друг на встречу другу - один от начала строки, другой от её конца (длина-1). На каждом шаге менять местами соответ
Я пробовала так делать,вот что получилось:

Код: Выделить всё

 #include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define N 200

// структура, хранящая информацию об одном числе
struct NumberInfo
{
   long int num; // само число
   char conv[42]; // сконвертированное число
}

	numbers[N];
// массив структур, хранящий информацию о всех исходных и сконвертированных числах


int i;


void show(int num, char *result,int count);
void convertNumber(int, char *);

int main (void)
{
    printf("Number to convert? '0'-end" );
    for (i=0;i<N;i++)
    {
    scanf("%li",&numbers[i].num);
        if(numbers[i].num =='\0')
        break;
        else
           convertNumber(numbers[i].num, numbers[i].conv);
         	 
    }
	 show(numbers[i].num, numbers[i].conv,i);
return 0;
}
void convertNumber(int num, char *result)
{
    int base=3;
    int k=0,n;
do
    {
        numbers[i].conv[k]=(num%base)+'0';
	    k++;
        num=num/base;
       
    }

    while(num!=0);



	int count=0;
	while(result[count]!='\0')
	
	{
		count++;
	}
	char tmp,u,v;
	for(u=result[0];u<=v;u++)
		for(v=*(result+count);v>=u;v--)
		{
			
			u=v;
			v=u;
		}

}







void show(int num, char *result,int count)
{
	int i;
	printf("\n\t============================================\n");
		printf("\t|                   |                      |\n");
	for(i=0;i<count;i++)
	
	{
		printf("\t|          %ld        |          %s          |\n ", numbers[i].num,numbers[i].conv); 
	}
	printf("\t============================================\n");
}



Ответить