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. Хаха. Работает!!! Спасибки тебе Тролль большое!!!! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.