Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
#1

Правильно ли я понимаю работу этого кода? - C++

24.06.2012, 19:15. Просмотров 543. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cctype>
using namespace std;
 
int main ()
{   
    char str1[80] = "Enter first string";
    char str2[80] = "Enter second string";
    char *p1, *p2;
 
    cout << "Enter first string: ";
    cin >> str1;
 
    cout << "Enter second string: ";
    cin >> str2;
 
    p1 = str1;
    p2 = str2;
 
while(*p1 && *p2) {
        if(tolower(*p1) != tolower(*p2)) break;
        else {
            p1++;
            p2++;
        }
    }
 
    if(!*p1 && !*p2)
        cout << "Strings are the same except for "
             << "possible case differences.\n";
    else
        cout << "Strings differ\n";
 
    system("pause");
    return 0;
}
Для меня важно понимать каждую мелочь, по этому опишу полностью :

Подключается заголовок iostream, который ответственный за функционирование ввода/вывода в C++.
Подключается заголовок cctype, который обеспечивает работоспособность функции tolower.
Используется пространство имен std(обеспечивающие поддержку стандартных функций).

Вызов функции запускающей программу.
Объявляется строковой массив символьного типа с размерностью 80 и именем переменной str.
Объявляется строковой массив символьного типа с размерностью 80 и именем переменной str2.
Объявляются указатели символьного типа с именами переменных *p1 и *p2.

Выводится строковой литерал с помощью оператора вывода << и ключевого слова cout(ответственного за вывод данных в консоль).
Считываются введенные данные с клавиатуры и заносятся в переменную str1 c помощью оператора вывода >> и ключевого слова cin(ответственного за считывание введенных данных с клавиатуры).

Выводится строковой литерал с помощью оператора вывода << и ключевого слова cout(ответственного за вывод данных в консоль).
Считываются введенные данные с клавиатуры и заносятся в переменную str1 c помощью оператора вывода >> и ключевого слова cin.

Переменной p1 присваивается значение строкового массива str1.(не очень понимаю почему это считается обычной переменной,если объявлялось как переменная указатель)

Переменной p1 присваивается значение строкового массива str2.

Открывается while цикл с условием в заголовке,если указатель *p1 на переменную p1 и указатель *p2 на переменную p2, возвращают ненулевое значение,а точнее если в элементе под индексом 0 строкового массива str и строкового массива str2 есть какое либо значение, то выполнить блок кода цикла.

Если значение указателя *p1 перевести в строчные символы и оно не будет равно переведенным в строчные символы значения указателя *p2 , то выполнить инструкцию выхода из цикла.
Иначе инкрементировать переменную p1 и переменную p2, а точнее в их значении увеличить индекс массива на 1 (не совсем понимаю как str[0] за счет инкремента увеличивается в str[1],то есть str[0] + str[0] будет str[1], но почему индексы слаживаются при слаживании, если в p1 находится строковой массив и по сути должно слаживаться его значение,а не он сам и индекс елемента, ведь если вывести p1,то выводится все значение массива,а если смотреть со стороны инкремента, то в p1 находится не значение массива, а str[0]).

Если значение указателя на переменную p1 и переменную p2 не ноль,то вывести строковой литерал
Иначе вывести строковой литерал.(не понимаю как именно звучит и работает оператор ! в этом контексте и видимо я неправильно это описал).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2012, 19:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Правильно ли я понимаю работу этого кода? (C++):

Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. - C++
#pragma once namespace Casper { class Cat { private: unsigned int age; float weight;

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

Не понимаю что не правильно - C++
Задание : Даны целые числа a1, … ,an, k. Если в последовательности a1, … ,an нет ни одного члена со значением k, то все члены этой...

Не понимаю часть кода - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void main() { int i; int a; for (int i(0); i &lt; 10;...

не понимаю принцип работы кода - C++
Привет ! Помогите понять суть работы кода пожалуйста. for(i=1;i&lt;=10;sum+=i++); Как работает sum+=i++ НЕ ПОНИМАЮ ...

Правильно ли я понимаю значения аргумента в моем методе? - C++
Тип работаю с класами, задали дз сделать клас по примеру. В примере неясный один момент: void setID(char* id) { ID=id; } ...

10
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
24.06.2012, 19:45 #2
Цитата Сообщение от koder Посмотреть сообщение
Переменной p1 присваивается значение строкового массива str1
Имя массива можно использовать как указатель
Цитата Сообщение от koder Посмотреть сообщение
Открывается while цикл с условием в заголовке,если указатель *p1 на переменную p1 и указатель *p2 на переменную p2, возвращают ненулевое значение
в коде у тебя символы,на которые указывают каждый из указателей приводят к нижнему регистру и сравниваются друг с другом,если равны,то идём дальше,нет- не судьба и выходим из цикла
Цитата Сообщение от koder Посмотреть сообщение
не совсем понимаю как str[0] за счет инкремента увеличивается в str[1],то есть str[0] + str[0] будет str[1],
инкремент указателя-это переход на следующий элемент массива

Добавлено через 1 минуту
Цитата Сообщение от koder Посмотреть сообщение
if(!*p1 && !*p2)
все строки,записанные в массив char оканчиваются \0,поэтому проверяют значение,на которое указывает указатель,если конец какой-то строки,то прекращаем вывод строк
0
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
24.06.2012, 22:47  [ТС] #3
Цитата Сообщение от alexey31415 Посмотреть сообщение
все строки,записанные в массив char оканчиваются \0,поэтому проверяют значение,на которое указывает указатель,если конец какой-то строки,то прекращаем вывод строк
Я понимаю, что если в цикле все проходы будут равны, то в этой инструкции if(!*p1 && !*p2) у указателей *p1 и *p2 будет значение 0, то есть лож и функция не выполнится, для этого и стоит оператор ! (не). В итоге правильно ли я понимаю, что если в указатели попадают нулевые значение, то из за оператора ! они становятся ненулевыми и следовательно выражение истина, а если попадают ненулевые значения, то этот оператор делает из них нулевые?
0
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
24.06.2012, 23:07 #4
Оператор ! он логический обозначает не
допустим
C++
1
2
3
4
5
bool s = false;
while(!s)/*выполнять пока(s не равна true) */
{
cout << "Вечный цикл = on;"
}
если сделаем так :

C++
1
2
3
4
5
char cs[] = "Siski";/*как думаешь сколько он будит в длинну?не правельно! :) 5 потому что в конце строки всегда '\0' */
for (int i = 0; cs[i]; ++i) /*здесь в условие мы указали если cs[i] возратит false то цикл осанавливаем. */
cout << "сколько букв : " << i << endl
 /*Тут у нас покежт 4 буквы  */
/*а теперь если попробуем в cs[4] сделать,то компилятор выдаст ошибку что длинна масива мала..*/
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.06.2012, 23:13 #5
Цитата Сообщение от xADMIRALx Посмотреть сообщение
char cs[] = "Siski";/*как думаешь сколько он будит в длинну?не правельно! 5 потому что в конце строки всегда '\0' */
Может все-таки 6?

Цитата Сообщение от xADMIRALx Посмотреть сообщение
/*а теперь если попробуем в cs[4] сделать,то компилятор выдаст ошибку что длинна масива мала..*/
Да ладно
C++
1
2
3
4
5
6
int main()
{
    char str[] = "asd";
    str[9] = 'a';
    return 0;
}
Bash
1
2
3
4
5
6
g++ -c -Wall -O3 --std=gnu++11 test.cpp -o test.o
test.cpp: In function ‘int main()’:
test.cpp:3:10: warning: variable ‘str’ set but not used [-Wunused-but-set-variable]
g++ foo.o test.o -lm -o test
 
Press ENTER or type command to continue
0
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
24.06.2012, 23:23 #6
soon
Проверьте

pff точна 6
хм странно
если попробывать это в цикле то
C++
1
2
3
char str[] = "siski";
for (int i = 0; str[i] ; ++i)
cout << "i = " << i << endl
i = 4 то есть + 1 должно получиться 5...мхмхм,или я туплю или что то не туо
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.06.2012, 23:28 #7
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    char cs[] = "Siski";
    for (int i = 0; cs[i]; ++i)
        std::cout << "сколько букв : " << i << std::endl;
    std::cout << sizeof(cs) << std::endl;
    return 0;
}
С вас две минуты моего времени.

Добавлено через 49 секунд
Если вы до сих пор не видите, что в вашей строке 5 букв + \0, что в итоге дает 6 - это, наверное, уже не лечится.
1
ValeryS
Модератор
6674 / 5083 / 474
Регистрация: 14.02.2011
Сообщений: 17,051
24.06.2012, 23:33 #8
Цитата Сообщение от soon Посмотреть сообщение
char str[] = "asd";
str[9] = 'a';
не, ну компилятор то не даст ошибки
а вот во время исполнения скорее всего исключение типа "Пишем в запрещенную память"
или что серьезней стек то испортили... куда выйдем из функции одному Биллу известно

Добавлено через 1 минуту
Цитата Сообщение от soon Посмотреть сообщение
вашей строке 5 букв + \0, что в итоге дает 6
строка равна 5 Буфер 6
о чем спор??
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.06.2012, 23:35 #9
ValeryS, xADMIRALx считать не умеет. Спора нет, я уже закончил.
0
ValeryS
Модератор
6674 / 5083 / 474
Регистрация: 14.02.2011
Сообщений: 17,051
24.06.2012, 23:45 #10
Цитата Сообщение от xADMIRALx Посмотреть сообщение
i = 4 то есть + 1 должно получиться 5
правильно пять букв на шестой итерации(i = 5) cs[i]==0 вываливаемся из цикла
итого 5 букв размер строки. размер буфера 6
1
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
24.06.2012, 23:55 #11
Умею считать,просчитался прост
0
24.06.2012, 23:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2012, 23:55
Привет! Вот еще темы с ответами:

Немного не понимаю как правильно сделать наследование - C++
Вот например, есть структура Point(точка). Если надо сделать структуру Round(круг), то в этом случае надо наследовать Point потому что у...

Не понимаю логику обработки кода, разбитого на файлы - C++
Ситуация примерно такая. Есть файл file1.h, в котором объявлена функция: template&lt;class T&gt; T from_string(const std::string&amp; s); ...

Есть некоторые строчки кода, которые я не понимаю - C++
Добрый день. У меня есть код программ но есть некоторые строчки кода которые я не понимаю. Помогите разобраться. Как бы что тут...

День добрый! Как устроен стек при работе программ ? Правильно ли я понимаю? - C++
Поясните, правильно ли я понимаю, что стек при работе программы, вызовами функций работает так же, как стек который мы создаем сами с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru