Слайд 1Язык С
Лекция №3
Массивы и указатели
Слайд 3Одномерные массивы
int a[10];
Нумерация индекса начинается с нуля!
В описании указывается
число элементов, а не верхняя граница
Выход за пределы индекса
– одна из самых распространенных ошибок!
Слайд 4Многомерные массивы
Нумерация всех индексов начинается с нуля!
int a[20][8];
Слайд 5Классические задачи, возникающие при работе с массивами
Ввод/вывод
(сохранение в файл, передача
по сети и т.п.)
Сортировка
(упорядочение по какому-либо признаку, не прибегая к
дублированию массива)
Поиск
(найти номер элемента массива по его значению)
Слайд 6Линейная сортировка
Число просмотров ~ ½ (N-1)2
Число перестановок ~ ¼ (N-1)2
Слайд 7Сортировка «пузырьком»
Число просмотров ~ ½ (N-1)2
Число перестановок ~ ¼ (N-1)2
Можно
остановится, как только не будет ни одной перестановки
Слайд 8Ввод массива
#define N 10
#include
main()
{
int a[N],x;
int i,j;
/* Ввод массива */
for (i=0; i
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
Слайд 9Сортировка массива
/* Линейная сортировка массива */
for (i=0; i
i++)
for (j=i+1; ja[j])
{x=a[j];
a[j]=a[i];
a[i]=x;
}
Слайд 10Вывод массива
/* Вывод отсортированного массива */
for (i=0; i
i++) printf("%5d",a[i]);
printf("\n");
return 0; // Код возврата
}
Слайд 11Вся программа целиком
/* Сортировка массива */
#define N 10
#include
main()
{
int a[N],x;
int i,j;
/* Ввод массива */
for
(i=0; i
{ printf("a[%d]=",i);
scanf("%d",&a[i]);
}
/* Вывод исходного массива */
for (i=0; i printf("\n");
/* Линейная сортировка массива */
for (i=0; i for (j=i+1; j if (a[i]>a[j]) {x=a[j]; a[j]=a[i]; a[i]=x; }
/* Вывод отсортированного массива */
for (i=0; i printf("\n");
return 0; // Код возврата
}
Слайд 12Бинарный поиск
L=0; R=9; N=(L+R)/2; // N==4; A[N]==55; A[N]
// N==7; A[N]==73; A[N]>72
L=5; R=N; N=(L+R)/2; // N==6; A[N]==72;
Слайд 13Бинарный поиск
// Бинарный поиск элемента массива равного b
int L,
R, n;
bool f = true;
L=0; R=N-1;
do {
n=(L+R)/2;
if (a[n]==b) { f=false; break; }
if (a[n] }
while (L<=R);
if (f) n=-1;
}
Слайд 15char str[12] = "Borland C++";
Ввод строки с клавиатуры:
scanf("%s",str); или
gets(str);
Вывод строки:
printf("%s",str); или puts(str);
Строка символов – массив
Слайд 16Функции для работы со строками
strcpy(s1,s2) – копирует содержимое строки
s2 в s1, возвращает указатель на s1
strcat(s1,s2) – присоединяет строку
s2 к s1, возвращает указатель на s1
strlen(s1) – возвращает длину строки, последний нулевой байт не учитывается
strcmp(s1,s2) – сравнивает строки, возвращает положительное, нулевое или отрицательное значение
Слайд 17Простейшая программа работы со строками
/* Подсчет количества слов */
#define N
80
#include
#include
main()
{
char s[N];
int i;
int k=0;
printf("\nEnter
a string: ");
gets(s);
strcat(s," ");
printf("\n\"%s\"\n%d characters\n",s,strlen(s));
for (i=0; i if ((s[i]!=' ') && (s[i+1]==' ')) k++;
printf("The string contains %d words.\n",k);
}
Слайд 18Копирование строки
while (s2[i]=s1[i]) i++;
или
while (s2[i]=s1[i++]);
Слайд 21Типизированные указатели
char *c; // указатель на char
int *i, j;
// указатель на int и просто int
i=&j; //
i присвоить адрес j
*i=1; // разыменованный указатель j=1
Слайд 22Указатели на void
void *p; // нетипизированный указатель
float *pf, f; // типизированный
указатель
pf=&f; // pf присвоить адрес f
p=pf; // одному
указателю присвоить значение другого
pf=(float *) p; // явное указание типа при разыменовании
Слайд 23Указатели и массивы
int a[10], * p;
char *p;
char str="Strings With
Capital Words";
p=str;
while (*p) putc(*p++);
Слайд 25Массивы указателей
char *ext[]={"exe", "com", "dat", "c", "pas", "cpp"}
int **p;
printf("%s",ext[0]);
Слайд 26Динамическое размещение данных
Неинициализированный указатель
int *p;
Выделение памяти (N элементов)
p=malloc(sizeof(int)*N);
Использование
p[i] либо *(p+i)
Освобождение
памяти
free(p);
Слайд 27Динамическое создание двумерного массива
#include
#include
main()
{
int M; // Число
строк
int N; // Число столбцов
int i,j; // Индексы
для цикла for
int **a; // Двумерный массив
printf("\nEnter M: "); scanf("%d",&M);
printf("\nEnter N: "); scanf("%d",&N);
a=(int**) malloc(sizeof(int*)*M);
for (i=0; i
for (i=0; i for (j=0; j
for (i=0; i { for (j=0; j printf("\n");
}
}
Слайд 28Динамическое выделение памяти по строку
#include
#include
#include
#define MAX 1000
main()
{
int n; // Длина текущей строки
int i=0; // Число
строк
int j; // Для цикла for
char* t[MAX]; // Массив под указатели на строки
char s[1024]; // Буфер под строку
do
{ gets(s);
if ( (n=strlen(s)) && (i { t[i]=(char *)malloc(sizeof(char)*(n+1));
strcpy(t[i++],s);
}
else break;
}
while (true);
for (j=0; j}