Главная страница
Навигация по странице:

  • Урок 6. Посимвольный ввод и вывод. Понятие буфера

  • Урок 8. Функции. Передача аргументов по значению и по ссылке

  • Урок 9. Форматированный ввод данных

  • Урок 10. Псевдослучайные числа

  • Урок 11. Особенности массивов при работе с указателями

  • Урок 12. Массивы и функции

  • Урок 13. Особенности работы со строками

  • Урок 19. Препроцессор языка C

  • Урок 20. Многофайловые программы

  • Урок 22. Проверочная работа

  • Программирование в Linux. Учебное пособие С. В. Шапошникова, Лаборатория юного линуксоида, май 2012 1 Пояснительная записка


    Скачать 0.88 Mb.
    НазваниеУчебное пособие С. В. Шапошникова, Лаборатория юного линуксоида, май 2012 1 Пояснительная записка
    АнкорПрограммирование в Linux
    Дата02.12.2022
    Размер0.88 Mb.
    Формат файлаpdf
    Имя файлаProgramming Linux C.pdf
    ТипУчебное пособие
    #824650
    страница10 из 10
    1   2   3   4   5   6   7   8   9   10
    ", sizeof("Hello"));
    }
    Урок 2. Символьный тип данных. Специальные символы
    Напишите программу, в которой объявлены только две переменные символьного типа. Одной переменной присвоен, например, символ '4', а второй — '7'. Функция printf() должна выводить на экран разность и сумму чисел, которые были представлены символами и присвоены переменным.
    #include main() { char a='4', b='7'; printf("%d\n", '7' - '4'); printf("%d\n", ('7'-'0') + ('4' – '0'));
    }
    Переменная not_num содержит строку из трех символов-цифр, например "528". Необходимо получить из этой строки соответствующее ему число и присвоить его переменной num.
    Вывести на экран результат выражения num – 10. (Подсказка: строка — это массив символов, следовательно, вы можете извлекать символы цифр по их индексам; при вычислении числа первый символ массива, преобразованный в число, будет означать
    90
    количество сотен, второй — десятков, а третий — единиц.)
    #include main() { char not_num[] = "567"; int num; num = (not_num[0] - '0') * 100 + (not_num[1] - '0') * 10 + (not_num[2] -
    '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; iprintf("%d ",arr1[i]);
    printf("\n");
    }
    void arr_change(const int m1[], int m2[]) {
    int i;
    for(i=0; im2[i] = -m1[N-i-1];
    }
    Урок 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#define SUM(m,s) for(i=0; imain () {
    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; iarr[i] = rand() % 26 + 97;
    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; ji = rand() % (100) + 250;
    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; iprintf("%d ", arr[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
    1   2   3   4   5   6   7   8   9   10


    написать администратору сайта