Помогите разобраться
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
А с convertNumber все нормально?Есть еще какие-то замечания вообще,не только по параметрам?
Да нет конечно, не все нормально. Параметры передаются функции, чтобы та их использовала. А convertNumber не смотря на передаваемые данные все-равно на numbers смотрит. Точнее сказать, в идеале, функция или процедура не должна видеть ничего кроме своих собственных параметров и локальных переменных. У вас же любая функция работает с массивом numbers. Так же до сих пор не раскрыт тайный смысл создания структуры numberInfo
It's a long way to the top if you wanna rock'n'roll
Какой ужас, чуть позже к той проге вернусь,а пока у меня другой вопрос:
компилятор ругается на 21-22 строку и пишет: для индекса требуется массив или указатель.
Неужели нельзя просто писать имя массива и индексы?Что тогда вместо написать?
компилятор ругается на 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;
}
массив mt определен как одномерный, в то время как обращение выполняется как к двумерному
It's a long way to the top if you wanna rock'n'roll
в функции 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");
}*/
Очередной вопрос: пр вызове функции convert,я передаю как параметр conv.Принимает эта функция *result и в этой же функции должен заполняться массив conv. Как показать с помощью этого указателя,что выражение (num%base)+'0'; заполняет массив conv?
Так же как у вас в коде.
char *result означает ссылку на массив, который локально, в этой функции, называется result. Но фактически result это и есть numbers.conv. Меняя что-то в result изменения отражаются и в conv
char *result означает ссылку на массив, который локально, в этой функции, называется result. Но фактически result это и есть numbers.conv. Меняя что-то в result изменения отражаются и в conv
It's a long way to the top if you wanna rock'n'roll
somewhere, с парметрами стало лучше или все так же плохо?
Стало правильнее. Вам бы еще от структуры уйти и тогда будет совсем замечательно. Между прочим осталось совсем немного, т.к. после ограждения функций от основного кода они теперь не связаны с массивом numbers напрямую. Нет необходимости хранить все результаты преобразования. Достаточно хранить один лишь массив из введеных чисел, а троичную строку всегда можно получить с помощью функции. Правда один массив char все же понадобится.
Вам проще посмотреть ранее выложенный мною код, там все сделано без структур.
Вам проще посмотреть ранее выложенный мною код, там все сделано без структур.
It's a long way to the top if you wanna rock'n'roll
Да, ваша программа как-то аккуратнее,чем моя)
Я убрала структуру,вот что получилось.Только компилятор матерится на параметры show
Я убрала структуру,вот что получилось.Только компилятор матерится на параметры 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");
}