DoctorG Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 Еще такой вопрос есть. Какая функция нижний регист переводит в верхний и наоборот. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Mike497 Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 спасибо вам, Тролль! код разумеется работает)) тока понятно, но не понятно))каков принцип вычисленя точности здесь и в дальнейшем?! пока |(1+х)^2|>e => суммировать и таким образом "подгонять" под нужную точность?! :) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 (изменено) Mike497: Если очередной член ряда по абсолютной величине >e, то его надо прибавлять и считать следующий. Как только он оказался равен или меньше e, дальше можно не считать, хотя раз уж мы его вычислили, можно и прибавить (а можно и нет, сумма оставшегося ряда меньше его, значит, и e). Так проще, чем, как в твоей программе, прибавлять его, а потом в проверке в заголовке цикла находить разницу между тем, что было, и тем, что стало. Ясно и так, что эта разница - прибавленный член ряда. Мы используем при этом теорему (признак сходимости знакопеременных рядов) Лейбница - сумма конечного знакопеременного ряда отличается от суммы бесконечного ряда менее чем на величину первого из отброшенных членов бесконечного ряда. То есть в данном случае надо вычислять до тех пор, пока очередной член ряда не окажется по модулю меньше или равен 10^-3. Проще всего считать каждый член ряда, домножая предыдущий на отношение соседних членов ряда (оно равно -(1+x)² *n/(n+1) ). Изменено 7 декабря, 2008 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Mike497 Опубликовано 7 декабря, 2008 Жалоба Поделиться Опубликовано 7 декабря, 2008 Cпасибо вам, Тролль за столь полезные и конкретные мысли и объяснения=) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 9 декабря, 2008 Жалоба Поделиться Опубликовано 9 декабря, 2008 Опять я. Доброго времени суток. Задание: помощью union вывести отдельно введенные младшее и старшее числа типа unsigned int в виде одного unsigned long. Использовать тот факт, что поля в union занимают один и тот же адрес. Вот что то черканул. Ну хотел бы увидеть ваш, как я уверен, правильный вариант #include <iostream.h>#include <conio.h>void main(){clrscr();union {unsigned x1,x2; unsigned long k;}p;cin>>p.x2>>p.x1;cout<<p.k;getch();} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 9 декабря, 2008 Жалоба Поделиться Опубликовано 9 декабря, 2008 core: Ну, в данном случае ты наложил друг на друга два стандартных беззнаковых целых (только не подумай, что друг за другом: друг на друга) и сверху на них длинное беззнаковое целое. Надо было в union вкладывать структуру. Второе: откуда ты знаешь длины твоих типов? Всё это не определено в C++ и зависит от конкретного компилятора, как и битовые поля вообще (кстати, то, что ты писал в прошлой программе, когда ты не обозначил специально поля как беззнаковые, могло и сработать в некоторых компиляторах - трактовка поля как знакового или беззнакового, если это не определено явно в программе, отдается на усмотрение разработчика компилятора). С одним компилятором int и short - синонимы, с другим это int и long, с третьим все три разной длины. По идее, это может (и должен) учитывать программист, если программу предполагается использовать с разными компиляторами, с помощью функции sizeof(имя_типа). Но для конкретного компилятора можно раз и навсегда узнать размеры его типов (с помощью sizeof или описания компилятора) и исходить из этого. Например, для Dev-C++ длина int совпадает с длиной long (при этом длина short - 2 байта, длина long - 4, длина long long - 8, а длина double long - даже 12). Так что в Dev-C++ работает, например, это #include <iostream.h>#include <conio.h>main(){union {struct{unsigned short x1,x2;}; unsigned k;}p;cin>>p.x2>>p.x1; cout<<p.k<<endl;getch();} При вводе 100 и 100 у меня результат будет 6553700 - поскольку это 100*65536+100. Таинственное 65536 - это 2^16. поскольку каждая единица левого числа при длине правого 16 битов означает 65536 объединенного числа. Но это у меня так, при длинах типов Dev-C++. А в твоем компиляторе надо узнать длины ЕГО целых разного вида и исходить из этого. Я уже заметил когда-то, не понимаю, чего вас мучают с изучением личных качеств конкретного компилятора :) . C++ родился из битов и байтов и до сих пор лелеет к ним нежную привязанность (и поэтому очень эффективен), в отличие от, например, Pascal, который был построен так, чтобы машина приспосабливалась к языку человека, а не человек - к языку машины (и платит за это той же эффективностью). Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 9 декабря, 2008 Жалоба Поделиться Опубликовано 9 декабря, 2008 Для моего компилятора - int - 4, long - 8. Спасибо за помощь. И за краткую лекцию только так: #include <iostream.h>#include <conio.h>main(){union {struct{unsigned short x1,x2;}b; unsigned k;}p;cin>>p.b.x2>>p.b.x1; cout<<p.k<<endl;getch();} ибо иначе х1 и х2 не евляются членами union :) точнее не union а struct Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 декабря, 2008 Жалоба Поделиться Опубликовано 10 декабря, 2008 (изменено) core: Да, по правилам так. Но у меня работает и так, как у меня. Я отметил, что пример - для Dev-C++. Опять же, допускает такое сокращение компилятор или нет - дело разработчика компилятора. Изменено 10 декабря, 2008 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Students Опубликовано 10 декабря, 2008 Жалоба Поделиться Опубликовано 10 декабря, 2008 Помогите пожалуйста. Дана матрица размера 5х6. Составить программу для подсчета количества нечетных элементов в каждом столбце матрицы. Ps>на Си Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 10 декабря, 2008 Жалоба Поделиться Опубликовано 10 декабря, 2008 core: Кстати, необходимые при таком компиляторе обращения типа p.b.x1 выглядят громоздкими. Добавь в свою программу после объявления union строчку unsigned short &x1=p.b.x1,&x2=p.b.x2; unsigned &k=p.k; и сможешь обращаться к переменным проще: cin>>x2>>x1; cout<<k<<endl; Students: #include <stdio.h>main(){int i,j,a[5][6],b[6]; printf("Enter the test matrix:\n");for(i=0;i<5;i++){for(j=0;j<6;j++)scanf("%i",&a[i][j]); printf("\n");}for(j=0;j<6;j++){b[j]=0; for(i=0;i<5;i++)if(a[i][j]%2)b[j]++;}for(j=0;j<6;j++)printf("b[%i]=%i\n",j+1,b[j]);getchar(); getchar();} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 11 декабря, 2008 Жалоба Поделиться Опубликовано 11 декабря, 2008 задание выделить память на масив с елементами типов double. Найти максимальный елемент. Вот такое состряпал, но в результате какой-то адрес: #include <stdlib.h>#include <stdio.h>#include <conio.h>double *vk;int n,k;void main() {clrscr();printf ("Vvedit kilkist elementiv masuvy:\n");scanf ("%d",&n);k=sizeof(double);if ((vk=(double *) malloc (k*(n-1)))==NULL){printf ("Out of memory!!!\n");exit(1); };double mass[20];vk=mass;int i=0;for (i=0;i<n;i++){printf ("Vvedit %d element masuvy:\n",i);scanf("%d",*(mass+i));};double *max; max=mass;for (i=1;i<n;i++){if (*(mass+i)>*max) max=(mass+i);};printf ("Naybilwuy element = %d ",*max);getch();} дико извиняюсь. Нашел ошыбку)) scanf("%d",*(mass+i));}; забыл что синтаксис оператора scanf это scanf("%d",(mass+i));}; Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 11 декабря, 2008 Жалоба Поделиться Опубликовано 11 декабря, 2008 все-таки неработает. Возвращает как максимальный - последний елемент. Да ... и в память неправильно пишет. Наверное направильно выделял? #include <stdlib.h>#include <stdio.h>#include <conio.h>double *vk;int n,k;void main() {clrscr();printf ("Vvedit kilkist elementiv masuvy:\n");scanf ("%d",&n);k=sizeof(double);if ((vk=(double *) malloc (k*(n-1)))==NULL){printf ("Out of memory!!!\n");exit(1); };double mass[20];vk=mass;int i=0;for (i=0;i<n;i++){printf ("Vvedit %d element masuvy:\n",i);scanf("%d",(mass+i));};int max=0;printf ("%d",*(mass+max));for (i=1;i<n;i++){if (*(mass+i)>*(mass+max)){max=i;}};printf ("Naybilwuy element = %d ",*(mass+max));free(mass);getch();} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 11 декабря, 2008 Жалоба Поделиться Опубликовано 11 декабря, 2008 (изменено) core: Выделяешь память ты правильно, но по китайской поговорке "вырыл пруд и пустил туда крокодила". После выделения памяти ты тут же теряешь ее адрес, присваивая указателю адрес совсем ненужного статического массива mass, и в дальнейшем выделенную память, естественно, не используешь. Соответственно в конце работы программа пытается освободить память статического массива, а выделенный по malloc и потерянный кусок памяти остается висеть в воздухе. #include <stdlib.h>#include <stdio.h>main() {int n,i,m; double *vk; printf ("Vvedit kilkist elementiv masuvy: "); scanf("%d",&n);if((vk=(double*)malloc(sizeof(double)*n))==NULL){printf("Out of memory!!!\n");exit(1);}for(i=0;i<n;i++){printf("Vvedit %d element masuvy: ",i+1); scanf("%lf",&vk[i]);}m=0; for(i=0;i<n;i++)if(vk[i]>vk[m])m=i; printf("\nNaybilwuy element = %f\n",vk[m]);free(vk); vk=NULL; getchar(); getchar();} Можно было искать только значение максимального элемента, это немножко проще. Но на всякий случай я запоминаю индекс максимального элемента, а вывожу, как у тебя, только его значение. Изменено 11 декабря, 2008 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 12 декабря, 2008 Жалоба Поделиться Опубликовано 12 декабря, 2008 Хм. Задание. Дано масив елементов типа char. Если в масиве есть последовательности с 3 елементами и больше со значениями 0, тогда присвоить етим елементам значение елемента, что идет после последовальности с 3 нулей. (например, 6,7,0,0,0,0,2,3,0,0,0,6 - результат 6,7,2,2,2,2,2,3,6,6,6,6). Для подсчета количества елементов в последовальности использовать использовать разницу указателей на начало и конец последовальности. Начал делать, но какой-то бред получился. #include <iostream.h>#include <conio.h>char mas [40]; int i,j;void main(){clrscr();cout<<"Vvedit kilkist elementiv masuvy:\n";cin>>j;for (i=0;i<j;i++){cout<<"Vvedit "<<i<<"-uy element:\n";cin>>*(mas+i);};char k=0,s,*p1,*p2;for (i=0;i<j;i++){if (*(mas+i)==0){p1=mas+i;k=i+1;s=i;while (*(mas+k++)==0)p2=mas+k; };if (p2-p1>2){for (int l=s;l<k;l++)*(mas+l)=*(mas+k); }};for (i=0;i<j;i++)cout<<"\n"<<*(mas+i);cout<<p2-p1;getch();} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Upgrader Опубликовано 13 декабря, 2008 Жалоба Поделиться Опубликовано 13 декабря, 2008 А подскажите пожалуйста... Чувствую что сделаю неправильно. :bye1: Не совсем понятное задание попалось, хотя очень простое: (язык Pascal) "Описать массив записей, содержащий сведения о должностях, их количествах, разрядах и окладах для конкретной фирмы. Вывести сведения о вакантных должностях. " С выводом информации никаких проблем, все понятно. А с записями (record) - не очень. Точнее как все это записать, структуру этих записей. И как должен выглядеть "массив записей"?. Подскажите как это правильно написать. Как работают записи - знаю, но как описать то, что в задании - не совсем понимаю. Вся информация забивается в программу при запуске, но вопрос не в этом, а в том, как правильно описать записи. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 13 декабря, 2008 Жалоба Поделиться Опубликовано 13 декабря, 2008 Upgrader: Выглядит это примерно так: var a:array[1..100]of record job:string[20]; amount,payment,category:word end; begin Write('job? '); Readln(a[1].job); Write('amount? '); Readln(a[1].amount); Write('payment? '); Readln(a[1].payment); Write(category? '); Readln(a[1].category); ... WriteLn(a[1].job, a[1].amount, a[1].payment, a[1].category); Readln end. Судя по вопросу, надо ввести в структуры еще поле количества вакантных должностей. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
core Опубликовано 13 декабря, 2008 Жалоба Поделиться Опубликовано 13 декабря, 2008 не могли б посмотреть 614 пост Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 13 декабря, 2008 Жалоба Поделиться Опубликовано 13 декабря, 2008 (изменено) core: Вас всё мучают изучением древностей? :blink: #include <stdio.h>main(){int n,a[100],*k,*j,i;printf("Vvedit kilkist elementiv masuvy: "); scanf("%d",&n);for(i=0;i<n;i++){printf("Vvedit %d-uy element: ",i+1); scanf("%d",&a[i]);}k=NULL; for(i=0;i<n;i++){if(*(a+i)==0&&k==NULL)k=a+i; else if(*(a+i)){if(a+i-k>=3&&k!=NULL)for(j=k;j<a+i;j++)*j=*(a+i);k=NULL;}}for(i=0;i<n;i++)printf("%d\n",*(a+i)); getchar(); getchar();} P.S. не обратил внимания, что просили массив типа char, а я сделал его int. Замени в третьей строке слово int на char. Изменено 13 декабря, 2008 пользователем Тролль Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Глупышка Опубликовано 14 декабря, 2008 Жалоба Поделиться Опубликовано 14 декабря, 2008 а мож и мне поможите! надо срочно сделать а я ненаю как!задание: Счастливый билетик.Билет с шестизначным номером считается счастливым если сумма 3-х старших цифр совпадает с суммой трех младших цифр.Допустим, что в билетной кассе находиться 1 млн.билетов с померами от 000000 до 999999, надо определить количество счастлтвых билетов. :doh: Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 14 декабря, 2008 Жалоба Поделиться Опубликовано 14 декабря, 2008 Глупышка: var i,i1,i2,i3,k:word; c:array[0..27]of word;begink:=0; for i:=0 to 27 do c[i]:=0;for i1:=0 to 9 do for i2:=0 to 9 do for i3:=0 to 9 do inc(c[i1+i2+i3]); for i:=0 to 27 do k:=k+sqr(c[i]);writeln(k); readlnend. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Mike497 Опубликовано 15 декабря, 2008 Жалоба Поделиться Опубликовано 15 декабря, 2008 Вообщем дано такое условие задачи на Паскаль: Дано целое число N (> 0). Сформировать и вывести целочисленный массив размера N, содержащий N первых положительных нечетных чисел: 1, 2, 3,… . program _; const n=100; type mas=array[1..n]of integer; var a:mas; i,v,k:integer; begin writeln('kol-vo elementov massiva,k='); readln(k); v:=1; for i:=1 to k do begin a:=v; v:=v+2;end; writeln; for i:=1 to k do writeln (a); end. Скажите пожалуйста, что я делаю не так?! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 15 декабря, 2008 Жалоба Поделиться Опубликовано 15 декабря, 2008 Mike497: Ну, для начала надо посмотреть, что такое нечетные числа. Я бы не стал причислять к ним число 2 :) . А программа у тебя правильная и все делает так, как надо. Не понимаю, чем она тебе не нравится. Единственное, что можно заметить, что то же самое можно было сделать проще. var a:array[1..100]of integer; i,k:integer;beginwrite('kol-vo elementov massiva: '); readln(k);for i:=1 to k do a[i]:=2*i-1;for i:=1 to k do write (a[i]:5); readlnend. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
nadi_scool2 Опубликовано 15 декабря, 2008 Жалоба Поделиться Опубликовано 15 декабря, 2008 Привет)эт я снова,помогите плиз,к зачету надо Дано натуральное число N.Вычислить произведение первых N сомножителей:р=(2/3)*(4/5)*(6/7)*...*(2N/(2N+1)) На Паскале с циклом for,где в скобках там дроби,незнала прост как написать))) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 15 декабря, 2008 Жалоба Поделиться Опубликовано 15 декабря, 2008 nadi_scool2: var p:real; i,n:integer;begin write('N: ');readln(n); p:=1; for i:=1 to n do p:=p*(2*i)/(2*i+1);writeln(p:9:7);readln end. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
leksev Опубликовано 16 декабря, 2008 Жалоба Поделиться Опубликовано 16 декабря, 2008 Помогите переделать программу используя указатели на массивы #include <stdio.h> #define N 10 #include <conio.h> main() { int i,j,a[N][N],b[N],n,m; printf("Введите размер матрицы\n"); scanf("%d%d",&n,&m); printf("Введите матрицу из%5d элементов\n",n*m); for(i=0;i<n;i++) for(j=0;j<m;j++) { printf("a[%d][%d]=",i+1,j+1); scanf("%5d",&a[j]); } printf("Исходная матрица\n"); for(i=0;i<n;i++) { for(j=0;j<m;j++) printf("%5d",a[j]); printf("\n"); } for(i=0;i<n;i++) { b=0; for(j=0;j<m;j++) if(!(a[j]%2))b++; } for(i=0;i<n;i++) printf("b[%d]=%d\n",i+1,b); getch(); } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.