Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Вопросы о целочисленных переменных и о сим.массиве


Автор: goodwen053 5.4.2011, 19:15
Здравствуйте, я новичок в С++, у меня есть 3 вопроса:

1. Как задать условие: если введено не число?

2. Есть трёхзначное число типа int, как мне сложить все его цифры?

3. Нужно ввести текст, он может быть разной длины, как сделать так, чтобы размер символьного одномерного массива куда заносится текст автоматически принял нужную размерность? И как  с определённого элемента в одномерном символьном массиве сдвинуть вправо все остальные элементы, при этом так же увеличивая его размерность?

Автор: alexvs11 5.4.2011, 19:22
Цитата(goodwen053 @  5.4.2011,  19:15 Найти цитируемый пост)
1. Как задать условие: если введено не число?

в консоли сделать
if( 1 != scanf( "%d", ..
или 
int a;
if( (cin >> a).fail() )

 

Автор: Vard 5.4.2011, 19:39
Цитата(goodwen053 @ 5.4.2011,  19:15)
2. Есть трёхзначное число типа int, как мне сложить все его цифры?

3. Нужно ввести текст, он может быть разной длины, как сделать так, чтобы размер символьного одномерного массива куда заносится текст автоматически принял нужную размерность? И как  с определённого элемента в одномерном символьном массиве сдвинуть вправо все остальные элементы, при этом так же увеличивая его размерность?

2. Воспользоваться операцией получения остатка от деления и целочисленным делением

Код

int num = 387;
int a, b, c;
int result;
 
a = num / 100;               // a = 3;
b = (num % 100) / 10;         // b = 8
c =  ((num % 100) % 10) ;     // c = 7;

result = a + b + c;


3. Я думаю, тут необходимо динамическое выделение памяти (malloc и free либо new, delete)

Автор: goodwen053 5.4.2011, 21:50
alexvs11, благодарю за помощь, всё заработало.

Vard, так же благодарю за помощь, со вторым вопросом, у меня всё получилось, но я не совсем понимаю вот эту запись:

Код

b = (number % 100) / 10;
c = ((number % 100) % 10) ;

Что здесь обозначает знак "%"?




Автор: mes 5.4.2011, 23:17
Цитата(goodwen053 @  5.4.2011,  20:50 Найти цитируемый пост)
обозначает знак "%"

остаток от деления.. 

Автор: volatile 6.4.2011, 01:00
кардинальное решение 2-го вопроса  smile 
Код

unsigned int sum_digits(unsigned int v)
{
   unsigned int res = 0;
   while (v)
   {
      res += v % 10;
      v /= 10;
   }
   return res;
}

Автор: mes 6.4.2011, 08:04
Цитата(volatile @  6.4.2011,  00:00 Найти цитируемый пост)
 while (v)
   {
      res += v % 10;
      v /= 10;
   }
   

или:
итерацию по v также вынести в оглавление цикла :
Код

for (; v; v/=10)
 res+= v%10;

 smile 

Автор: goodwen053 6.4.2011, 21:11
Благодарю за помощь, всё понял. А как быть с 3-вопросом? Я, как понимаю, нужно через указатели, а как увеличивать размерность символьного массива? Может для 3-вопроса есть какие либо функции по работе со строками?

Автор: baldina 7.4.2011, 17:51
Цитата(goodwen053 @  5.4.2011,  19:15 Найти цитируемый пост)
Нужно ввести текст, он может быть разной длины, как сделать так, чтобы размер символьного одномерного массива куда заносится текст автоматически принял нужную размерность? И как  с определённого элемента в одномерном символьном массиве сдвинуть вправо все остальные элементы, при этом так же увеличивая его размерность? 

Цитата(goodwen053 @  6.4.2011,  21:11 Найти цитируемый пост)
 Может для 3-вопроса есть какие либо функции по работе со строками? 

в С++ есть std::string
Код

// ввести строку. string сам заботится о распределении памяти
std::string s;
std::cin >> s;

// вставить символ 'A' в позиции 3
s.insert (3, 'A');

// получить С-строку в виде указателя
const char *ptr = s.c_str ();
// получить длину строки
size_t len = s.size ();

Автор: mes 7.4.2011, 17:55
Цитата(baldina @  7.4.2011,  16:51 Найти цитируемый пост)
// получить С-строку в виде указателя
char *ptr = s.c_str ();

http://cplusplus.com/reference/string/string/c_str/
a const ? smile 

Автор: goodwen053 7.4.2011, 19:44
Код

// ввести строку. string сам заботится о распределении памяти
std::string s;
std::cin >> s;


Я вот если так пишу, и уже в консоли набираю какой либо текст с пробелами, то он запоминает только до первого пробела. Я пытаюсь сделать вот так:
Код

std::string text;
std::cin.getline(text,sizeof(text));

Выдаёт ошибку: [C++ Error] Unit1.cpp(16): E2285 Could not find a match for 'istream::getline(string,unsigned int)' и ссылается на вторую строку.

А когда пишу вот эту строку в коде:
Код

text.insert (3, 'A');


Выдаёт ошибку ссылаясь на эту строку в коде:[C++ Error] Unit1.cpp(19): E2285 Could not find a match for 'string::insert(int,char)'
Как мне исправить эти ошибки?Компилятор у меня С++ Builder Borland 6.

И не совсем понимаю вот эту строку:
Код

// получить длину строки
size_t len = s.size ();

Здесь переменная, где записана длина строки - это len, или  size_t?

Автор: mes 7.4.2011, 21:12
site_t - тип ( аффикс _t  даже пытается подсказать smile )

Автор: baldina 9.4.2011, 15:27
Цитата(mes @  7.4.2011,  17:55 Найти цитируемый пост)
a const ?

 smile 

Автор: goodwen053 10.4.2011, 18:57
На счёт третьего вопроса я часть сделал (код ниже), но у меня задание, ввести текст (предложения заканчивающиеся точками) и если по ошибке после точки не был введён пробел, сдвинуть всё содержимое и поставить после точки этот пробел. Делаю, как показано ниже на коде и ничего не работает. Если ввожу текст на русском языке, он вообще ничего не выводит (должен вывести изменённый текст), а если на английском, тогда кучу символов беспорядочных, как мне это исправить?
Код

char text[100];//объявлен символьный массив для хранения текста

fgets(text,100,stdin);//ввод строки позволяет указать размер буфера
int length=strlen(text);//определить длину строки (все введёные символы + \0)

for(int i=0;i<length;i++){//цикл от 0 до length - длина строки

         if(text[i]='.' && text[i+1]!=' '){//если символ "." и следующий не пробел

                  text[i+1]=' ';
         }
}

printf("%s", text);

Автор: volatile 10.4.2011, 19:31
Цитата(goodwen053 @  10.4.2011,  18:57 Найти цитируемый пост)
 if(text[i]='.' 

это присвоение, а не проверка.
нужно if(text[i]=='.' 

дальше,
Цитата(goodwen053 @  10.4.2011,  18:57 Найти цитируемый пост)
   text[i+1]=' ';

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

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

Автор: goodwen053 10.4.2011, 22:04
Вот я использую в том же коде внутри if строчку:
Код

text.insert(i+1, symbol);

Компилятор постоянно выдаёт ошибку [C++ Error] Unit1.cpp(23): E2294 Structure required on left side of . or .*

Вот почему это так?

Автор: volatile 11.4.2011, 00:47
Цитата(goodwen053 @  10.4.2011,  18:57 Найти цитируемый пост)
у меня задание, ввести текст (предложения заканчивающиеся точками) и если по ошибке после точки не был введён пробел, сдвинуть всё содержимое и поставить после точки этот пробел. 

goodwen053, Не могу больше смотреть как вы мучаетесь, ловите smile 
Код

#include <iostream>
#include <string>

int main()
{ 
   char buf [100];
   std::cin.getline(buf, sizeof(buf));
   std::string str;
   str.reserve(sizeof(buf));
   for (const char * p = buf; *p; ++p )
   {
      str += *p;
      if( *p == '.' && p[1] != ' ')
         str += ' ';
   }
   std::cout << str;
   return 0;
}

Автор: goodwen053 13.4.2011, 18:28
volatile, благодарю)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)