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


Автор: lyubov17 5.11.2014, 20:05
Здравствуйте! Напишите, пожалуйста, как можно подробнее, комментарии к программам, чтобы пошагово понять, что к чему, и как работают эти программы. Заранее большое спасибо! 
 1) Определить, совершенное ли число

 
Код
#include <stdio.h>
 #include <iostream>
 int main()
 {
 setlocale(LC_ALL,"russian");

 int x;
 printf("Введите число: ");
 scanf("%d",&x);

 int i=1,sum = 0;

 while( i < x ) 
 {
 if( x%i == 0 )
 sum +=i;
 i++;
 }
 if( sum == x )
 printf("Число совершенное!\n");
 else
 printf("Число не совершенное!\n");

 }


 2) Определить, счастливый билет или нет

Код
 #include <stdio.h>
 #include <iostream>
 int main()
 {
 setlocale(LC_ALL,"russian");

 int x;
 printf("Введите число: ");
 scanf("%d",&x);

 int x2=x , ost , s1=0 , s2=0 , podschet = 0;
 while( x2 != 0 ) 
 {
 ost = x2%10;
 if( podschet < 3 ) 
 s1 +=ost;
 else 
 s2+=ost;
 x2 = x2/10;
 podschet++;
 }
 if( s1 == s2 )
 printf("Поздравляем , билет счастливый!\n");
 else
 printf("Билет не счастливый! \n");

 }


 3) Разделить число на цифры
Код
 #include <stdio.h>
 #include <iostream>
 int main()
 {
 setlocale(LC_ALL,"russian");

 int n;
 printf("Введите длинну числа <= 10\n");
 scanf("%d",&n);
 int x;
 printf("Введите число x длинной %d : ",n);
 scanf("%d",&x);

 int *array = new int[n];
 int i=0,ost;

 while(x>0) 
 {
 ost = x%10;
 array[i] = ost;
 x=x/10;
 i++;
 }
 int j;
 for(i=n-1,j=1;i>=0;i--,j++)
 printf("%d-я цифра = %d\n",j,array[i]);

 }


Модератор: не забываем пользоваться кнопочкой "Код"

Автор: feodorv 5.11.2014, 23:38
Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
Напишите, пожалуйста, как можно подробнее, комментарии к программам, чтобы пошагово понять, что к чему, и как работают эти программы. Заранее большое спасибо! 

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

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
#include <stdio.h>

Включаем в текст программы заголовочный файл stdio.h. В заголовочных файлах объявляются константы и функции, которые используются в программе. В данном случае в stdio.h объявляются функции printf() и scanf(), которыми мы будем пользоваться. Так же мы в программе вызываем библиотечную функцию setlocale() и используем константу LC_ALL, но заголовочный файл locale.h, в котором они объявлены, мы в текст программы не включаем, что не позволит нам скомпилировать программу.

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
#include <iostream>

Заголовочный файл iostream, который здесь используется вместо locale.h, предназначен  для языка программирования C++ (а у нас, вроде, только C).

 
Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
int main()
 {

Выполнение скомпилированной программы начинается с функции main(). Это так называемая https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%87%D0%BA%D0%B0_%D0%B2%D1%85%D0%BE%D0%B4%D0%B0 в программу. 

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 setlocale(LC_ALL,"russian");

Вызываем функцию setlocale(). Этот вызов позволит нам печатать на консоль по-русски.

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 int x;
 printf("Введите число: ");
 scanf("%d",&x);

Здесь мы объявляем переменную x. Затем выводим на консоль приглашение ввести значение для этой переменной, затем с помощью функции scanf считываем с консоли значение для этой переменной.

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 int i=1,sum = 0;

Здесь мы объявляем переменные i и sum, и заодно задаем им начальные значения (инициализируем). i у нас будет служить пробным делителем числа x, а sum - суммой найденных делителей числа x.

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 while( i < x ) 
 {

Перебираем в цикле все возможные делители для числа x в диапазоне от 1 до (x-1).

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 if( x%i == 0 ) sum +=i;

Если остаток от деления числа x на число i есть ноль (то есть число x делится на число i нацело), то тогда i является делителем числа x, и мы этот делитель добавляем к числу sum.

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 i++;
 }

Завершаем тело цикла увеличением значения предполагаемого делителя i на единицу, что и позволяет нам перебрать все разумные значения для предполагаемого делителя в диапазоне от 1 до (x-1).


Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 if( sum == x )
 printf("Число совершенное!\n");
 else
 printf("Число не совершенное!\n");

Теперь, когда у нас есть сумма всех делителей (sum) числа x, мы можем сравнить её с самим числом x. Если значения совпадают, что печатаем на консоль, что число - совершенное. Если же нет, то сообщаем, что число не совершенное.

Цитата(lyubov17 @  5.11.2014,  21:05 Найти цитируемый пост)
 }

Завершаем тело функции main(). Правда, было бы неплохо вернуть из функции какое-нибудь значение (обычно, это 0), ибо мы объявили main() как возвращающую знаковое целочисленное значение функцию. Это значение, кстати, будет являться кодом завершения (для всей) программы, но в C (не в C++) именно для функции main() (и никакой другой) разрешено не писать в конце
Код
return 0;
, (хотя, конечно, лучше всё же этот оператор написать в явном виде).


ЗЫ Остальные программы - самостоятельно.
ЗЗЫ Такое впечатление, что программа компилилась как C++-программа, а не C-программа.

Автор: baldina 6.11.2014, 11:21
Цитата(feodorv @  5.11.2014,  23:38 Найти цитируемый пост)
но в C (не в C++) именно для функции main() (и никакой другой) разрешено не писать в конце

в C++ разрешено. причем соответствует return 0, а не возвращает мусор как в C

Автор: feodorv 6.11.2014, 19:34
Цитата(baldina @  6.11.2014,  11:21 Найти цитируемый пост)
в C++ разрешено. причем соответствует return 0, а не возвращает мусор как в C 

Гм, прошу прощения, я вот почему-то решил, что C++ таких вольностей не позволяет. Видимо, сказывается "C как подмножество C++". 

Тем более приведенная программа выглядит написанной под C++ (пусть и с сишными printf/scanf).

Автор: math64 7.11.2014, 11:09
Код

int main()
 {
 setlocale(LC_ALL,"russian");

 int x;

Если язык программирования "C", переменную нужно объявлять в начале функции, до setLocale().

Автор: sQu1rr 7.11.2014, 11:21
Цитата(feodorv @  6.11.2014,  19:34 Найти цитируемый пост)
приведенная программа выглядит написанной под C++

Цитата(math64 @  7.11.2014,  11:09 Найти цитируемый пост)
Если язык программирования "C"

Нет, на правда, ктонибудь на велюченные хедеры смотрел? <iostream> там например?

Автор: ajtakt 7.11.2014, 12:43
Модератор: Сообщение скрыто.

Автор: feodorv 7.11.2014, 15:04
Цитата(math64 @  7.11.2014,  11:09 Найти цитируемый пост)
Если язык программирования "C", переменную нужно объявлять в начале функции, до setLocale(). 

Если я не ошибаюсь, в C99 переменные можно объявлять где угодно...

Автор: math64 10.11.2014, 10:36
Ну это уж точно не "C":
Код

int *array = new int[n];

Думаю, ТС пишет на C++, просто в загловке темы написал "Си"

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