Помогите разобраться
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
А что именно должна делать show? Когда ответите, то станет ясно какие параметры нужны и какие нет.
int *n - совсем не нужно передавать этот параметр по ссылке, т.к. нет нужды его менять.
int *n - совсем не нужно передавать этот параметр по ссылке, т.к. нет нужды его менять.
It's a long way to the top if you wanna rock'n'roll
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");
}
Результат такой из-за того, что забыли терминирующий нуль в конце строки.
Show должна принимать указатель на массив чисел и размер массива. Внутри Show будет перебор элементов массива и вывод построчно исходного числа и его результата преобразования. Именно здесь вызываем convertNumber. При такой организации исчезает за ненадобностью целый блок между вызовом show и scanf. Исходный код у вас есть.
void show(int* array, int count)
Show должна принимать указатель на массив чисел и размер массива. Внутри Show будет перебор элементов массива и вывод построчно исходного числа и его результата преобразования. Именно здесь вызываем convertNumber. При такой организации исчезает за ненадобностью целый блок между вызовом show и scanf. Исходный код у вас есть.
void show(int* array, int count)
It's a long way to the top if you wanna rock'n'roll
А где именно терминирующий ноль?
так что ли:
так что ли:
Код: Выделить всё
#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);
}
}
Что-то не вижу где ставится терминатор?
It's a long way to the top if you wanna rock'n'roll
В какой строке должен быть ноль?
В той, которую формируете из числа. Она же потом выводится на экран, значит после последнего символа должен быть ноль. Я думаю эту операцию логичнее сделать в процедуре переворачивания. Лично я делал все в одной процедуре.
Блин, да почитайте внимательно мой код, там же все эти аспекты есть
Блин, да почитайте внимательно мой код, там же все эти аспекты есть
It's a long way to the top if you wanna rock'n'roll
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
По поводу того, почему я предложил структуры. Всё из-за задания. В задании было указано, что нужно сформировать таблицу значений и потом вывести её. Это было обсуждено в первых сообщениях темы. Я с самого начала также предлагал не хранить сконвертированные значения, а вычислять и на лету и показывать в момент вывода, но Елена указала на задание.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
О том, что такое терминирующий ноль я отдельно писал в моё далёком-далёком развёрнутом сообщении на первой странице.
Далее нужно подправить функцию для чтения данных. Она должна читать не numberToConvert, а numbers.num, а заодно заполнять нулями строку numbers.conv (если не вызывать никаких стандартных функций, то сделать можно с помощью вложенного цикла по j от 0 до 41 и присваивания numbers.conv[j] нуля).
[/quote]
Мы, конечно, вместо полной инициализации нулями, можем поставить один терминирующий ноль после конвертации, но для этого нужно точно понимать что это такое и куда именно его ставить. Кстати, подсказка, стоять он должен в конце строки, так как он терминирует (terminate - завершать) её.
Кстати, Елена, знаешь, почему перестало всё работать? Потому, что массив int numbers[N]]Romeo писал(а): потребуется ещё один дополнительный символ под терминирующий ноль (в кратце, это специальный нулевой символ, который воспринимается всеми C-функциями, как конец строки).
Далее нужно подправить функцию для чтения данных. Она должна читать не numberToConvert, а numbers.num, а заодно заполнять нулями строку numbers.conv (если не вызывать никаких стандартных функций, то сделать можно с помощью вложенного цикла по j от 0 до 41 и присваивания numbers.conv[j] нуля).
[/quote]
Мы, конечно, вместо полной инициализации нулями, можем поставить один терминирующий ноль после конвертации, но для этого нужно точно понимать что это такое и куда именно его ставить. Кстати, подсказка, стоять он должен в конце строки, так как он терминирует (terminate - завершать) её.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.