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

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

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

u=v;
v=u;
Ну-да, ну-да)) Классическая ошибка при обмене двух переменных.
А вообще нужен один цикл от 0 до N/2. Меняется элемент I с элементом Length - I, вот и все
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

somewhere писал(а):Ну-да, ну-да)) Классическая ошибка при обмене двух переменных.
А вообще нужен один цикл от 0 до N/2. Меняется элемент I с элементом Length - I, вот и все

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

N - эффективная длина массива цифр - 1
Length = N - индекс последнего элемента
I - текущий индекс элемента, который изменяется от 0 до N/2
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

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
    {
        result[k]=(num%base)+'0';
	    k++;
        num=num/base;
       
    }

	while(num!=0);



	//int count=0;
	/*char *u=result;;
	while(*u!='\0')
	
	{
		u++;
	}
	//printf("%d",(int)(u-result));
			
			char l;
			for(l=0;l<=((int)(u-result));l++)
				
		{
			
			l=*(result+u);
			*(result+u)=(*(result+u))-l);
			//printf("%c",);
		}*/

}


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|          %4.li        |          %s          |\n ", numbers[i].num,numbers[i].conv); 
	}
	printf("\t===============================================\n");
}


Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Извиняюсь, что пропал. Был в отпуске, посему не заглядывал на форум.

Елена, я смотрю ты проделала серьёзную работу по исправлению свох ошибок под чутким руководством somewhere. Поэтому, в качестве бонуса, дарю следующую простенькую программу. Судя по всему, она будет очень полезна :)

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

#include <stdio.h>

void reverse(char* str)
{
   if (str[0] == '\0' || str[1] == '\0')
   {
      // If the string is empty or has got one character
      // then it should not be reversed
      return;
   }

   // At the beginning both indexes are zero
   int left = 0, right = 0;

   // Move 'right' to the end of the string
   while (str[right + 1] != '\0') ++right;

   // Move 'left' forward and 'right' backward, exchanging appropriate symbols
   // Cycle works till left-right correspondence is correct ('left' is really left and 'right' is really right)
   for (; left < right; left++, right--)
   {
      int temp = str[align=left];
      str[align=left] = str[align=right];
      str[align=right] = temp;
   }
}

int main()
{
   char str[] = "ykketnoM oemoR";
   reverse(str);
   printf("%s\n", str);
   return 0;
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Romeo,с возвращением)Да,так и есть. Уже несколько недель сижу над этой программой.
Вот что вышло. Но я тут напутала с параметрами, конечно.

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

#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, char* ,int );
void convertNumber(int, char *);
void reverse(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);

 reverse(result);

}


void reverse(char* result)
{
   if (result[0] == '\0' || result[1] == '\0')
   {
      // If the string is empty or has got one character
      // then it should not be reversed
      return;
   }

   // At the beginning both indexes are zero
   int left = 0, right = 0;

   // Move 'right' to the end of the string
   while (result[right + 1] != '\0')
	   ++right;

   // Move 'left' forward and 'right' backward, exchanging appropriate symbols
   // Cycle works till left-right correspondence is correct ('left' is really left and 'right' is really 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 num, char *result,int count)
{
	int i;
	printf("\n\t===============================================\n");
		printf("\t|                      |                      |\n");
	for(i=0;i<count;i++)
	
	{
		printf("\t|          %4.li        |          %s          |\n ", numbers[i].num,numbers[i].conv); 
	}
	printf("\t================================================\n");
}



Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

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

А я вот так реализовал
[syntax=c++]#include <stdio.h>
#define N 200
void convertNumber(int num, char *result);

int main (void)
{
int total;
int i;
int numbers[N];
char conv[42];
printf("Number to convert? '0'-end\n" );
total=0;
do {
scanf("%li",&numbers[total]);
if(numbers[total] =='\0') break;
total++;
} while (1==1);
for (i=0;i<total;i++) {
convertNumber(numbers, conv);
printf("%12d | %s \n", numbers, conv);
}
return 0;
}

void convertNumber(int num, char *result)
{
int base=3;
int i = 0;
int tmp=0;
do {
result = num % base + '0';
num = num/base;
i++;
} while(num!=0);
result = 0; i--; base = i;
do {
tmp = result[base-i];
result[base-i] = result;
result = tmp;
i--;
} while (i>base/2);
}[/syntax]
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

somewhere,это то что я в начале пыталась сделать,тоже обойтись только массивом)вот значит как,она должна выглядеть
Но я уже хочу добить второй вариант,поэтому хочу спросить что не так с передачей аргументов из функции в функцию.

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

#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, char* ,int );
void convertNumber(int, char *);
void reverse(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);

 reverse(result);

}


void reverse(char* result)
{
   if (result[0] == '\0' || result[1] == '\0')
   {
      // If the string is empty or has got one character
      // then it should not be reversed
      return;
   }

   // At the beginning both indexes are zero
   int left = 0, right = 0;

   // Move 'right' to the end of the string
   while (result[right + 1] != '\0')
       ++right;

   // Move 'left' forward and 'right' backward, exchanging appropriate symbols
   // Cycle works till left-right correspondence is correct ('left' is really left and 'right' is really 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 num, char *result,int count)
{
    int i;
    printf("\n\t===============================================\n");
        printf("\t|                      |                      |\n");
    for(i=0;i<count;i++)
   
    {
        printf("\t|          %4.li        |          %s          |\n ", numbers[i].num,numbers[i].conv);
    }
    printf("\t================================================\n");
}

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

C учетом реализации show, все передаваемые параметры, кроме count - лишние.
It's a long way to the top if you wanna rock'n'roll
Ответить