Страница 6 из 6
Re: Помогите разобраться
Добавлено: 06 ноя 2013, 16:34
somewhere
А что именно должна делать show? Когда ответите, то станет ясно какие параметры нужны и какие нет.
int *n - совсем не нужно передавать этот параметр по ссылке, т.к. нет нужды его менять.
Re: Помогите разобраться
Добавлено: 06 ноя 2013, 17:03
Helen11
show должна выводить таблицу с введенным массивом и сконвертированные числа,т.е принимать numbers,i и на счет conv у меня возникает вопрос,как его выводить.
Вот какой у меня странный результат (вложенный файл)
Код: Выделить всё
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define N 200
void show(int count,int numbers,char conv);
void convertNumber(int, char*);
void reverse(char* );
int main (void)
{
//long int num; // само число
char conv[42]; // сконвертированное число
int numbers[N];
int i,total;
printf("Number to convert? '0'-end" );
for (total=0;total<N;total++)
{
scanf("%li",&numbers[total]);
if(numbers[total] =='\0')
break;
}
printf("\n\t===============================================\n");
printf("\t| | |\n");
for (i=0;i<total;i++)
{
convertNumber(numbers[i],conv);
printf("\t| %4.li | %s |\n ", numbers[i],conv);
}
printf("\t================================================\n");
show(total,numbers,conv);
return 0;
}
void convertNumber(int num, char* result)
{
int base=3;
int k=0;
do
{
result[k]=(num%base)+'0';
k++;
num=num/base;
}
while(num!=0);
//printf("%s", result);
reverse(result);
}
void reverse(char* result)
{
if (result[0] == '\0' || result[1] == '\0')
{
return;
}
int left = 0, right = 0;
while (result[right + 1] != '\0')
++right;
for (; left < right; left++, right--)
{
int temp = result[align=left];
result[align=left] = result[align=right];
result[align=right] = temp;
}
// printf("%s\n", result);
}
void show(int total,int numbers,char conv)
{
int i;
printf("\n\t===============================================\n");
printf("\t| | |\n");
for(i=0;i<total;i++)
{
printf("\t| %4.li | %4.s |\n ", numbers[i],conv);
}
printf("\t================================================\n");
}
Re: Помогите разобраться
Добавлено: 06 ноя 2013, 21:33
somewhere
Результат такой из-за того, что забыли терминирующий нуль в конце строки.
Show должна принимать указатель на массив чисел и размер массива. Внутри Show будет перебор элементов массива и вывод построчно исходного числа и его результата преобразования. Именно здесь вызываем convertNumber. При такой организации исчезает за ненадобностью целый блок между вызовом show и scanf. Исходный код у вас есть.
void show(int* array, int count)
Re: Помогите разобраться
Добавлено: 06 ноя 2013, 21:49
Helen11
А где именно терминирующий ноль?
так что ли:
Код: Выделить всё
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#define N 200
void show(int* ,int );
void convertNumber(int, char*);
void reverse(char* );
int main (void)
{
//long int num; // само число
char conv[42]; // сконвертированное число
int numbers[N];
int i,total;
printf("Number to convert? '0'-end\n" );
for (total=0;total<N;total++)
{
scanf("%li",&numbers[total]);
if(numbers[total] =='\0')
break;
}
printf("\n\t===============================================\n");
printf("\t| | |\n");
for (i=0;i<total;i++)
{
convertNumber(numbers[i],conv);
show(numbers,total);
printf("\t| %4.li | %s |\n ", numbers[i],conv+'0');
}
printf("\t================================================\n");
return 0;
}
void convertNumber(int num, char* result)
{
int base=3;
int k=0;
do
{
result[k]=(num%base)+'0';
k++;
num=num/base;
}
while(num!=0);
//printf("%s", result);
reverse(result);
}
void reverse(char* result)
{
if (result[0] == '\0' || result[1] == '\0')
{
return;
}
int left = 0, right = 0;
while (result[right + 1] != '\0')
++right;
for (; left < right; left++, right--)
{
int temp = result[align=left];
result[align=left] = result[align=right];
result[align=right] = temp;
}
// printf("%s\n", result);
}
void show(int* array, int count)
{
int i;
for(i=0;i<count;i++)
{
printf("\t| %4.li | %s |\n ", array);
}
}
Re: Помогите разобраться
Добавлено: 06 ноя 2013, 22:46
somewhere
Что-то не вижу где ставится терминатор?
Re: Помогите разобраться
Добавлено: 06 ноя 2013, 23:07
Helen11
В какой строке должен быть ноль?
Re: Помогите разобраться
Добавлено: 06 ноя 2013, 23:32
somewhere
В той, которую формируете из числа. Она же потом выводится на экран, значит после последнего символа должен быть ноль. Я думаю эту операцию логичнее сделать в процедуре переворачивания. Лично я делал все в одной процедуре.
Блин, да почитайте внимательно мой код, там же все эти аспекты есть
Re: Помогите разобраться
Добавлено: 08 ноя 2013, 17:24
Romeo
По поводу того, почему я предложил структуры. Всё из-за задания. В задании было указано, что нужно сформировать таблицу значений и потом вывести её. Это было обсуждено в первых сообщениях темы. Я с самого начала также предлагал не хранить сконвертированные значения, а вычислять и на лету и показывать в момент вывода, но Елена указала на задание.
Re: Помогите разобраться
Добавлено: 08 ноя 2013, 17:33
Romeo
О том, что такое терминирующий ноль я отдельно писал в моё далёком-далёком развёрнутом сообщении на первой странице.
Romeo писал(а):
потребуется ещё один дополнительный символ под терминирующий ноль (в кратце, это специальный нулевой символ, который воспринимается всеми C-функциями, как конец строки).
Кстати, Елена, знаешь, почему перестало всё работать? Потому, что массив int numbers[N]]
Далее нужно подправить функцию для чтения данных. Она должна читать не numberToConvert
, а numbers.num, а заодно заполнять нулями строку numbers.conv (если не вызывать никаких стандартных функций, то сделать можно с помощью вложенного цикла по j от 0 до 41 и присваивания numbers.conv[j] нуля).
[/quote]
Мы, конечно, вместо полной инициализации нулями, можем поставить один терминирующий ноль после конвертации, но для этого нужно точно понимать что это такое и куда именно его ставить. Кстати, подсказка, стоять он должен в конце строки, так как он терминирует (terminate - завершать) её.