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

Помогите с 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 и маске, сколько подсетей и сколько хостов в каждой подсети.

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

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

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

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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

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

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



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