Задача на языке Си  
Автор Сообщение

0
Сообщение Задача на языке Си

Добрый день! Учусь на первом курсе, задали написать несколько программ, в том числе и вот эту. В голове алгоритм представляю, но реализовать не получается, прошу помочь тех, кто в этом шарит :)
Заранее спасибо.
P.s. текст задачи:

Дана символьная запись многочлена от одной переменной X с
целыми коэффициентами. Требуется ввести этот многочлен в память ЭВМ, посчитать значение заданного многочлена при заданном х,  и распечатать полученный результат. 

В памяти ЭВМ многочлен должен быть представлен в виде однонаправленного списка,
в котором каждому одночлену соответствует звено, содержащее степень этого одно-
члена и его коэффициент. Звенья списка должны быть упорядочены по убыванию сте-
пеней, звеньев с нулевыми коэффициентами не должно быть.

Исходный многочлен от переменной X с целыми коэффициентами записывается как
алгебраическая сумма одночленов любого из следующих видов (^ — возведение в сте-
пень): aX^k,  X^k, aX, Х, а. 

За последним одночленом следует пробел — признак конца записи многочлена.
(Особый случай: нулевой многочлен записывается как 0).

 



26 фев 2012, 08:23
Профиль

0
Сообщение Задача на языке Си

Ну все просто. Пишешь структурку, там 3 поля

int coef;//тут будет твой коэффициент

int multipl;//тут будет степень

Struct * next;//это ссылка на следующий элемент списка

 

Далее считываешь данные (сам придумай как), заносишь их в структуры; сортируешь по убыванию / возрастанию степени, пишешь простенький алгоритм на подсчет. Выводишь в stdout. Complete!



26 фев 2012, 08:27
Профиль

0
Сообщение Задача на языке Си

Собственно проблема и заключается в том, чтобы придумать как считывать :(



26 фев 2012, 08:30
Профиль

0
Сообщение Задача на языке Си

int get_number()
{
int x;
for (;;) {
int n = scanf("%d", &x); /* digit */
if (!n == 1 || x < 0)
{
printf("Вводите положительные целые числа!\n");
while (getchar() != '\n');
}
else
return x;
}
}

 

небольшая функция, которая считывает только натуральные числа > 0. 

пример работы:

 

int a = get_number();

//работает как scanf(); только если ввести фигню, выдаст ошибку и продолжит считывание



26 фев 2012, 08:50
Профиль

0
Сообщение Задача на языке Си

спасибо большое за функцию, но мне не совсем понятно. Например, вводится у нас многочлен x^8+1−139x+5x^46, как его считать так, чтобы можно было потом например x^8 представить в виде pow (x, 8) и т.д. И как хранить знак, плюс или минус?



26 фев 2012, 09:06
Профиль

0
Сообщение Задача на языке Си

ааа, ты про это

погугли про считывание строки, а потом ее разбивай посимвольно и вытаскивай что тебе нужно



26 фев 2012, 09:19
Профиль

0
Сообщение Задача на языке Си

Ленивый школьник абюзит хвастливых школьников



26 фев 2012, 10:09
Профиль

0
Сообщение Задача на языке Си

ну в целом я знаю как работать со строками, уже были задачи на это, просто подумал, что если кто-то в этом шарит и давно работает в этой сфере, то ему будет легко написать считывание, особо не думая :)
у меня постоянные проблемы с мелочами, вот и обратился к экспертам пг, в надежде на помощь именно с кодом :(
спасибо большое тебе за помощь :) 



26 фев 2012, 10:09
Профиль

0
Сообщение Задача на языке Си

Свуй писал(а):

Ленивый школьник абюзит хвастливых школьников

Мудрый школьник!



26 фев 2012, 10:41
Профиль



<Меллоун Сабре>


Сервер: Свежеватель Душ
Рейтинг поля боя: 384
2х2: 1809
3х3: 1894
1
Сообщение Задача на языке Си

Код:
#pragma hdrstop
#pragma argsused
#include <tchar.h>

 

////////////////выше  - примочки rad studio, компилятор на котором я писал код. впрочем этот код должен работать на абсолютно любом компилере c++. в не-embarcadero средах можно задокументировать или тереть. также придется поменять заголовок основной функции например на void main(){ ...
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{
struct list{
int coef;//тут будет твой коэффициент
int multipl;//тут будет степень
list * next;
};
list * begin;
list * posl;
begin = new list;
posl =begin; //указатель на начало списка
posl->coef=1;
posl->multipl=1;
bool thereisamult = false;
bool thereisacprob = false;
bool thereisacoef = false;
int minusinarow=1;
char * incstring, * curword;
incstring = (char *)malloc(sizeof(char));
curword = (char *)malloc(sizeof(char));
char c = 0;
int strlen = 0;
printf("vvedi stroku s mnogochlenom v formate aX^k+X^k+aX-Х+а ,\n zakanchivaetsa probelom\n:");
while (c!=(int)' '){
c=getch();
if (c==8){
if (strlen>0) {
putchar(8); putchar((int)' '); putchar(8);
strlen--;
}} else {
putchar(c);
incstring=(char*)realloc(incstring, (strlen+1)*sizeof(char));
incstring[strlen]=c;
strlen++; }}
int wordlenold = 0;
int i = 0;
int wordlen = 0;
int curchislo = 0;
while (i<strlen){
switch (incstring[i]) {
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:{
if (i==0){
thereisacprob=true;
}
curword=(char*)realloc(curword, (wordlen+1)*sizeof(char));
curword[wordlen]=incstring[i];
wordlen++;
} break;
case (int)'x':
case (int)'X':{
thereisacprob = false;
thereisacoef = true;
if (wordlen!=0){
int j = 0;
while (wordlen>0){
curchislo=curchislo+(curword[j]-48)*pow(10, wordlen-1);
wordlen--;
j++;
}
posl->coef =curchislo*minusinarow;
curchislo=0;
minusinarow=1;
free(curword);
curword = NULL;
curword = (char*)malloc(sizeof(char));
} else{posl->coef*=minusinarow;
minusinarow=1;
}
} break;
case (int)'^':{
thereisacprob = false;
thereisamult = true;
if (incstring[i+1]==(int)'-') {
i++;
posl->multipl=-1;

}
} break;
case (int)'-': minusinarow = -1;
case (int)' ':
case (int)'+':{
if (thereisamult) {
if (wordlen!=0){
int j = 0;
while (wordlen>0){
curchislo=curchislo+(curword[j]-48)*pow(10, wordlen-1);
wordlen--;
j++;
}
posl->multipl =curchislo*posl->multipl;
curchislo=0;
thereisamult = false;
}
else {posl->multipl=posl->multipl*1; }
}
if (thereisacprob==true)
{
if (wordlen!=0){
int j = 0;
while (wordlen>0){
curchislo=curchislo+(curword[j]-48)*pow(10, wordlen-1);
wordlen--;
j++;
}
posl->multipl =0;
posl->coef=curchislo*minusinarow;
curchislo=0;
thereisamult = false;
minusinarow = 1;
}
} else thereisacprob=true;
if (i>1) {
posl->next=new list;
posl=posl->next;
posl->multipl=1;
posl->coef=1;
}
}break;
default:
;
}
i++;
}
list * cur;
int buffmult=0, buffcoef=0;
int summa = 0; bool lastslotdeleted = false;
int locker=0;
while (locker!=10){
cur = begin;
locker=10;
while (cur->next!=NULL){
if (cur->multipl<cur->next->multipl) {
buffmult=cur->next->multipl;
buffcoef=cur->next->coef;
cur->next->multipl=cur->multipl;
cur->next->coef=cur->coef;
cur->multipl=buffmult;
cur->coef=buffcoef;
locker=0;
}
cur=cur->next;
if (!lastslotdeleted&&cur->next->next==NULL){ lastslotdeleted = true;cur->next=NULL; }
}
}
// проверка на упрядоченность сделана руками, но ее тоже можно засунуть в пиздатый цикл и тогде не придется каждый раз вводить 5 значений для проверки
//printf("\n\n2i coefficient = %d %d %d %d %d", begin->coef, begin->next->coef, begin->next->next->coef, begin->next->next->next->coef, begin->next->next->next->next->coef);
//printf("\n\n2i multiplikat = %d %d %d %d %d", begin->multipl, begin->next->multipl, begin->next->next->multipl, begin->next->next->next->multipl,begin->next->next->next->next->multipl);
//getch(); поздняк, я сам проверку прикрутил
free(incstring);
cur=begin;
int x;
printf("\n\nBBeDu X u ENTER\n:");
scanf("%d", &x);
while (cur!=NULL){
printf("coef=%d multipl=%d\n", cur->coef, cur->multipl);
summa=summa+cur->coef*pow(x, cur->multipl);
cur=cur->next;
}
printf("summa elementov\n X=%d \n\nsum=%d", x, summa);
getch();
return 0;
}

 

потестил с некоторыми выражениями вроде работает. уникальность кода 95%. возможно гденибудь и багует но я не смог найти где. если найдешь выражение которое неправильно считает - напиши лс я могу поправить 

 

---------------

проверка входных данных не осуществляется, прикрутить влёгкую можно 



26 фев 2012, 21:20
Профиль
Начать новую тему Ответить на тему


Перейти:  

На сайте использованы материалы, принадлежащие Blizzard Entertainment. Копирование материалов возможно только c разрешения портала. В противном случае это будет называться уже другим словом.
Рейтинг@Mail.ru