Задачка на C++, ПОМОГИТЕ ПОЖАЛУЙСТА НЕДОПРОГРАММИСТУ
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Если рассказывать нужно с самого начала, то я, пожалуй, просто не влезу в ограничение на количество символов в одном сообщении. Да и писать мне придётся, три дня и три ночи. Это бесполезная трата моего времени. Вероятно, вам проще всего (да и правильнее) будет взять любую книжку по С++, не обязательно даже Страуструпа, печатным вариантом которого легко убить, можно что-то банальное, типа "Как программировать на С++" и прочитать это. Займёт пару дней. После того, как вы перестанете плавать в основах, мы сможем продуктивно пообщаться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Вот программа какая получилась, что то еще не правильно?
Код: Выделить всё
#include <cstdlib>
#include <iostream>
#include <Windows.h>
using namespace std;
class String
{
private:
char* str;
int n;
public:
String(char* string = "")
{
n = strlen(string);
str = new char[n + 1];
strcpy(str, string);
}
String(char* string, size_t size) //конструктор, позволяющий создать строку из size символов
{
n = size;
str = new char[n + 1];
strncpy(str, string, n);
if (strlen(string) > size)
str[n] = '\0';
}
~String()
{
if (str)
delete [] str;
}
void print()
{
std::cout << str << std::endl;
}
int const getnum() //кол-во символов в строке
{
return n;
}
char const getchar(int n) // символ из позиции n
{
return str[n - 1];
}
void upper() // в верхний регистр
{
for (int i = 0; i < n; i++)
str[i] = toupper((unsigned char)str[i]);
}
int const punctuation() // кол-во знаков препинания
{
int count = 0;
for (int i = 0; i < n; i++)
if (ispunct((unsigned char)str[i]))
count++;
return count;
}
};
int main()
{
setlocale(0, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char s[255];
std::cin.getline(s, 255);
String str(s);
str.upper();
str.print();
std::cout << str.getnum() << std::endl;
std::cout << str.punctuation() << std::endl;
std::cout << str.getchar(1) << std::endl;
String str2(s, 3);
str2.upper();
str2.print();
std::cout << str2.getnum() << std::endl;
std::cout << str2.punctuation() << std::endl;
std::cout << str2.getchar(1) << std::endl;
system("PAUSE");
return 0;
}
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Уже лучше.
Не понятны только выражения "char const" и "inst const" в двух методах. Вероятно, const хотели поставить после имени метода, чтобы сделать метод константным, но втулили не туда. Оно, конечно, компилируется, но работает не так, как ожидается. Неправильность работы не видна за счёт того, что в программе нигде не создаётся константный объект типа Str.
Мария, я ожидаю вопрос не типа "Что тут не так". Что тут не так, вы сами должны знать, если запускали программу. Я ожидаю вопросы такого типа: "Хочу, чтобы работало вот так, а работет иначе. Как исправить?" Вы, наверное, не поверите, если я скажу, что у меня нет под рукой компилятора, так что я не могу проверить работоспобность вашей программы и не могу сказать, "что тут ещё не так".
Не понятны только выражения "char const" и "inst const" в двух методах. Вероятно, const хотели поставить после имени метода, чтобы сделать метод константным, но втулили не туда. Оно, конечно, компилируется, но работает не так, как ожидается. Неправильность работы не видна за счёт того, что в программе нигде не создаётся константный объект типа Str.
Мария, я ожидаю вопрос не типа "Что тут не так". Что тут не так, вы сами должны знать, если запускали программу. Я ожидаю вопросы такого типа: "Хочу, чтобы работало вот так, а работет иначе. Как исправить?" Вы, наверное, не поверите, если я скажу, что у меня нет под рукой компилятора, так что я не могу проверить работоспобность вашей программы и не могу сказать, "что тут ещё не так".
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Перечитал внимательно задание и сравнил с кодом. Не работает самое последнее требование. Свойство getchar на данный момент позволяет только вернуть символ (то есть чтение), но никак не записать его. Для того, чтобы можно было записывать в тот символ, который мы вернули, символ нужно возвращать не по значению, а по ссылке. После этого в главной программе можно будет написать следующую строчку кода (и она будет работать):
Код: Выделить всё
str.getchar(1) = 'R';
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Romeo писал(а):Перечитал внимательно задание и сравнил с кодом. Не работает самое последнее требование. Свойство getchar на данный момент позволяет только вернуть символ (то есть чтение), но никак не записать его. Для того, чтобы можно было записывать в тот символ, который мы вернули, символ нужно возвращать не по значению, а по ссылке. После этого в главной программе можно будет написать следующую строчку кода (и она будет работать):Код: Выделить всё
str.getchar(1) = 'R';
У меня получилось вот так, а должно так выводиться первая R??
Код: Выделить всё
#include <cstdlib>
#include <iostream>
#include <Windows.h>
using namespace std;
class String
{
private:
char* str;
int n;
public:
String(char* string = "")
{
n = strlen(string);
str = new char[n + 1];
strcpy(str, string);
}
String(char* string, size_t size) //конструктор, позволяющий создать строку из size символов
{
n = size;
str = new char[n + 1];
strncpy(str, string, n);
if (strlen(string) > size)
str[n] = '\0';
}
~String()
{
if (str)
delete [] str;
}
void print()
{
std::cout << str << std::endl;
}
int const getnum() //кол-во символов в строке
{
return n;
}
char& getchar(int n) // символ из позиции n
{
return str[n - 1];
}
void upper() // в верхний регистр
{
for (int i = 0; i < n; i++)
str[i] = toupper((unsigned char)str[i]);
}
const int punctuation() // кол-во знаков препинания
{
int count = 0;
for (int i = 0; i < n; i++)
if (ispunct((unsigned char)str[i]))
count++;
return count;
}
};
int main()
{
setlocale(0, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char s[255];
std::cin.getline(s, 255);
String str(s);
str.getchar(1) = 'R';
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
- Откуда: Крым, Севастополь
- Контактная информация:
Похоже на правду, осталось только вот тут
const переместить и поставить после имени метода и после скобок (так, чтобы он в конце строки оказался).
И в punctuation то же самое. Const должен быть в конце, что делает метод константным.
Код: Выделить всё
int const getnum() //кол-во символов в строке
И в punctuation то же самое. Const должен быть в конце, что делает метод константным.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
[ATTACH]1838[/ATTACH]
Надеюсь я правильно всё поняла?Только не поняла почему R выводится
Код: Выделить всё
#include <cstdlib>
#include <iostream>
#include <Windows.h>
using namespace std;
class String
{
private:
char* str;
int n;
public:
String(char* string = "")
{
n = strlen(string);
str = new char[n + 1];
strcpy(str, string);
}
String(char* string, size_t size) //êîíñòðóêòîð, ïîçâîëÿþùèé ñîçäàòü ñòðîêó èç size ñèìâîëîâ
{
n = size;
str = new char[n + 1];
strncpy(str, string, n);
if (strlen(string) > size)
str[n] = '\0';
}
~String()
{
if (str)
delete [] str;
}
void print()
{
std::cout << str << std::endl;
}
int getnum()const //êîë-âî ñèìâîëîâ â ñòðîêå
{
return n;
}
char& getchar(int n) // ñèìâîë èç ïîçèöèè n
{
return str[n - 1];
}
void upper() // â âåðõíèé ðåãèñòð
{
for (int i = 0; i < n; i++)
str[i] = toupper((unsigned char)str[i]);
}
int punctuation() const // êîë-âî çíàêîâ ïðåïèíàíèÿ
{
int count = 0;
for (int i = 0; i < n; i++)
if (ispunct((unsigned char)str[i]))
count++;
return count;
}
};
int main()
{
setlocale(0, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char s[255];
std::cin.getline(s, 255);
String str(s);
str.upper();
str.print();
str.getchar(1) = 'R';
std::cout << str.getnum() << std::endl;
std::cout << str.punctuation() << std::endl;
std::cout << str.getchar(1) << std::endl;
system("PAUSE");
return 0;
}
Чтобы вставляемые комментарии были на русском языке, нужно перед копированием в буфер обмена переключить раскладку на "русскую"
It's a long way to the top if you wanna rock'n'roll
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Да, теперь всё правильно. А R выводиться потому, что мы её присвоили вот в этой строке.
Это была проверка записываемости свойства, если выражаться в той терминологии, которой придерживается преподаватель.
Но, как и в соседней теме, я заявлю, что никаких свойств в C++ нету. Не нужно путать C++ и C#.
Код: Выделить всё
str.getchar(1) = 'R';
Но, как и в соседней теме, я заявлю, что никаких свойств в C++ нету. Не нужно путать C++ и C#.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.