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

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

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

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

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

Какой ужас, чуть позже к той проге вернусь,а пока у меня другой вопрос:
компилятор ругается на 21-22 строку и пишет: для индекса требуется массив или указатель.
Неужели нельзя просто писать имя массива и индексы?Что тогда вместо написать?

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

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
//#define MAX 10


int main(void)
{
	//int mt[MAX][MAX];
	int nr,nc,i,j,n;
	
	/*puts("Size of matrix");
	scanf("%i %i",&nr,&nc);*/
	const int d=30;
	int mt[d];

	printf("Elements of matrix [%i*%i]:\n");
	for(i=0;i<d;i++)
		for(j=0;j<d;j++)	
		{
			scanf("%i",mt[i][j]);
			if(mt[i][j]==0)
				break;

	    }
	/*for(i=0;i<nr;i++)
		for(j=0;j<nc;j++)
	printf("%i",mt[i][j]);*/ //
printf("Enter element");
scanf("%i",&n);

float left=0;
float right=(float)d;
float seeknumber=(left+right)/2;

while(mt[(int)seeknumber]!=n && (right-left)>1)
{
	if(mt[(int)seeknumber]<n)
		left=seeknumber;
	else
		right=seeknumber;
	seeknumber=(left+right)/2;
}

printf("%i",(int)seeknumber);
return 0;
}

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

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

в функции convert, с *result проблемы

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

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

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

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

int main (void)
{
	
    struct NumberInfo numbers[N];
	int i;

    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(i,numbers[i].num,numbers[i].conv);
	printf("%s", numbers[i].conv);
   
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);

 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 count,int numbers[i].num,char *result)
{
    int i;
    printf("\n\t===============================================\n");
        printf("\t|                      |                      |\n");
    for(i=0;i<count;i++)
   
    {
        printf("\t|          %4.li        |          %s          |\n ", numbers[i].num,result);
    }
    printf("\t================================================\n");
}*/
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Очередной вопрос: пр вызове функции convert,я передаю как параметр conv.Принимает эта функция *result и в этой же функции должен заполняться массив conv. Как показать с помощью этого указателя,что выражение (num%base)+'0'; заполняет массив conv?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Так же как у вас в коде.
char *result означает ссылку на массив, который локально, в этой функции, называется result. Но фактически result это и есть numbers.conv. Меняя что-то в result изменения отражаются и в conv
It's a long way to the top if you wanna rock'n'roll
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

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

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

Да, ваша программа как-то аккуратнее,чем моя)
Я убрала структуру,вот что получилось.Только компилятор матерится на параметры show

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

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

void show(int,int*,char *);
void convertNumber(int, char*);
void reverse(char* );

int main (void)
{
	long int num; // само число
	char conv[42]; // сконвертированное число
    int numbers[N];
	int i;

    printf("Number to convert? '0'-end" );
    for (i=0;i<N;i++)
    {
    scanf("%li",&num);
        if(num =='\0')
        break;
        else
           convertNumber(num,conv);
            
    }
     show(i,numbers,conv);
	   
return 0;
}
int k=0;
void convertNumber(int num, char* result)
{	
    int base=3,n;    	
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 count,int *n,char *result)
{
    int i;
    printf("\n\t===============================================\n");
        printf("\t|                      |                      |\n");
    for(i=0;i<count;i++)
   
    {
        printf("\t|          %4.li        |          %s          |\n ", n,result);
    }
    printf("\t================================================\n");
}
Ответить