Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ненужные символы! и Разброс из char вмассив! Избавится от какого нибуть символа в стр 
:(
    Опции темы
Symbios
  Дата 15.5.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Имеется знач структура под тип данных:
Код

typedef struct K
{
float koef;
int step;
} math;

Читаю я знач строчку типа:
3.G(x)=5*x^6+3.58*x^5+3*x^4-23.1*x^3+45*x^2+0*x+7
Вобщем я решил избавится от исксов и ненужной нечисти дабы запихнуть нужные циферки в массив и взять ну типа производную от выражения!
Но что то в Цикле у меня нитак, присвоение не идет?  smile 
Пачиму  smile 
Как видно в первом, если эт можно назвать коде )) я пытаюсь избавится от 3-х символов, что у  меня неполучается, выдаёт ошибку типа не так что то в !strcmp(string[i],"*")  и других сравнениях, оно идет посимвольное 
Код

void kill_x(char* string)
{
int i=0;
char *result;

while(string[i]!=NULL)
    {
    if(!strcmp(string[i],"*") && !strcmp(string[i],"x") && !strcmp(string[i],"^"))
        {
        if(string[i+2]) {    result[i]=string[i]; }
        }
    i++;
    }
strcpy(string,result);
}

Эпизод второй, пытаюсь таки перекинуть оставшиеся цыферки в массив типа структуры math, и тут кирпичи летят.
Чтото не так с обращением к массиву...
Код

void raznos(char* buf,math *mass)
{
int i=0;
char * tempstr;
char tempvir[2];

tempstr=strtok(buf,".");
tempstr=strtok(buf,".");
while(tempvir=strtok(tempstr,"+"))
    {
    ((mass[i])->koef)=atof(tempvir[0]);
    ((mass[i])->step)=atoi(tempvir[1]);
    }
}

 
PM MAIL   Вверх
bsa
Дата 15.5.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



string[i] - это тип char, а не строка. Соответственно, сравнивать ты должен так:
Код
char c = string[i];
if ( ( c != '*' ) && ( c != 'x' ) && ( c != '^' ) )...

А во втором примере ты пытаешься присвоить массиву tempvir указатель, что неправильно. Ты должен определить tempvir, как char * tempvir.
И переменную i цикла while ты не изменяешь. 
PM   Вверх
Symbios
Дата 16.5.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Да с первым вроде разобрались, но во втором случает какие то неполадки всётаки!
При той же попытке присвоения:
Код
    (((math*)mass[i])->koef)=atof(&tempvir[0]);

Выдаёт ошибку:  Error: lut.c(90,19):Incompatible type conversion

Да и в этой строчке выдаёт ошибку:
Код
if(string[i+2]) {    result[i]=string[i]; }

Что б было понятней оно нужно что бы определить если это конец строки, т.е. по идее string[i+1] будет знак конца строки, значит после него ничего... Знач и производного от обычного числа 0, а если там будет x то и попадется соответственно наstring[i+2] тот же самый знак переноса строки либо иной символ!
До других способов сделать такую весч я еще недодумался к сожалению, взирая на свой опыт в Си...) 

Забыл написать как всё изначально, может быть там закралась какая то ошибка, вот вобщем то весь получившийся код!
Код

typedef struct K
{
float koef;
int step;
} math;

int raznos(char* buf,math* mass);
void kill_x(char* string,char* temp2);

int main(){
FILE *fp1;
char*fname="D:\\K\\Lutiy\\file.txt";
char buf[40][60];
char temp[60];
int n=0,i=0,num;
math * mass;

fp1=fopen(fname,"rt");

if(!fp1){
    printf("\n ERROR!");
    getch();
    return 0;
    }

while(fgets(buf[n],60,fp1))
{
printf("%s",buf[n]);
n++;
}

fclose(fp1);

printf("\n\n Vvedite nomer funkcii: ");
scanf("%d",&num);

strcpy(temp,date[num]);
printf("%s",temp);

kill_x(temp,temp2);
printf("%s",temp2);

raznos(temp2,mass);
while(mass[i]) {
printf("%d ) %.2f %d",i,mass[i].koef,mass[i].step);
i++;
}

getch();
return 1;
}


void kill_x(char* string,char* temp2)
{
int i=0;
char* results;
char c,c2;

while(string[i]!=NULL)
    {
    c=string[i];
    c2=string[i+2];
    if((c!='*') && (c!='x') && (c!='^'))
        {
        if(c2!=NULL) { results[i]=c; }
        }
    i++;
    }
strcpy(temp2,results);
}

int raznos(char* buf,math* mass)
{
int i=0;
char * tempstr;
char * tempvir;
if(buf[0]==NULL) { return 0; }
tempstr=strtok(buf,".");
tempstr=strtok(buf,".");
while(tempvir=strtok(tempstr,"+"))
    {
    (((math*)mass[i])->koef)=atof(&tempvir[0]);
    (((math*)mass[i])->step)=atoi(&tempvir[1]);
    i++;
    }
return 1;
}

ЗЫ: Сегодня иду к преподавателю, может там что выяснится, но он у нас не асс...    

Это сообщение отредактировал(а) Symbios - 16.5.2006, 08:21
PM MAIL   Вверх
bsa
Дата 17.5.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
(((math*)mass[i])->koef)=atof(&tempvir[0]);

И кто тебя этому учил?!?
Код
math * mass;
mass[0] == *mass;
mass->koef;
mass[0].koef;  //!!!

В функции kill_x ты не выделил память под result. Лучше вместо result напрямую используй temp2, если под нее выделена память.
нулевой символ - это не NULL, а '\0'. NULL иногда определяется, как (void*)0.
Я что-то не понял, почему используешь string[i+2]?!? Не проще ли string[i] проверять на символ конца строки '\n'? string[i+2] иногда выходит за границу допустимого. 
PM   Вверх
Symbios
Дата 19.5.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Согласен жудко сглупил, сейчас пошел несколько другим путем!
И опять же запорка:
Код

int raznos(char* buf,math* mass)
{
int i=0;
char * tempstr;
char * tempvir;
char* tempx;
char* x;
char string1[10],tempnum[5];
char string[60],string2[10];

if(buf[0]==NULL) { return 0; }
tempstr=strtok(buf,"=");
tempstr=strtok(NULL,"=");
strcpy(string,tempstr);
tempvir=strtok(string,"+");
do{
   strcpy(string1,tempvir);
   printf("\n Zasilaem: %s",string1);
   kill_x(string1,string2);

   if((x=strstr(string2,"x")))
   {
   if((tempx=strtok(string2,"x")))
    {
      strcpy(tempnum,tempx);
      mass[i].koef=atof(tempnum);
      }else{
      mass[i].koef=1;
      }
   if((tempx=strtok(NULL,"x")))
    {
      strcpy(tempnum,tempx);
      mass[i].step=atoi(tempnum);
      }else{
      mass[i].step=1;
      }
   printf("\n Prisvoili: Koef=%.2f Step=%d",mass[i].koef,mass[i].step);
    i++;
   }
   tempvir=strtok(NULL,"+");
}while(tempvir);

return i;
}


Всё пучком как бы, раскидывает, но 1 раз и Всё!
Не берет следующие токены по моему, а почему ну могу разобраться! 
PM MAIL   Вверх
bsa
Дата 21.5.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Ты знаешь, что strtok портит исходную строку? 
PM   Вверх
Symbios
Дата 21.5.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Да, уже разобрался, спасибо.
Последний вопрос, всё собрал в масстив типа math
Код
typedef struct K
{
float koef;
int step;
} math;


Как из этого массива в строчку данные записать вставляя между koef и step символ, в данном случае 'x' ?
 
PM MAIL   Вверх
Symbios
Дата 21.5.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Строчку в смысле в char и в файл!
Или прямиком в файл!? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1348 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.