- •Передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке эмулируется с помощью указателей);
- •Области действия имён; (область видимости переменной).
- •Достоинства:
- •Представление целых чисел в эвм
- •Основные типы данных, операции над ними.
- •Операции
- •Преобразование типов
- •Особенности операций для вещественных чисел
- •3.1. Операторы и блоки.
- •3.2. Оператор if – else
- •3.3. Конструкция else-if.
- •3.4. Оператор switch
- •3.5. Циклы while и for
- •3.6. Цикл do-while
- •3.7. Операторы break и continue
- •3.8. Оператор goto и метки
- •3.9. Оператор return
- •Инвариант
- •Указатели
- •Массивы
- •Связь между указателями и массивами
- •Представление в эвм
- •Создание указателя на массив
- •Инициализация массивов
- •Операции над указателями
- •Замечание! 2 указателя нельзя суммировать, но можно прибавлять константу. Сравнивать допустимо только с указателями того же типа или с null
- •Метод барьера в линейном поиске
- •Метод барьера при быстрой сортировке массива
- •Сортировка методом вставки. В отсортированной части массива последний элемент – барьер.
- •Процедуры
- •Локальные и глобальные переменные
- •Локальные переменные
- •Глобальные переменные
- •Средний и наихудший случай
- •Дополнительно (то же самое)
- •Анализ эффективности алгоритмов не должен зависеть от:
- •Временная сложность алгоритма
- •Некоторые свойства временной сложности алгоритма (функции f(n) )
- •Характеристики рекурсии
- •Виды рекурсии
- •Когда не нужно применять рекурсию
- •Применение эвристик.
- •Метод ветвей и границ (доп. Из Wikipedia)
- •Алгоритм Неймана.
- •Линейный конгруэнтный метод
- •Выбор параметров, выбор модуля и множителя.
- •Сдвиг на несколько символов: Если не совпадает , то сдвигаем образ вправо до последнего его стоп-символа. Если «стоп-символа» вообще нет в образе, то образ смещается за этот символ.
- •Вопросы на экзамен по информатике:
- •Перевести отрицательное целое число (он любое может назвать) в дополнительный код.
- •Есть ли смысл применять метод барьера в поиске подстроки в строке?
- •Задачи на экзамене:
- •Задача о Ханойских башнях
- •Бинарный поиск элемента в массиве
- •Сумма цифр в числе
- •Число различных элементов в символьном массиве
- •Сгенерировать все перестановки в целочисленном массиве (Билет 1).
- •Функция, возвращающая I и j такие, чтобы сумма эл-тов в I-ой строке равнялась сумме в j-ом столбце.
- •Есть одномерный массив целых чисел и нужно построить функцию, получающую на вход вещественное число X и возвращающую индекс элемента, который ближе всего к этому числу.
- •Функция strcpy (char *s1, char *s2) , билет 12.
- •Реализация strcat(); Билет 7.
- •Билет 5. Функция, выдаёт частное и остаток от деления X на y, нельзя пользоваться / и % .
- •Метод генерации случайной перестановки ( Тасование Фишера-Йетса).(не ок)
Есть одномерный массив целых чисел и нужно построить функцию, получающую на вход вещественное число X и возвращающую индекс элемента, который ближе всего к этому числу.
int a[n];
int i;
for (int i = 0; i < n; i++)
{
a[i] = i + 7 - 1;
}
float x = 7.2;
int min = fabs(a[0]-x);
int fin;
for (i = 0; i < n; i++)
{
if ((fabs(a[i] - x)) < min)
{
min = fabs(a[i]-x);
fin = i;
}
}
printf("%d", fin);
system("pause");
Функция strcpy (char *s1, char *s2) , билет 12.
Даны A[n], B[n], x. Написать функцию, которая возвращала бы такие i и j, что A[i]+B[j] было максимально приближенно к x.
#include <math.h> // для функции fabs, возвращающей модуль числа
void func(int N ,float A[N], float B[N], int *i, int *j, float x)
{
int ii,jj;
float a,min;
int *i=0;
int *j=0;
min=fabs(A[0]+B[0]-x);
for (ii=0; ii<N; ii++)
for (jj=0; jj<N; jj++)
if ((a=fabs(A[ii]+B[jj]-x))<min)
{
*i=ii;
*j=jj;
min=a;
}
}
Реализация strcat(); Билет 7.
char *strcat(char *s1, char *s2)
{
Int i=0; char *t = s1;
While (*s1++) s1--;
While (*s1++ = *s2++);
Return t;
}
Билет 5. Функция, выдаёт частное и остаток от деления X на y, нельзя пользоваться / и % .
Void f(int x, int y, int *m, int *k)
{
int q, x, p, y;
q = x; p = 0;
while (q >= y)
{
q = q - y;
p++;
}
*m = p; // частное
*k = q; // остаток
}
p*y + q = const = x
Метод генерации случайной перестановки ( Тасование Фишера-Йетса).(не ок)
void swap(int *c, int y, int t)
{
int tmp = c[y];
c[y] = c[t];
c[t] = c[y];
}
int main()
{
int i, j;
int a[5] = {1, 2, 3, 4, 5 };
for (i = 0; i < 5; i++)
printf("%d", a[i]);
system("pause");
for (i = 0; i < 5; i++)
{
j = rand() % 5;
swap(a, j, i);
}
}
for (i = 0; i < 5; i++)
printf("%d", a[i]);
system("pause");
Cам алгоритм: Для тасования массива a из n элементов (индексы 0..n-1):
для всех i от n − 1 до 1 выполнить
j ← случайное число 0 ≤ j ≤ i
обменять местами a[j] и a[i]
function randomPermutation(a:array[1..n] of integer):array[1..n] of integer // n — длина массива
for i = 1 to n
j
=
return a
Билет про ЛКГ ,параметры
Построить функцию int digit (long x, int n) возвращающую n-ую цифру справа числа x.
int digit(long x, int n)
{
int l, a;
char buf[100];
char k[1];
ltoa(x,buf,10);
l=strlen(buf);
k[0]=buf[l-n];
a=atoi(k);
return(a);
}
Реализовать функцию int strncmp(char*s1,char*s2,n)
int strncmp(char*s1, char*s2, n)
{ int i=0;
while (*s1++=*s2++ && i<=n && *s1!=NULL && *s2!=NULL) i++
if (*s1==*s2) return(0);
if (*s1>*s2) return (1);
if (*s1<*s2) return(-1);
Реализовать функцию char*strncat(char*s1,char*s2,n)
char*strncat(char*s1, char*s2,n)
{char *sav=s1;
int i=0;
while (*s1) s1++;
while (*s2 && i<=n)
{i++;*s1=*s2;s1++;s2++;}
return(sav);
Реализовать функции int strlen(char *s).
int strlen(char *s)
{
int len=0;
while(*s++) len++;
return( len);
}
Реализовать функцию char*strcpy(char *s1,char*s2)
char*strcpy(char*s1, char*s2)
{
char *sav =s1;
while(*s1++=*s2++);
return(sav);
}
Реализовать функцию char*strcat(char*s1,char s2)
char*strcat(char*s1, char*s2)
{
char *sav =s1;
while(*s1){
s1++;
}
while(*s2){
*s1=*s2;
s1++;
s2++;
}
return(sav);
}
Реализовать функцию char*strchr(char*s,char c)
char *strchr(char*s, char c)
{
while (((*s)!=c) && *s!=’\0’) s++;
if (*s==0) return(0);
return(s);
}
Реализовать функцию char*strncpy(char*s1,char*s2,n)
char*strncpy(char*s1,char*s2, n)
{char *sav=s1;
int i=0;
while (*s2 && i<=n) {*s1=*s2;s1++;s2++;}
return(sav);
Задачи из лекций:
Программа, определяющая размер типов без использования sizeof.
int main()
{
int digit1, digit2;
char maxchar, minchar = 0;
unsigned char maxuchar = -1, minuchar = 1;
int maxint, minint = 1, sizeint = 1, sizeuint = 1, sizeuchar = 1, sizechar = 1, sizeshort = 1, sizelong = 1;
unsigned int maxuint = -1, minuint = 0;
short maxshort, minshort = 0;
long maxlong, minlong = 1;
int a, b;
while (minchar >= 0) minchar++;
maxchar = minchar - 1;
digit1 = (maxchar - minchar) + 1;
while (digit1 % 2 == 0)
{
digit1 = digit1 / 2;
sizechar++;
}
while (minuchar > 0) minuchar++;
maxuchar = minuchar - 1;
digit1 = (maxuchar - minuchar) + 1;
while (digit1 % 2 == 0)
{
digit1 = digit1 / 2;
sizeuchar++;
}
while (minint*2) minint = minint*2;
maxint = minint - 1;
digit1 = (maxint - minint) + 1;
digit2 = 2;
do {
digit2 *= 2;
sizeint++;
} while (digit2 != digit1);
while (minuint *2) minuint = minuint *2;
digit1 = (maxuint - minuint) + 1;
digit2 = 2;
do {
digit2 *= 2;
sizeuint++;
} while (digit2 != digit1);
while (minshort >= 0) minshort ++;
maxshort = minshort - 1;
digit1 = (maxshort - minshort) + 1;
while (digit1 % 2 == 0)
{
digit1 = digit1 / 2;
sizeshort++;
}
while (minlong *2) minlong = minlong*2;
maxlong = minlong -1 ;
digit1 = (maxlong - minlong) + 1;
digit2 = 2;
do
{
digit2 = digit2 * 2;
sizelong++;
} while (digit2 != digit1);
}
Поиск минимума и максимума в массиве.
int a[5] = { 5, 4, 3, 7, 8};
int i = 0;
int max = a[0];
int min = a[0];
for (i = 0; i < 5; i++)
{
if (a[i]> max) max = a[i];
if (a[i] < min) min = a[i]; }
Дан упорядоченный массив, найти число различных чисел.
int a[7] = {1,3,3,3,5,9,9};
int i;
int count = 0;
for (i = 0; i < 7; i++)
{
if (a[i + 1] != a[i]) count++;
}
Найти сумму подмассива длиной m
Int arr[N]; int m, sum = 0;
If (m<=N){
For (int j=0; j<=(N-m); j++)
{
For (int i=j; i<m+j; i++) { sum = sum+arr[i];} printf(“Sum #%d %d”, (j+1), sum);
Sum = 0;
}
}
Else printf(“Error: m>N”); }
Проверка на простоту целого х
int simple(int n)
{
if (n == 1) return 1;
for (int i = 2; i <= n / 2; i++)
if (!(n%i)) return 0;
return 1;
}
int main()
{
int n;
printf(" N=");
scanf("%d", &n);
if (n == 2) return -1;
if (simple(n)) return 0;
else return -1; }
N-ю цифру числа справа
int digit(long x, int n)
{
int t;
for (int i = 1; i <= n; i++){
t = x % 10;
x = x / 10;
}
printf("%d", t);
}
