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

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

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

А что именно должна делать show? Когда ответите, то станет ясно какие параметры нужны и какие нет.
int *n - совсем не нужно передавать этот параметр по ссылке, т.к. нет нужды его менять.
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

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");
}
Вложения
22222..JPG
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Результат такой из-за того, что забыли терминирующий нуль в конце строки.
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
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

А где именно терминирующий ноль?
так что ли:

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

#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);
    }
   
}
Аватара пользователя
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

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

В той, которую формируете из числа. Она же потом выводится на экран, значит после последнего символа должен быть ноль. Я думаю эту операцию логичнее сделать в процедуре переворачивания. Лично я делал все в одной процедуре.
Блин, да почитайте внимательно мой код, там же все эти аспекты есть
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

О том, что такое терминирующий ноль я отдельно писал в моё далёком-далёком развёрнутом сообщении на первой странице.
Romeo писал(а): потребуется ещё один дополнительный символ под терминирующий ноль (в кратце, это специальный нулевой символ, который воспринимается всеми C-функциями, как конец строки).
Кстати, Елена, знаешь, почему перестало всё работать? Потому, что массив int numbers[N]]
Далее нужно подправить функцию для чтения данных. Она должна читать не 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить