leksev Опубликовано 4 декабря, 2008 Жалоба Поделиться Опубликовано 4 декабря, 2008 leksev: #include <iostream.h>main(){int i,j,a[3][4],b[3]; cout<<"Enter the test matrix:"<<endl;for(i=0;i<3;i++){for(j=0;j<4;j++)cin>>a[i][j]; cout<<endl;}for(i=0;i<3;i++){b[i]=0; for(j=0;j<4;j++)if(!(a[i][j]%2))b[i]++;}for(i=0;i<3;i++)cout<<"b["<<i+1<<"]="<<b[i]<<endl;getchar(); getchar();} ТРОЛЬ,конечно большое спасибо, но ты не мог бы эту же прогу и на С сделать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 декабря, 2008 Жалоба Поделиться Опубликовано 4 декабря, 2008 (изменено) leksev: но ты не мог бы эту же прогу и на С сделатьЕлки-палки, а потом на каком? :g: Ладно переделка пустяковая... #include <stdio.h>main(){int i,j,a[3][4],b[3]; printf("Enter the test matrix:\n");for(i=0;i<3;i++){for(j=0;j<4;j++)scanf("%i",&a[i][j]); printf("\n");}for(i=0;i<3;i++){b[i]=0; for(j=0;j<4;j++)if(!(a[i][j]%2))b[i]++;}for(i=0;i<3;i++)printf("b[%i]=%i\n",i+1,b[i]);getchar(); getchar();} core: Внешне я у тебя тут ничего криминального не вижу, а на компе у меня сейчас ничего подходящего для прогона твоей программы не стоит . nadi_scool2: var a,b,c,d:integer;function nod(a,b:integer):integer; begin if a mod b<>0 then nod:=nod(b,a mod b) else nod:=b end; procedure noc(a,b:integer; var d:integer); begin d:=a div nod(a,b)*b end; begin readln(a,b,c); noc(a,b,d); noc(d,c,d); writeln(d); readln end. Изменено 4 декабря, 2008 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
nadi_scool2 Опубликовано 4 декабря, 2008 Жалоба Поделиться Опубликовано 4 декабря, 2008 Тролль я по другому немного написала,ток у меня не идет,она скомпилировалась,числа вводятся,но ответ не считается,ставит курсор на процедуру для НОК(я там выделила))че не правильно? :g: program nok3; procedure NOD1(A,B,C:integer;var NOD,D:integer); begin while (a<>0) and (b<>0) do if a>=b then a:=a mod b else b:= b mod a; D:=a+b; while (D<>0) and (C<>0) do if D>=C then D:=D mod C else C:=C mod D; NOD:=D+C; end; procedure NOK1(A,B,C,NOD,D:integer;var NOK,K:integer); begin K:=a*b div D; NOK:=K*C div NOD end; Var NOD,NOK,D,K,A,B,C:integer; begin write('vvedite tri 4isla:'); readln(A,B,C); NOD1(A,B,C,NOD,D); writeln(NOD); NOK1(A,B,C,D,NOK,K,NOD); writeln(NOK); end. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 декабря, 2008 Жалоба Поделиться Опубликовано 4 декабря, 2008 (изменено) nadi_scool2: У тебя при вызове процедуры NOK1 на место параметра D подставляется NOK, равный в это время нулю, а затем на него делим. Тут программа и вылетает. Если будешь дальше отлаживать свой вариант, обрати еще внимание, что в процедуре NOD1 сначала D получается правильно, но при дальнейшем вычислении NOD по ходу вычисления D изменяется и при выходе из процедуры вычисленное в ее середине значение D будет уже подпорчено. Изменено 4 декабря, 2008 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 4 декабря, 2008 Жалоба Поделиться Опубликовано 4 декабря, 2008 опять ети битовые поля :g: Задание : в переменной char записано число. с помощью 4 битовых полей считать двуичный код числа и если в поле записано 00 - вывести оценку плохо, если 01 - удовлетворительно, 10 - хорошо. 11 - отлично. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 декабря, 2008 Жалоба Поделиться Опубликовано 4 декабря, 2008 (изменено) core: Мне кажется, это для тебя уже должно быть как ежу с улиткой справиться. char однобайтовый, в него пакуются как битовые поля два полубайтовых целых... Не вижу, зачем тут тебе помощь. Полубайт, кстати, в старину имел свое название - ниббл. P.S. Хотя... похоже, я не так понял условие. Не четырехбитовых полей, а четырех битовых полей. То есть в байт пакуются не два полубайтовых целых (строго говоря, беззнаковых целых), а четыре четвертьбайтовых, по два бита. Четверти байтов даже собственным именем не удостоили. Впрочем, труднее это задачу не делает. Изменено 4 декабря, 2008 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
nadi_scool2 Опубликовано 5 декабря, 2008 Жалоба Поделиться Опубликовано 5 декабря, 2008 NOD я исправила,теперь он считается))а вот про НОК все равно не поняла,у меня для любых чисел пишет 0 ;) чет я совсем торможу,вот я переписала на 2 процедуры,правда незнаю зачем)) procedure NOK1(A,B,C,D:integer;var K:integer); begin if k<>0 then K:=a*b div D; end; procedure nok2(k,c,nod:integer;var nok:integer); begin NOK:=K*C div NOD end; ой чет я с именем накосячила))Тролль,сорри :bye1: Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 5 декабря, 2008 Жалоба Поделиться Опубликовано 5 декабря, 2008 (изменено) nadi_scool2: Задача затрагивает три области: теорию чисел, вычислительную математику и язык программирования Pascal. Теория чисел тебе подскажет выражения для вычисления НОД и НОК трех чисел. Вычислительная математика скажет, почему лучше использовать, например, K:=a div D *b, а не K:=a*b div D. Ну и знание Pascal поможет записать все это в виде, понятном для компьютера. Ты хорошо знаешь Pascal, а твои ошибки связаны с недостатком знаний по первому и второму пунктам, в чем тебя винить нельзя, ибо вам их и не давали. Обучение у нас в основном сводится к бросанию в воду - способный научится плавать сам, а неспособного спасут доброжелатели или нанятые родителями (если они достаточно богаты) спасатели. Разберемся в твоей задаче. Надо найти НОК трех чисел. Как его найти? Лезем в нормальные учебники и находим, что нужно выписать все простые множители чисел, посчитать количества их вхождений в разложение каждого из чисел... Помилуй Боже... Или, как сказано в Википедии Можно формулировать правило нахождения Н. кратного ещё так: следует разложить данные количества на множители и, взяв каждого из этих множителей в наибольшей из тех степеней, в которых он входит в полученные разложения, перемножить между собой эти наибольшие степени. Но этот способ неудобен, т.к. гипотетически разложение числа на простые множители является алгоритмически сложной задачей (на предположении о её сложности строятся многие криптографические системы). Поэтому проще находить НОК по следующей формуле...Впрочем, использовать статьи только на русском часто недостаточно. Статья на ту же тему в Википедии на английском гораздо полнее и прямо говорит Because gcd(a, b) is a divisor of both a and b, it's more efficient to compute the LCM by dividing before multiplying(в переводе: Поскольку НОД(a,b) является делителем и a, и b, более эффективно вычислять НОК делением ДО умножения). Но это все хорошо для НОК двух чисел, а нам нужны три. Лезем в теорию чисел, там находим, что НОК(a,b,c) вычисляется как НОК(НОК(a,b),c), а сам НОК двух чисел вычисляется как ab/НОД(a,b) (Мультипликативные полугруппы неотрицательных действительных чисел или, немного проще, Теоремы, облегчающие вычисление НОД и НОК). Так как теорию чисел вы, скорее всего, не проходили, предполагается, что ты должна была доказать все это самостоятельно. Что тебе стоит изобрести основные теоремы теории чисел... :bye1: Почему у тебя получается неправильно? Обычно легче написать свою программу, чем разобраться в чужой А что такое положительное число? — взволновался чёрт. — И почему вы хотите, чтобы оно было целым?( "Саймон Флегг и дьявол", Артур Порджес - кстати, прочти рассказик, мне он доставил удовольствие ), но похоже, что ты пытаешься считать НОД сразу и для первого НОК, и для второго, которое в этот момент тебе еше неизвестно, поэтому одним из параметров для вычисления второго НОД используешь не первый НОК, а первый НОД, а это неправильно. Что получится, неясно, но видимо, что-то не то. То есть ты используешь неправильную формулу, а НОД сразу для трех чисел и считать нет смысла. Возможно, ты бы могла вывести новые теоремы об использовании НОД трех чисел для вычисления НОК трех чисел, но у меня лично развивать теорию чисел нет никакого желания, тем более что мне хватает того, что я уже выяснил - как сводить вычисление НОК для трех чисел к вычислению НОК для двух чисел, а при этом нужен только НОД для двух чисел. В итоге, если переделывать твою программу и выкинуть ненужные переменные, получается так: program nok3;procedure NOD1(A,B:integer;var NOD:integer); begin while (a<>0) and (b<>0) do if a>=b then a:=a mod b else b:= b mod a; NOD:=a+b; end;procedure NOK1(A,B:integer;var NOK:integer); var NOD:integer; begin NOD1(A,B,NOD); NOK:=A div NOD *B; end;Var A,B,C,D:integer;beginwrite('vvedite tri 4isla:'); readln(A,B,C);NOK1(A,B,D); NOK1(D,C,D); writeln(D); Readlnend. В принципе два вызова процедуры NOK1 можно было бы заменить одним, но тогда процедура NOK1 получается сложнее, так в ней надо одно и то же записывать два раза или вызывать NOK1 внутри себя еще раз - в любом случае проще дважды вызвать одного и того же джинна ;). P.S. А процедуру NOD1 можно вообще выкинуть, записав ее текст внутри процедуры NOK1, тогда понадобится ввести в NOK1 пару вспомогательных переменных, чтобы не портить значения a и b. Изменено 5 декабря, 2008 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
nadi_scool2 Опубликовано 6 декабря, 2008 Жалоба Поделиться Опубликовано 6 декабря, 2008 Тролль,спасибо тебе огромное :bye1: ))))оч помогло))даж не знаю как благодарить за такое подробное объяснение))) :bye1: Ссылка на комментарий Поделиться на другие сайты Поделиться
nadi_scool2 Опубликовано 6 декабря, 2008 Жалоба Поделиться Опубликовано 6 декабря, 2008 А рассказ улыбнул :bye1: Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 6 декабря, 2008 Жалоба Поделиться Опубликовано 6 декабря, 2008 помогите решить задание, так как я просто не понимаю его сути: Написать функцию,которая за целым n>7 исчесляет два целых а и b, учитывая что 5а+3b=n, a a+b-минимальное. Ссылка на комментарий Поделиться на другие сайты Поделиться
Mike497 Опубликовано 6 декабря, 2008 Жалоба Поделиться Опубликовано 6 декабря, 2008 Здравствуйте. Не получается у меня одна задачка в паскале... на вычисление суммы членов ряда с определённым коэффицентом...(( Вот эта задача: "Вычислить сумму ряда s(x) с точностью e=10^-3: s(x)=-(1+x)^2+(1+x)^4/2-(1+x)^6/3+(-1)^n*(1+x)^2n/n" Сам пытался что-то сделать, но постоянно получаю ноль в рез-те((: program _; var s,x,n,e,y,z,t,o,si:real; begin writeln ('vvedite x:'); readln(x); n:=1; e:=0.001; si:=0; y:=(1+x); z:=y*y; t:=-1; o:=y*y; while abs(si-s)>=e do begin s:=si; si:=t*(z/n)+si; z:=z*o; n:=n+1; t:=t*t; end; writeln('summa = ', s:1:3); end. Думаю для вас это не составит особого труда... тьфу... не с "коэффициентом" а с "точностью"... И вообще как надо понимать понятие "точность" в данном случае и вообще?! Ссылка на комментарий Поделиться на другие сайты Поделиться
DoctorG Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 очередная проблемма. Есть задача. Есть фаилы f1 и f2. f1 содержит произвольный текст разделеный пробелами и знаками припинания f2 содержит не более сорока слов разделенных запятыми. Эти слова образуют пары, каждое первое слово считается заменяемым каждое второе заменяющим найти в фаиле f1 все заменяемые слова и заменить их на заменяющие. --- проблема начинатеся уже при открытие фаилов. Когда открываю один фаил, все нормально работает. а при добавлении в код открытия второго фаила прога даже не компилица. ну то есть делаю примерно так int main(array<System::String ^> ^args){setlocale(LC_CTYPE, "Russian");ofstream out_file("file1.txt");//запись в фаилout_file<<"один два один два один два";out_file.close();char s1[64];ifstream in_file("file1.txt");while (!in_file.eof){in_file>>s1;cout<<s1<<endl;}in_file.close();ofstream out_file("file2.txt");//запись в фаилout_file<<"два один два один два один";out_file.close();ifstream in_file("file2.txt");while (!in_file.eof){in_file>>s1;cout<<s1<<endl;}in_file.close();Console::ReadLine();return 0;} Вобщем, помощь в решении задачи, очень нужна. Очень очень. Заранее спасибо. Ссылка на комментарий Поделиться на другие сайты Поделиться
gnade Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 Добрый день! Столкнулся с проблемой, в написании лабораторной работы на ассемблере (masm). Задание звучит так: Обчислить 4 значения функции: Y = 3 * log2(x(квадрат) +1), x изменяется от 0,2 с шагом 0,3. Проблема заключается в получении log2. В математике я не силен :) Вот отрезок кода: fld resfiadd const1fyl2x где fld res это (x(квадрат) +1) После команды fyl2x st(0) становится -NAN FFFF C0000000 00000000 ошибка... Хелп плз! Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 core: за целым n>7 исчесляет два целых а и bЭто на украинском? Чушь это всё. Минимальной суммы a+b не существует, она равна минус бесконечности, если брать целые числа. А если считать, что сумма a+b должна быть неотрицательна, то есть минимум равен нулю, то b=-a, 5a-3a>7, 2a>7; a=4, b=-4 А если еще считать, что целые a и b также должны быть неотрицательны, то решение также бросается в глаза: a=1, b=1. Зачем тут компьютер? Где ты учишься? Чтобы что-то написать, переведем на "компьютерный" решение по третьему толкованию: label m; var a,b,s,n:integer; begin n:=7; s:=0; repeat for a:=0 to s do if 5*a+3*(s-a)>n then goto m; inc(s) until false; m: writeln('a=',a,' b=',s-a,' n=',5*a+3*(s-a)); readln end. Ответ будет, естественно, a=1, b=1. Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 В том и дело - проблема как раз не в задании. А в его постановке. Я так понимаю что задается число n, которое может быть сумой 5a+3b, соответственно это 8(1,1), или 11(1,2), 13(2,1),16,(2,2),14(1,3),17(1,4),18(3,1), и т.д. И именно а и б нужно определить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 core: Ну тогда эта программа и будет определять a и b, только надо вводить нужное n. А вообще, конечно, согласен, проблема в неграмотной постановке задачи, но - переписать условие я же не могу, надо идти к преподу и говорить, что он дурак в связи с его загруженностью в условие написанной им задачи, возможно, вкрались некоторые неточности, не позволяющие однозначно истолковать это условие. Mike497: У тебя то же самое. Сначала пусть будет ряд записан по-человечески. У тебя в этом ряду всего четыре члена, по сути это вообще не ряд, а многочлен. А если в формуле и появятся многоточия (обычный способ записи рядов, хотя есть и другие), проследи, чтобы было ясно, конечный это ряд (многоточия только в середине ряда) или бесконечный (многоточия в середине и конце ряда). Если он конечный, то зачем нам точность - просто считаем весь ряд полностью. А если бесконечный, то что имеется в виду - относительная или абсолютная точность? Я понимаю, что ты хотел получить ответы на эти вопросы у меня. Но я не могу изменять формулы и придумывать что-то другое, а не то, что написано. В программе у тебя проблемы начинаются с того, что при первой же проверке в заголовке цикла у тебя разница s и si равна нулю, цикл ни разу не выполняется, поэтому что именно в нем написано, уже не имеет значения (хотя там тоже есть ошибки, например, t:=t*t после первого вычисления окажется равным 1 и знак потом менять уже не будет никогда). А точность - это насколько может вычисленная величина отличаться от ее точного значения. И бывает она относительная (в долях точного значения) и абсолютная (возможная разница значений). Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 DoctorG: Не компилится скорее всего из-за того, что отсутствуют скобки в while (!in_file.eof()) Как-никак eof - метод. Ссылка на комментарий Поделиться на другие сайты Поделиться
DoctorG Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 не помогло 4 -е ошибки Ошибка 2 error C2088: <<: недопустимо для class c:\Users\ArtemG\Documents\Visual Studio 2008\Projects\503i\503i\503i.cpp 26 Ошибка 4 error C2088: >>: недопустимо для class c:\Users\ArtemG\Documents\Visual Studio 2008\Projects\503i\503i\503i.cpp 32 Ошибка 3 error C2370: in_file: переопределение; другой класс хранения c:\Users\ArtemG\Documents\Visual Studio 2008\Projects\503i\503i\503i.cpp 29 Ошибка 1 error C2370: out_file: переопределение; другой класс хранения c:\Users\ArtemG\Documents\Visual Studio 2008\Projects\503i\503i\503i.cpp 25 Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 Ну, у меня компилируется и выполняется, например, так: #include <iostream.h> #include <fstream> int main() { std::ofstream out_file("C:\\file1.txt"); out_file<<"one two three four"; out_file.close(); char s1[64]; std::ifstream in_file("C:\\file1.txt"); while (!in_file.eof()) { in_file>>s1; cout<<s1<<endl; } in_file.close(); std::ofstream out_file2("C:\\file2.txt"); out_file2<<"twotwo"; out_file2.close(); std::ifstream in_file2("C:\\file2.txt"); while (!in_file2.eof()) { in_file2>>s1; cout<<s1<<endl; } in_file2.close(); getchar(); return 0; } Но у меня Dev-C++, на разных компиляторах могут быть (и обычно есть) некоторые отличия в тексте, тем не менее попробуй заменить во второй половине программы file на file2. Ссылка на комментарий Поделиться на другие сайты Поделиться
Mike497 Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 http://foto.tut.by/albums/userpics/u/l/100...mal_1944199.jpg вот такое условие задачи... мот кто кинет правильный код?! Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 Возвращаюсь к заданию с полями. Такой вопросик. Идет запись в структуру битовых полей. struct bit { x1:2; x2:2; x3:2;x4:2;} mark;void main(){clrscr();scanf ("%d",&mark); Ввожу число 200. Его бинарный код : 11001000. На printf ("\n%d,%d,%d,%d",mark.x4,mark.x3,mark.x2,mark.x1); такой результат: -1,0,-2,0. На число 250 результат: 11111010 -1,-1,-2,-2. Значит 11 выводится как -1, 00 как 0, а 10 и 01 как -2. Как это понять? И как тогда различить 10 и 01 ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 Mike497: Это уже лучше. Теперь ряд хоть на ряд похож. Хотя не все замечания исчезли, можно хоть понять, что имелось в виду. var n:integer; x,e,t,s:real; begin writeln ('vvedite x:'); readln(x); n:=0; e:=0.001; t:=-sqr(1+x); s:=t; while abs(t)>e do begin n:=n+1; t:=-t*sqr(1+x)*n/(n+1); s:=s+t end; writeln('summa = ', s:1:3); readln end. Имей в виду, что ряд сходится только для значений x от 0 до -2. Если не хочешь, чтобы при вводе значений вне этого интервала программа вылетала, после ввода x введи проверку введенного значения и, если оно вне этого диапазона, выдай сообщение об этом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 (изменено) core: Значит 11 выводится как -1, 00 как 0, а 10 и 01 как -2. Как это понять? Целые числа со знаком представляются в компьютере обычно в так называемом дополнительном коде (это упрощает структуру арифметического устройства компьютера), в этом коде старший бит (крайний левый) служит признаком отрицательного числа. Но в отрицательных числах и остальные биты будут выглядеть иначе, поэтому если хочешь интерпретировать запись отрицательного числа "вручную", надо знакомиться с их представлением в дополнительном коде. А у тебя в программе битовые поля интерпретируются именно как числа со знаком, и единица в их левом бите при выводе расшифровывается как признак отрицательного числа. Для положительных чисел дополнительный код совпадает с обычной записью двоичного числа (так называемым прямым кодом), а самый левый бит у них всегда равен нулю. С расшифровкой беззнаковых целых чисел проще, они всегда представляются обычным прямым кодом, и левый бит у них используется как при обычной двоичной записи. Я же написал, надо определять битовые поля как беззнаковые целые. То есть так: struct bit {unsigned x1:2,x2:2,x3:2,x4:2;} mark; Обрати внимание, что перечисление должно идти через запятые, а не через двоеточия - иначе unsigned будет относиться только к x1. Давать типу структуры имя (bit), кстати, необязательно, но ничему не мешает. Изменено 7 декабря, 2008 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 гммм. Так и сделал. Тепер на 200(11001000) результат 3,0,2,0, на 220 - (11011100) - 3,1,3,0. Хаха. Работает!!! Спасибки тебе Тролль большое!!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти