Программирование в Linux. Учебное пособие С. В. Шапошникова, Лаборатория юного линуксоида, май 2012 1 Пояснительная записка
Скачать 0.88 Mb.
|
} Урок 2. Символьный тип данных. Специальные символы Напишите программу, в которой объявлены только две переменные символьного типа. Одной переменной присвоен, например, символ '4', а второй — '7'. Функция printf() должна выводить на экран разность и сумму чисел, которые были представлены символами и присвоены переменным. #include } Переменная not_num содержит строку из трех символов-цифр, например "528". Необходимо получить из этой строки соответствующее ему число и присвоить его переменной num. Вывести на экран результат выражения num – 10. (Подсказка: строка — это массив символов, следовательно, вы можете извлекать символы цифр по их индексам; при вычислении числа первый символ массива, преобразованный в число, будет означать 90 количество сотен, второй — десятков, а третий — единиц.) #include '0'); printf("%d\n", num - 10); } Известно, что символ A английского алфавита имеет код 65. Напишите программу, определяющую какие символы в этом алфавите стоят на 5, 12 и 19 местах. printf("%c, %c, %c\n", 'A' + 4, 'A' + 11, 'A' + 18); Выведите на экран символьное обозначение управляющих символов и их номера по таблице ASCII. printf("\\n - %d\n", '\n'); printf("\\t - %d\n", '\t'); printf("\\b - %d\n", '\b'); printf("\\r - %d\n", '\r'); Урок 4. Циклы в языке C Присвойте переменной star значение 0. Пока значение star не достигнет 55 выводите на экран в строку по одной звездочке (*). int star=0; while (star < 55) { printf("*"); star += 1; } printf("\n"); С помощью цикла while запрограммируйте вывод на экран цифровых кодов и значений таблицы символов ASCII от 31 до 127 включительно. При этом после каждого десятого символа осуществляйте переход на новую строку. unsigned char a; printf("\n"); a = 31; while (a < 128) { printf("%4d-%c", a, a); if (a % 10 == 0) printf("\n"); a = a + 1; } printf("\n"); Используя внешний и вложенный циклы while организуйте вывод таблицы умножения на экран. printf("\n"); i = 1; while (i < 10) { j = 1; while (j < 10) { printf("%4d", i*j); j++; 91 } printf("\n"); i++; } printf("\n"); Напишите программу с использованием цикла for, выводящую на экран таблицу умножения. int i, j; printf("\n"); for (i = 1; i < 10; i++) { for (j = 1; j < 10; j++) printf("%4d", i*j); printf("\n"); } printf("\n"); Урок 6. Посимвольный ввод и вывод. Понятие буфера Напишите программу, которая считает количество введенных пользователем символов и строк. Напишите программу, которая подсчитывает количество слов в строке. #include main() { char ch, flag=-1; unsigned c=0, n=0, w=0; while ((ch = getchar()) != EOF) { if (ch == '\n') n++; // строки else c++; // символы if (ch == ' ' || ch == '\n') flag = -1; // слова else if (flag == -1) { flag = 1; w++; } } printf("%u %u %u\n", c, n, w); } Урок 8. Функции. Передача аргументов по значению и по ссылке Напишите программу, в которой помимо функции main() были бы еще две функции: в одной вычислялся факториал переданного числа, в другой — находился n-ый элемент ряда Фибоначчи (n — параметр функции). Вызовите эти функции с разными аргументами. #include unsigned fibonachi (unsigned num); unsigned long factorial (unsigned n); main () { unsigned long result; result = fibonachi(10); printf("Значение 10-го элемента ряда Фибоначчи равно %lu\n", result); result = fibonachi(25); printf("Значение 25-го элемента ряда Фибоначчи равно %lu\n", result); 92 result = factorial(5); printf("5! = %lu\n", result); result = factorial(12); printf("12! = %lu\n", result); } unsigned fibonachi (unsigned num) { unsigned i=1, a=0, b=1, s; while (i++ < num-1) { s = a; a = b; b = s+a; } return b; } unsigned long factorial (unsigned n) { unsigned long fact=1; while (n > 0) fact = fact * n--; return fact; } Урок 9. Форматированный ввод данных Напишите программу, которая запрашивает у пользователя две даты в формате дд.мм.гггг. Дни, месяцы и года следует присвоить целочисленным переменным. Программа должна выводить на экран информацию о том, какая дата более ранняя, а какая более поздняя. #include main() { int dd1, dd2, mm1, mm2, yy1, yy2; int i; printf("Enter first date (dd.mm.yyyy): "); scanf("%d.%d.%d", &dd1, &mm1, &yy1); printf("Enter second date (dd.mm.yyyy): "); scanf("%d.%d.%d", &dd2, &mm2, &yy2); if (yy1 > yy2) i = 1; else if (yy1 < yy2) i = 2; else // когда года равны if (mm1 > mm2) i = 1; else if (mm1 < mm2) i = 2; else // когда равны года и месяцы if (dd1 > dd2) i = 1; else if (dd1 < dd2) i = 2; else // даты совпадают i = 0; if (i == 1) printf("Первая дата более поздняя\n"); else if (i == 2) printf("Вторая дата более поздняя\n"); else printf("Даты совпадают\n"); 93 } Используя цикл, напишите код, в котором пользователю предлагается вводить данные до тех пор, пока он не сделает это корректно, т.е. пока все указанные в scanf() переменные не получат свои значения. Протестируйте программу. Что вы наблюдаете и почему? Как можно решить проблему? #include main () { int a, n; float b; char str[20]; do { printf("Enter a integer, a float, a string: "); n = scanf("%d%f%s", &a, &b, str); if (n != 3) { scanf("%*s%*s%*s"); } } while (n != 3); printf("Integer: %d, float: %.3f, string: %s\n", a, b, str); } Урок 10. Псевдослучайные числа Выведите на экран ряд случайных чисел, принадлежащих диапазону от -128 до 127 включительно. #include #include #include main () { int i; srand(time(NULL)); for (i = 1; i <= 100; i++) { printf("%10d", rand() % (127 - (-128) + 1) + (-128)); if (i % 5 == 0) printf("\n"); } } Заполните массив случайными числами в диапазоне от 0.51 до 1.00. Выведите значение элементов массива на экран. #include #include #include main () { int i, r; srand(time(NULL)); for (i = 1; i <= 50; i++) { printf("%10.2f", (float) rand() / RAND_MAX * (1 - 0.51) + 0.51); if (i % 5 == 0) printf("\n"); } } 94 Урок 11. Особенности массивов при работе с указателями Напишите программу, в которой объявлен массив вещественных чисел из десяти элементов. Присвойте указателю адрес четвертого элемента, затем, используя цикл, выведите на экран адреса 4, 5 и 6-ого элементов массива. #include #define N 10 main () { float arr[N] = {1.0, 0.9, 0.5, 0.6, 0.7, 1.1, 0.7, 0.4, 1.2, 0.9}; float *p; int i; p = arr+3; for (i=0; i<3; i++) printf("%.1f\n", p[i]); } Урок 12. Массивы и функции Напишите программу, в которой из функции main() в другую функцию передаются два массива: "заполненный" и "пустой". В теле этой функции элементам "пустого" массива должны присваиваться значения, так или иначе преобразованные из значений элементов "заполненного" массива, который не должен изменяться. #include #define N 10 void arr_change(const int a[], int b[]); main () { int arr[N] = {2,3,4,5,12,13,14,15,22,23}; int arr1[N], i; arr_change (arr, arr1); for (i=0; i printf("\n"); } void arr_change(const int m1[], int m2[]) { int i; for(i=0; i } Урок 13. Особенности работы со строками Объявите в программе три массива символов. Данные для двух из них получите с помощью вызовов функции gets(). Третий массив должен содержать результат конкатенации (соединения) двух введенных строк. Напишите функцию, которая выполняет конкатенацию строк. void concat (const char *, const char *, char *); main () { char str0[50], str1[50], str2[100]; 95 gets(str0); gets(str1); concat(str0, str1, str2); puts(str2); } void concat (const char *s0, const char *s1, char *s) { int i, j; for (i=0; s0[i]!='\0'; i++) s[i] = s0[i]; for (j=0; s1[j]!='\0'; j++,i++) s[i] = s1[j]; s[i] = '\0'; } Урок 19. Препроцессор языка C Напишите программу, содержащую пару макросов: один вычисляет сумму элементов массива, другой выводит элементы массива на экран. #include #define N 5 #define PN(m) for(i=0; i int arr[N] = {1,3,6,3,2}; int i; int sum=0; SUM(arr,sum); printf("%d\n", sum); PN(arr); } Напишите программу, содержащую макросы с аргументами, вычисляющие площади различных геометрических фигур (например, квадрата, прямоугольника, окружности). #include #define SQ(a) (a) * (a) #define REC(a,b) (a) * (b) #define CIR(r) 3.14 * (r) * (r) main () { printf("%d\n", SQ(67)); printf("%d\n", REC(8,9)); printf("%.2f\n", CIR(5)); } Урок 20. Многофайловые программы Создайте две глобальные переменные в одном файле. В другом файле напишите функцию, которая меняет их значение. Файл main.c: 96 #include int a = 0; char b = 'x'; void changing(void); main() { printf("%d %c\n", a, b); changing(); printf("%d %c\n", a, b); } Файл change.c: void changing() { extern a; extern b; a = 20; b = 'r'; } Урок 22. Проверочная работа 5. Переделайте условное выражение из 4-го задания в макрос. #include #define ABS(x) (x > 0) ? x : -x main() { int a, b; scanf("%d", &a); b = ABS(a); printf("%d\n", b); } 7. Запрограммируйте вывод на экран символов так, как показано на рисунке. Используйте циклы for, а также если необходимо функцию strcat(). #include #include main() { short i, j, k; char str[50]; str[0] = '\0'; for (i=1; i<=5; i++) { for (j=1; j<=3; j++) { for (k=0; kstrcat(str,":)"); printf("%-25s", str); str[0] = '\0'; } printf("\n"); } } 97 8. Напишите программу, которая определяет в процентном соотношении количество гласных и согласных букв в текстовом файле. Имя файла передается в программу через командную строку. #include #include main (int argc, char *argv[]) { FILE *f; char ch; char vowels[] = "aeiouyAEIOUY"; char cons[] = "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ"; unsigned v=0, c=0; f = fopen(argv[1], "r"); if (f == NULL) { puts("Не удалось прочитать файл"); return 1; } while ((ch = getc(f)) != EOF) { if (strchr(vowels, ch) != NULL) v++; else if (strchr(cons, ch) != NULL) c++; } fclose(f); printf("Гласные: %.2f%%\nСогласные: %.2f%%\n", ((float)v/(v+c))*100, ((float)c/(v+c))*100); } 11. Напишите программу, в которой массив заполняется случайными буквами английского алфавита; значения элементов массива в символьном представлении выводятся на экран. #include #include #define N 25 main () { char arr[N], i; srand(time(NULL)); for (i=0; i printf("%c ", arr[i]); } printf("\n"); } 12. Напишите функцию, которая принимает указатели на два массива. Функция должна заполнять один массив 25-ю случайными четными числами, а другой — 25 нечетными. Продемонстрируйте ее работу. #include #include 98 #define N 25 void arrs_make(int even[], int odd[]); void arr_print(int *arr, int n); main () { int arr1[N], arr2[N]; arrs_make(arr1, arr2); arr_print(arr1, N); printf("\n"); arr_print(arr2, N); printf("\n"); } void arrs_make(int *even, int *odd) { int i,j,k; srand(time(NULL)); for (j=0, k=0; j if (i%2 == 0 && j < N) { even[j] = i; j++; } else if (k < N) { odd[k] = i; k++; } } } void arr_print(int *arr, int n) { int i; for (i=0; i } 13. Пользователь вводит две строки, каждая строка состоит из двух слов, разделенных пробелом. Требуется сравнить строки лексикографически, начиная со второго слова (т.е. после пробела). Напишите программу, выполняющую описанную задачу. #include #define N 30 main () { char strA[N], strB[N]; char *a, *b; gets(strA); gets(strB); a = strchr(strA,' '); b = strchr(strB,' '); if (a != NULL && b != NULL) if (strcmp(a, b) == 0) puts ("Yes"); 99 } 14. Пользователь вводит адреса сайтов и их ТИЦ. Данные о каждом сайте сохраняются в элементе динамической структуры. По команде пользователя данные записываются в файл, при этом память, выделенная под динамическую структуру, высвобождается. Далее пользователь может снова начать вводить информацию о сайтах, либо завершить выполнение программы. #include #include #include struct site { char address[25]; unsigned index; struct site *next; }; struct site *add_site(struct site *, char *adds, int tic); // присоединение элемента к голове, возврат адреса головы void save(struct site *); // сохранение стека main() { char adds[25]; unsigned tic; struct site *head; // адрес, указывающий на голову стека while (1) { head = NULL; while (1) { printf("Адрес сайта (s - stop): "); scanf("%s", adds); if (strcmp(adds,"s") == 0) break; printf("Тиц %s: ", adds); scanf("%u", &tic); head = add_site(head,adds,tic); } printf("\n"); save(head); free(head); printf("Продолжить? (y - yes): "); scanf("%s",adds); if (strcmp(adds,"y") != 0) break; } } struct site *add_site(struct site *head, char *ch, int tic) { struct site *element; // указатель на новую структуру element = (struct site *)malloc(sizeof(struct site)); // выделяем память element->next = head; strcpy(element->address, ch); element->index = tic; return element; } void save(struct site *p){ FILE *f; f = fopen("sites.txt","a"); while (p != NULL) { // пока не конец стека 100 fprintf(f,"%s - %u\n", p->address, p->index); p = p->next; // продвижение по списку } fclose(f); } 101 |