
- •1.1 Арифметические операторы.
- •1.3. Логические операторы
- •1.6. Выражения
- •1.7. Преобразование типов
- •2.6. Вложение else if
- •2.7. Инструкция switch
- •3.1. Оператор цикл for
- •3.4. Цикл do-while
- •3.3. Цикл while
- •4.1. Алгоритм Евклида
- •4.2. Алгоритмы обмена чисел
- •4.3.А. Для заданного натурального числа определить количество единичных бит в его представлении.
- •4.3.B. Найти количество повторений каждой цифры у заданного натурального числа
- •4.3.C. Перевод из 10-й с/с в 2..9
- •5.1. Объявление и определение функций .
- •5.2. Функция main()
- •5.3. Функция main() с параметрами
- •5.4. Обмен данными между функциями. Возвращаемое значение
- •5.5. Параметры функции
- •5.6.A. Функция перевода числа в различные нумерации
- •5.6.C. Поиск количества единичных бит в двоичном представлении числа.
- •5.6.E. Вычисление n!
- •5.6.F. Вычисление сочетаний из n по m без факториала
- •7. Функции форматированного вывода
- •7. Функции форматированного вывода (продолжение)
- •8. Функции форматированного ввода
- •9. Функции общего назначения
- •Void srand(unsigned int );
- •11.1. Объявление и инициализация массива
- •11.3. Ввод-вывод массивов
- •11.4 Операции над элементами массива
- •11.5. Передача массивов функциям
- •11.6. Обработка одномерных и двумерных массивов
- •11.7. Поиск элемента с заданными характиристиками
- •12.1. Переменные-указатели
- •12.2. Oператоры для работы с указателями.
- •12.3. Арифметические действия с указателями.
- •12.4. Динамическое распределение памяти
- •12.5. Указатели и массивы
- •12.6. Массивы-параметры
- •12.7. Указатели на константы и константные указатели.
- •12.8. Указатели на функции.
- •12.9. Алгоритмы преобразование и перестановки .
- •12.10. Алгоритмы расширение и сжатие массивов
- •13.1Сортировка пузырьком
- •13.2Сортировка Вставками
- •13.3Сортировка выбором
- •13.4Линейный поиск
- •Int sprintf(char *buffer, const char *format, ...);
- •15 Цели введения новых типов:
- •Int fclose(file* stream);
- •Int feof(file* stream);
- •18. Функции и разработка программ
- •18.1. Функции с переменным количеством параметров
- •18.2. Глобальные и локальные переменные, область видимости и время существования.
- •18.3. Спецификаторы классов памяти.
- •18.4. Компоновка нескольких файлов в одну программу
- •18.5. Директивы препроцессора
- •Задача Иосифа Флавия
- •Задача о рюкзаке
- •Классическая архитектура компьютера
- •Процессор - программно-управляемое устройство
- •Регистры, назначение и характеристика
- •Xchg приемник, источник
- •23Команды сравнения:
- •25 Команды организации циклов:
- •26 Команды пересылки:
- •27 Логические команды:
- •28 Команды обработки строк
- •Префиксы повторения
- •29.1. Регистры сопроцессора
- •29.2. Команды пересылки данных
- •29.3. Арифметические команды
- •29.4. Команды сравнения чисел
- •29.5. Трансцендентные команды
- •29.6. Управляющие команды
- •30.1. Команда call
- •23.6. Внешние подпрограммы
- •23.7.Компилятор masm
3.3. Цикл while
Цикл while является циклом с предпроверкой условия выхода. Конструкция while-цикла имеет синтаксис: while (выражение)
оператор; //тело цикла
Если при вычислении выражения получается отличный от нуля результат, то выполняется оператор тела цикла, после чего выражение вновь вычисляется. Выражение должно иметь арифметический либо приводимый к нему тип.
В качестве оператора может выступать отдельный оператор или блок операторов. Отдельный оператор всегда должен заканчиваться точкой с запятой (ограничителем операторов). Если тело цикла представляет собой блок операторов, то он должен быть заключен в фигурные скобки.
Выражение цикла while вычисляется прежде, чем выполняются операторы тела цикла.
Условием выхода из цикла является равенство нулю (false) выражения цикла.
Если при первом же вычислении выражения цикла while получено значение false (0), то операторы тела цикла не выполняются ни разу.
4.1. Алгоритм Евклида
Дана пара (a, b). Шаг 1. Поделить a на b с остатком r Шаг 2. Если r = 0, то НОД (a, b) = b Шаг 3. Если r <>0, то перейти к шагу 1 с парой (b, r)
do
if (a>b)
a%=b;
else
b%=a;
while ((a !=0) && (b!=0));
4.2. Алгоритмы обмена чисел
Имеется две переменные a и b. Поменять их значения местами. int a,b, tmp; {1} tmp = a; a = b; b = tmp; {2} a = a + b; b = a - b; a = a - b; {3} a = a ^ b; b = a ^ b; a = a ^ b;
4.3.А. Для заданного натурального числа определить количество единичных бит в его представлении.
Суть алгоритма в том, что заводится битовая "маска", содержащая единственный ненулевой бит, позиция которого при работе цикла меняется от младшего к старшему.
При единичном значении очередного бита проверяемого числа, логическое умножение очередного значения маски на содержимое проверяемого числа маску не меняет.
int Count_Bit(int a)
{
int bit;
int mask = 1;
int num = 0;
for ( int i = 0;i <=31;i++)
{
bit=mask & a;
if (bit == mask) num++;
mask = mask << 1;
}
return num;
}
4.3.B. Найти количество повторений каждой цифры у заданного натурального числа
void SumDigit (int a){
int b = a;
int c;
printf ("Povtorenie %d\n", a);
for(int i = 0; i<10; ++i)
{
c = 0;
a = b;
while(a>0)
{
if(a%10 == i) c++;
a /=10;
}
if(c!=0)
printf ("%d => %d\n", i, c);
}
}
4.3.C. Перевод из 10-й с/с в 2..9
int a,r; { // ввод n a = 0; r = 1; while (n >= 1) { a = a + (n % p) * r; r = r * 10; n = n / p; }
либо
int main()
{
char M1[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int M[32]; //Массив под остатки
int a,i,n;
scanf("%d %d", &a, &n);
i=0;
while (a!=0)
{
M[i]=a%n;
a/=n;
i++;
}
for(i--;i>=0;i--)
printf("%c", M1[M[i]]);
printf("\n");
}
D. Дихотомический поиск
int BinSearch(int *M, int left, int right, int x)
{
int mid;
while (left<=right)
{
mid=(left+right)/2;
if (M[mid]==x)
return(mid);
else
{
if (M[mid]>x)
right=mid-1; else
left=mid+1;
}
}
return(-1);
}
E. Проверка, простое ли число
int Prost (int a)
{ int i, n,flag;
double r;
if ((a==2)||(a==3))
flag =1;
else
{
i=2;
flag =1;
r=a;
n= (int)floor(sqrt (r));
while ((i <=n) && flag )
if (!(a%i)) flag=0;
else ++i;
}
return flag;
}
F. Совершенные числа
Натуральное число Р называется совершенным, если оно равно сумме всех своих делителей кроме Р. Доказано, что если р и 2р-1 - простые числа, то число Р=(2р-1)*2^(p-1) является совершенным
void Number_Sover (){
int n,k,p,i,flag,ch;
printf("Enter N ");
scanf("%d",&n);
p=2;i=1;
while (i<=n) {//простое или нет
int j=2;
flag=1; //да
while ((j<=p/2) && (flag))
if ( !(p%j)) flag=0;//нет
else ++j;
if ((flag)||(p==2) ||(p==3)){
int step=1; int m=p-1; int x=2;
while (m != 0){
if (m % 2 == 1) step=step*x;
x=x*x;
m=m / 2;
}
ch=step*(step*2-1);
printf("%d \n",ch);
i++;
}
p++;
}}
E. Числа Мерсенна
Числами Мерсенна называют числа вида 2^n-1
void Number_Mersenne(int m)
{
printf("CM\n");
int r=0;
for (int i=1;i<=m;i++)
{
r=(2<<i-1)-1;
printf("%d\n",r);
}
}
F. Числа Армстронга
n-значное число называется числом Армстронга, если оно равно сумме n-ых степеней своих цифр.
#include <stdio.h>
#include <math.h>
int main()
{
long a,b,k,c,chislo,z;
long double m,t,k1;
m=0; k=0;
printf("Input two borders a b (a<b): ");
scanf("%d %d", &a, &b);
for (int i=a; i<b+1; ++i){ //перебор всех чисел
m=0; k=0; z=i; chislo=i;
while (z) //определение количества знаков
{k++;
z/=10;}
k1=k;
for (int p=1; p<k+1; ++p) //подсчет суммы степеней цифр
{
c=chislo%10;
chislo=(chislo-c)/10;
t=pow(c,k1);
m+=t;
}
if (m==i)
printf("chislo Armstronga: %d\n", i);
}}
G. Числа Фибоначчи Число называется числом Фибоначчи, если оно является одним из членов последовательности: fn = fn-1 + fn-2, где f0 = 1 и f1 = 1.
Можно также определить n-й член ряда Фибоначчи, непосредственно подсчитав выражение:
H. Числа Смита
Число называется числом Смита, если сумма цифр числа равна сумме цифр разложения этого числа на простые множители.