Задачка на C++, ПОМОГИТЕ ПОЖАЛУЙСТА НЕДОПРОГРАММИСТУ

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

9. Создать класс для работы сo строками. Разработать элементы класса:
a. Поля:
• * указатель на char - хранит адрес динамически выделенной памяти;
• int n.
b. Конструктор, позволяющий создать строку из n символов.
c. Методы, позволяющие:
• подсчитать количество знаков препинания в строке;
• заменить в строке все строчные символы на прописные;
• прочитать символ из заданной позиции.
d. Свойства:
• возвращающее общее количество элементов в строке (доступное только для чтения);
• позволяющее установить значение поля, в соответствии с введенным значением строки с клавиатуры, а также получить значение данного поля (доступно для чтения и записи).

Код: Выделить всё

class String
{
public:
	String(char* string = "")
	{
		n = strlen(string) + 1;
		str = new char[n];
		memcpy(str, string, n);
	}

	String(char* string, size_t size) // конструктор, позволяющий создать строку из size символов
	{
		n = size + 1;
		str = new char[n];		
		memcpy(str, string, n * sizeof(char));
		str[size] = 0;
	}

	~String()
	{
		if (str)
			delete str;
	}

	void print()
	{
		std::cout << str << std::endl;
	}

	int const getnum() // кол-во символов в строке
	{
		return n - 1;
	}

	char const getchar(int n) // символ из позиции n
	{
		return str[n - 1];
	}

	void upper() // в верхний регистр
	{
		for (int i = 0; i < n; i++)
			str[i] = toupper(str[i]);
	}

	int const punctuation() // кол-во знаков препинания
	{
		int count = 0;

		for (int i = 0; i < n + 1; i++)
			if (ispunct(str[i]))
				count++;

		return count;
	}

private:
	char* str;
	int n; 
};


int _tmain(int argc, _TCHAR* argv[])
{
	String str("linkin park");

	str.upper();
	str.print();

	std::cout << str.getnum() << std::endl;
	std::cout << str.punctuation() << std::endl;
	std::cout << str.getchar(1) << std::endl;

	system("PAUSE");
	return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Задание есть, код тоже есть. Вот только вопроса нету. Что именно не так или что хочется сделать?

Одним глазом посмотрел код. В конструкторе, который принимает укатель на char, не проставляется терминирующий ноль. Во втором конструкторе, терминирующий ноль проставляется в неправильно место (должен проставляться в n-й символ).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

здесь нужно сделать всё как в задании, редактируйте пожалуйста что не правильно
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Моя задача, чтобы вы сами разобрались в программе. Так что я буду не редактироваться, я буду лишь подсказывать.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

После редактирования вышла вот такая программа, она работает, но всё ли в ней соответствует заданию???

Код: Выделить всё

#include <cstdlib>
#include <iostream>

using namespace std;

class String
{
public:
	String(char* string = "")
	{
		n = strlen(string) + 1;
		str = new char[n];
		memcpy(str, string, n);
	}

	String(char* string, size_t size)  //êîíñòðóêòîð, ïîçâîëÿþùèé ñîçäàòü ñòðîêó èç size ñèìâîëîâ
	{
		n = size + 1;
		str = new char[n];		
		memcpy(str, string, n * sizeof(char));
		str[size] = 0;
	}

	~String()
	{
		if (str)
			delete str;
	}

	void print()
	{
		std::cout << str << std::endl;
	}

	int const getnum() //êîë-âî ñèìâîëîâ â ñòðîêå
	{
		return n - 1;
	}

	char const getchar(int n) // ñèìâîë èç ïîçèöèè n
	{
		return str[n - 1];
	}

	void upper()  // â âåðõíèé ðåãèñòð
	{
		for (int i = 0; i < n; i++)
			str[i] = toupper(str[i]);
	}

	int const punctuation() // êîë-âî çíàêîâ ïðåïèíàíèÿ
	{
 int count = 0;
 for (int i = 0; i < n; i++)
 if (ispunct(str[i]))
    count++;
    return count;
	}

private:
	char* str;
	int n; 
};


int main()
{
	String str("I!love!!!Programmirovanie!");

	str.upper();
	str.print();

	std::cout << str.getnum() << std::endl;
	std::cout << str.punctuation() << std::endl;
	std::cout << str.getchar(1) << std::endl;

	system("PAUSE");
	return 0;
}
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

Romeo писал(а):Моя задача, чтобы вы сами разобрались в программе. Так что я буду не редактироваться, я буду лишь подсказывать.

Если Вы поможете мне разобраться в программе, будет очень здорово, так как мне еще экзамен сдавать :(
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Мария1501 писал(а):После редактирования вышла вот такая программа, она работает, но всё ли в ней соответствует заданию???
Мария, вы меня зарезали без ножа. Вы взяли программу однокурсника, который слушает Linkin Park, написали в тестрируемой строке "I!love!!!Programmirovanie!", также изменили табуляцию в одном из методов, и теперь хотите сдать эту программу, выдав за свою? На самом деле я ожидал, что вы исправите ошибку, на которую я указал ранее, а не убьёте остатки моей мотивации транслитерированным словом "Programmirovanie". Вы меня извините, но я в этой теме больше ничего писать не буду.

И кстати, то, что у вас экзамен, не освобождает вас от необходимости учиться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

Romeo писал(а):Мария, вы меня зарезали без ножа. Вы взяли программу однокурсника, который слушает Linkin Park, написали в тестрируемой строке "I!love!!!Programmirovanie!", также изменили табуляцию в одном из методов, и теперь хотите сдать эту программу, выдав за свою? На самом деле я ожидал, что вы исправите ошибку, на которую я указал ранее, а не убьёте остатки моей мотивации транслитерированным словом "Programmirovanie". Вы меня извините, но я в этой теме больше ничего писать не буду.

И кстати, то, что у вас экзамен, не освобождает вас от необходимости учиться.
я не брала программу однокурсника, эту программу мне помогли составить другие люди, "I!love!!!Programmirovanie!" я написала уже в ходе компиляции, чтобы посмотреть как ведет себя программа, а то, что вы указали исправить я просто напросто не знаю, так как я не программист и не собираюсь им становится, не обязательно так эмоционально реагировать, я не выдаю себя за гения программирования, я учусь, я перерыла уже кучу литературы, но для меня это всё как на китайском языке, так что извините, я выкручиваюсь как могу, чтобы сделать то что требуют.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Извиняюсь за эмоции. Если вы готовы разбирать, то я окажу всяческую помощь. Просто я не знаю, откуда начать. Что такое класс, его конструктор и деструтор нужно объяснять? Или ещё раньше начать? Что такое переменная? Или наоборот всё понятно с классами, но не понятно, что такое терминирующий ноль?

Оценю конретные вопросы, на которые я с удовольствием отвечу.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Мария1501
Сообщения: 10
Зарегистрирован: 26 ноя 2013, 19:51

Romeo писал(а):Извиняюсь за эмоции. Если вы готовы разбирать, то я окажу всяческую помощь. Просто я не знаю, откуда начать. Что такое класс, его конструктор и деструтор нужно объяснять? Или ещё раньше начать? Что такое переменная? Или наоборот всё понятно с классами, но не понятно, что такое терминирующий ноль?

Оценю конретные вопросы, на которые я с удовольствием отвечу.

Если можно с самого начала, потому что у нас супер система обучения, где не объясняя практически ничего толком требуют сразу выполнения лабораторных работ, следовательно если я не знаю элементарных понятий об этом языке не знаю как составлять программы, мне бы понять как последовательно должна выглядеть программа, что как называется, понятие класс конструктор деструктор я вроде как поняла, а как они применяются нет
И конкретно этой задачи да, что такое терминирующий ноль, где его писать, и где во втором констукторе
Ответить