Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Помогите с C++


Рекомендуемые сообщения

Хексем:

Неясно, когда обрывать вычисление ряда. Ряд, в зависимости от значения аргумента, может и расходиться...

В качестве примера программы, суммирование десяти членов такого ряда:

#include <iostream.h>#include <math.h>int main(){float x,p,s=0,q=1; cin>>x; p=sin(x);  for(int i=1;i<=10;i++)s+=q*=p; cout<<s;getchar(); getchar();}

P.S. Не забудь - углы в радианах.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
  • Ответов 169
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Есть проблема. В общем, пишу прогу на C++.NET. Надо было мне использовать пространства System и System::IO. Делал всё как написано в MSDN: в самом начале программы после подключения файла iostream.h ввёл строки:

using namespace System;using namespace System::IO;

Однако при компиляции программы компилятор стал ругаться:

error C2871: 'System' : a namespace with this name does not exist

error C2653: 'System' : is not a class or namespace name

error C2871: 'IO' : a namespace with this name does not exist

потипа он вообще не знает такие пространства имён или их нет. Хотя в C# когда подключаешь эти пространства таким же способом (только вместо :: ставится точка) - всё норм. Может быть я что-то не так делаю? :)

Изменено пользователем Shadow TH
Ссылка на комментарий
Поделиться на другие сайты

Ваш проект, по видимому не использует .NET Framework ...

С# включает поддержку .NET Framework автоматически.

Дело в том, что на С++ можно програмировать и без .NET Framework. Поетому при создании, или в свойствах готового проекта Вам надо включить поддержку CLR-среды...

Ссылка на комментарий
Поделиться на другие сайты

Ваш проект, по видимому не использует .NET Framework ...

С# включает поддержку .NET Framework автоматически.

Дело в том, что на С++ можно програмировать и без .NET Framework. Поетому при создании, или в свойствах готового проекта Вам надо включить поддержку CLR-среды...

Ясно, спс.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Приветствую всех!

Подскажите пожалуйста, как работать в c\c++ с двичными числами ?

К примеру: ввожу десятичное число, раскидываю его в двоичное представление, умножаю на 2,

вывожу двоичный и десятичные результат результат на экран...

Ссылка на комментарий
Поделиться на другие сайты

Cloud:

Числа в компьютере и так в машинном представлении двоичные. Так что вопрос только о вводе-выводе чисел в двоичном виде их записи.

Встроенными функциями C число может быть представлено на экране в восьмеричном, десятичном и шестнадцатеричном видах записи. Также и ввод числа возможен при наборе его на клавиатуре или при записи в тексте программы в этих формах записи. Двоичная форма записи при вводе-выводе не предусмотрена, скорее всего потому, что перевод из восьмеричной или шестнадцатеричной формы в двоичную и обратно человек легко делает в уме. А C был рассчитан на использование людьми, которые это легко могли делать и во сне :)

К примеру: ввожу десятичное число, раскидываю его в двоичное представление, умножаю на 2, вывожу двоичный и десятичные результат результат на экран...
В двоичное представление число автоматически раскинется при вводе, но результаты вычислений, которые в компьютере также находятся в двоичном виде, при обычном выводе будут автоматически переведены обратно в десятичную форму представления на экране. Но можно использовать ввод-вывод через строки, благо функции преобразования строки с представлением числа в любой системе счисления с основанием до 36 в его машинный двоичный код и обратно, в C имеются.

Пример:

#include<stdio.h>#include<stdlib.h>int main(){char *end_ptr; long val; int r=2; char str[20];printf("%s","decimal number? "); scanf("%ld",&val); ltoa(val,str,r); printf("%20ld\n%20s\n\n",val,str); val*=2; ltoa(val,str,r); printf("%20ld\n%20s\n\n",val,str); val<<=1; ltoa(val,str,r); printf("%20ld\n%20s\n\n",val,str); getchar(); getchar();}

Тут вводится целое число в десятичном виде, затем это число печатается в десятичной и двоичной записи.

Затем введенное число умножается на два обычным умножением и печатается в десятичной и двоичной записи.

Затем полученное число снова умножается на два, на этот раз сдвигом на один разряд влево его машинного представления, и снова печатается в десятичной и двоичной записи.

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

printf("%s","decimal number? "); scanf("%ld",&val);

надо заменить на строку

printf("%s","binary number? "); scanf("%s",str); val=strtol(str,&end_ptr,r);

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Процессор с любыми данными работает как с двоичными. Но в С\С++ не предусмотрено прямой ввод\вывод двоичных чисел. Поетому для ввода\вывода лучше воспользоваться масивом символов или строкой... Конечно, можно и самому написать преобразование с int в char[33], но лучше воспользоватся функцыей стандартной библиотеки:

#include<stdlib.h>

char *_itoa(int value, char *str, int radix );

Parameters

value

Number to be converted.

str

String result.

radix

Base of value; which must be in the range 2–36.

где radix = 2 для двоичного представления целого числа;

radix = 8 для восьмеричного... и т.д.

Ссылка на комментарий
Поделиться на другие сайты

Немножко опоздал :)

Но для временного хранения двоичного представления целого числа на 32разраядной машыне нужна строка из 33 символов. 33-й символ указывает на конец строки.

Ссылка на комментарий
Поделиться на другие сайты

У меня вопрос:

Что значит const в конце обявления функции?

Например:

bool empty() const;

На сколько помню, это константная функция, т.е. не имеющая возможности изменять данные...

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Приветствую всех!

Подскажите пожалуйста, как работать в c\c++ с двичными числами ?

К примеру: ввожу десятичное число, раскидываю его в двоичное представление, умножаю на 2,

вывожу двоичный и десятичные результат результат на экран...

Если еще актуально, вот что я вычитал:

В стандартной библиотеке С++ есть шаблон контейнера bitset<n> где n - количество бит для хранения в доном объекте.

Для етого класса (шаблона) определены функции ввода, вивода (<< >>), ToLong(), ToString(), предусмотрена иницыализация объекта целим числом, строкой типа "00110011", и множество других полезных функцый для управления и проверки одельного бита последовательности.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Приветствую всех!

Как известно, принцип инкапсуляции основан на сокрытии членов класса от доступа извне класса.

Допустим, имеется следующий класс строк:

class cString{private:int n;int *pString;public:cString(); cString(const cString &);cString(int);~cString();void writeStr(); void printStr();void invertStr(); cString operator++();cString operator++(int);cString Add(cString, cString);int getn() {return n;}};

Тогда мы не может обратиться к переменной pString, используя точечный оператор.

Для обращения же необходима "publi-чная" функция.

Но если взять конструктор копировщик этого класса:

cString::cString(const cString &rhs){n=rhs.n;pString = new int [n];for(int i=0; i<n; i++) 	pString[i]=rhs.pString[i];}

То видно, что конструктор обращается к переменным n и pString создаваемого объекта.

Но после, в цикле, идет обращения к переменным через точечный оператор.

pString[i]=rhs.pString[i];

Разве этому не должна препятствовать приватность переменной pString ?

Ведь слева от точечного оператора располагается ссылка

на передаваемый объект, т.е. rhs - это объект класса cString, а справа закрытая переменная...

Ссылка на комментарий
Поделиться на другие сайты

Спецификаторы доступа private/protected/public управляют видимостью елементов класса.

Тоесть:

- К елементам private можно обращатся только из класса в котором они описаны. Из вне доступ запрещен.

- К protected можно обращатся из класса в котором они описаны и из дочерних от него классов.

- К полям public можно обращатся откуда угодно.

Тоесть все функции объявленние внутри одного класса, всегда имеют полный доступ ко всем полям етого же класса, в не зависимости от спецификатора.

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

Но, если какую-либо функцию обьявить за пределами класса - она уже не будет иметь доступа к приватным и защищенным полям.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Нужно написать программу, что-то типа IP калькулятора, желательно в консольном исполнении...

Пользователь вводит IP, и получает определенные данные.

Каким образом можно представить IP адрес, как и где его сохранить ?

Можно было бы сохранить в массиве int, но разделательные точки не подходят под этот тип...

Ссылка на комментарий
Поделиться на другие сайты

Архимаг:

Напрашивается ввод в виде строки. Потом можно или и дальше работать с адресами как со строками, все равно ведь с IP никаких арифметических операций делать не надо, или переделать весь адрес в четырехбайтное беззнаковое число, разделив строку на четыре части по точкам и записав каждый октет IP в виде числа в соответствующий байт четырехбайтового числа. На C (C++) это делать особенно просто, поскольку работа с машинным представлением чисел была любимым занятием создателей C и они сделали вещи вроде union или битовых полей. При любой обработке входной строки с IP надо только учесть, что октеты IP могут быть при вводе записаны и в одно- или двузначном виде, например 128.10.2.30.

P.S. Впрочем, перевести входную цифровую строку с точками-разделителями сразу в четыре числа может и стандартная функция ввода scanf (используя ввод по образцу).

Вот пример:

#include<stdio.h>main(){union {unsigned char a[4]; unsigned long e;};scanf("%i.%i.%i.%i",&a[0],&a[1],&a[2],&a[3]); printf("%4u%4u%4u%4u\n%u\n",a[0],a[1],a[2],a[3],e); getchar(); getchar(); }

Тут я сразу и заменяю четыре введенных однобайтовых числа на единое четырехбайтное с помощью безымянного union, у меня в Dev-C++ это работает, но некоторые компиляторы требуют, чтобы union обязательно имел упоминаемое в дальнейшем имя, это несколько удлинит текст.

На всякий случай - цифры этого четырехбайтового числа при его обычном выводе не будут выглядеть как исходный адрес, для печати по октетам надо использовать снова элементы массива байтов a.

Да и длина long зависит от конкретного компилятора, long может быть и не четырехбайтовым. Текст программы на C++ зависит от компилятора (не зря изобретатель C++ Страуструп был против стандартизации языка), и хотя в нем есть средства, позволяющие программисту учитывать эту зависимость и писать не зависящие от компилятора программы, однако это делается ценой заметного удлинения исходного текста.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Записал IP и маску в два массива: каждому октету соответствует элемент массива.

Далее, нужно было определить адрес сети. Для этого я применил операцию побитовое или.

А вот с помощью какой операции теперь выделить широковещательный адрес, т.е. в адресе сети придать значения 1 тем битам, которые в маске равны 0.

Надеюсь понятно изложил :)

Ссылка на комментарий
Поделиться на другие сайты

Архимаг:

Хоть с массивами, хоть с четырехбайтовыми числами нужная операция ~m|a, где m - маска, а - адрес.

Для массивов, например, так:

#include<iostream.h>main(){unsigned char i,a[4]={192,168,0,0},m[4]={255,255,255,0},r[4]; for(i=0;i<4;i++){r[i]=~m[i]|a[i]; cout<<'.'<<(int)r[i];} getchar();}
Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Архимаг:

Хоть с массивами, хоть с четырехбайтовыми числами нужная операция ~m|a, где m - маска, а - адрес.

Для массивов, например, так:

#include<iostream.h>main(){unsigned char i,a[4]={192,168,0,0},m[4]={255,255,255,0},r[4]; for(i=0;i<4;i++){r[i]=~m[i]|a[i]; cout<<'.'<<(int)r[i];} getchar();}

Скажите пожалуйста, а почему вы записываете октеты адреса в переменную типо char ?

Ссылка на комментарий
Поделиться на другие сайты

Архимаг:

Не char, а unsigned char (!) - потом поясню подробнее. А ответ на вопрос такой - потому что размер unsigned char - один байт - как раз подходит для октета. Больше - бессмысленная потеря памяти. Кроме того, так у меня остается возможность при желании упаковать весь адрес в одно четырехбайтовое целое, что упростит хранение адресов и в четыре раза ускорит их обработку.

Насчет замечания о char и unsigned char. Попробуй убери из текста программы слово unsigned - и программа в большинстве реализаций C++ (но не во всех!) перестанет работать.

Дело в том, что в C++ теоретически существует три разных типа данных длиной в один байт - char (байты, трактуемые как символы), signed char (байты, трактуемые как числа со знаком) и unsigned char (байты, трактуемые как числа без знака). Хотя обычно и данные типа bool тоже имеют длину в один байт, но это может зависеть от реализации. Такие странные обозначения коротких целых чисел (char - сокращение от character, то есть "символ") сложились исторически. Хуже того, в C считалось, что типа два: char - это или signed char, или unsigned char, в зависимости от реализации языка (чаще signed, потому что программисты были американцами и неприятности со второй половиной таблицы символов ASCII их не беспокоили - английский язык вместе с цифрами и знаками препинания сидит в первой половине таблицы), поэтому эта путаница перешла и во многие реализации C++, и я для надежности явно преобразую unsigned char к наверняка целому типу int, чтобы cout наверняка понял, с чем имеет дело (в C обошлось бы без этого, функция printf все равно понятия не имеет, что печатает, она в типах данных вообще не разбирается, ей надо явно указывать формат).

Вообще С и C++ насквозь пронизаны разными трюками, к тому же зависящими от реализации - это языки "настоящих программистов", писавшиеся ими для себя самих, и у меня такое впечатление, что их разработчики гордились тем, что эти языки малопонятны простым смертным, а в умелых руках позволяют творить труднопонимаемые чудеса.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Каким образом можно работать напрямую с битами числа. Т.е. мне надо определить сколько подсетей будет при нестандартной маске.

Когда используется стандартная маска для класса, то тут одна подсеть и получить ее адрес легко с помощью операции &.

Если же для класса B используется маска 255.255.255.192. То как подсчитать, что 8 бит из третьего октета и 2 бита из четвертого являются идентификатором подсети ?

Проблема в том, что я не не работал на уровне представления чисел в двоичном виде, и поэтому тяжело ориентируюсь...

Ссылка на комментарий
Поделиться на другие сайты

т.е. по сути нужно что сделать:

есть две переменные типа unsigned char (a,b). Как определить количество разрядов, которые равны 1 в этих двух переменных ?

Ссылка на комментарий
Поделиться на другие сайты

Как увидеть, сколько бит используется в том или другом десятичном числе - это просто надо поработать с двоичными числами, такие вещи становятся очевидны. Надо просто запомнить степени двух: 1-1, 2-10, 4-100, 8-1000, 16-1 0000, 32-10 0000, 64-100 0000, 128-1000 0000. Так что, глядя на 192, думаешь, так, 128 тут есть, так что последний бит - единица, следующий бит 64, а у нас осталось 192-128=64 - как раз 64! Попали в точку - этот бит тоже есть, а остальные - нули.

А если с непривычки будет трудно посчитать, например, какие биты установлены в единицу в числе 192 - в Windows есть встроенный калькулятор, он отлично переводит числа из и в двоичную, восьмеричную, десятичную и шестнадцатиричную системы.

А вообще в C и C++ числа можно обозначать не только в десятичной, но и в восьмеричной или шестнадцатеричной системах, есть и битовые поля, позволяющие каждому биту в числе дать свое собственное имя. Так что напрямую с битами легко работать, пользуясь восьмеричной или шестнадцатиричной системами, у них каждая цифра числа - ровно три или четыре двоичных цифры (бита). Когда создавался C, программисты десятичными числами пользовались в исключительных случаях :) А если приходилось много возиться с десятичными числами, например, в бухгалтерских программах, то использовалась специальная двоично-десятичная система, чтобы обойтись без переводов двоичных чисел в почему-то полюбившуюся бухгалтерам :) десятичную систему, от этого времени в процессорах Intel и AMD остались практически неиспользуемые сейчас команды работы с двоично-десятичной кодировкой чисел.

есть две переменные типа unsigned char (a,b). Как определить количество разрядов, которые равны 1 в этих двух переменных ?
Это уже вопрос не как самому увидеть, а как дать компьютеру посчитать. Ну, например, так:
#include<iostream.h>main(){unsigned char a,n; int b; cin>>b; a=b;n=0;while(a){n++;a&=a-1;}cout<<(int)n; getchar();getchar();}

Тут считается количество единичных битов в переменной a. Считает, собственно, предпоследняя строка, сверху и снизу - выкрутасы для ввода-вывода unsigned char, так как речь шла об этом типе, а cin и cout для типа unsigned char стандартно не перегружены. Хотя считается точно так же и для многобайтовых чисел. А для двух переменных можно посчитать для каждой и просуммировать или же объединить обе в одно двухбайтовое число.

Ссылка на комментарий
Поделиться на другие сайты

Вроде что-то написал, вроде даже работает :(

Пока добился только того, чтобы подсчитать по IP и маске, сколько подсетей и сколько хостов в каждой подсети.

Широковещательный адрес тоже определяет.

Теперь не могу последнее придумать: как организовать вывод в виде:

номер подсети, начальные хост-конечный хост, адрес подсети, широковещательный адрес подсети....

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу



×
×
  • Создать...