Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
30
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

1 Задача

Цель: работа с массивом символов.

Выделение последнего слова в предложении.

#include <stdio.h>

// подключение библиотеки работы со строками

#include <string.h>

// максимальная длина предложения

#define msg 400

// максимальная длина слова

#define lastw 8

// заданное предложение

char msg = “I love you”;

char lastw;

// функция для выделения слова в предложении

void lastword(void);

int main()

{

lastword();

printf(“Последнее слово % \n”, lastw);

return 0;

}

void lastword(void)

{

int i, beg, end;

// определение позиции символа, который стоит в конце предложения

end = strlen(msg)-1;

// находим последний символ в конце предложения, отличный от пробела while (msg[end] == ’ ’)

end--;

beg = end;

// нахождение позиции символа пробела перед последним словом

while (msg[beg]! == ’ ’)

beg--;

// запись одного слова в массив

for(i =0; i<(end- beg); i++)

lastw[i] = msg[beg+i+1];

for(i =end-beg; i<lastw; i++)

lastw[i] =’ ’;

}

2 Задача

Найти все натуральные числа, не превосходящие заданного числа N и делящиеся на каждую из своих цифр.

#include<stdio.h>

#include<stdlib.h>

// подключение библиотеки для работы со строками

#include<string.h>

#include<malloc.h>

// функция проверки деления числа на каждую из своих цифр

bool divide(int i)

{

int oldValue = i;

// объявление массива из 15 символов

char buf[15];

strcpy(buf, ” ”);

// попытка перевести символы в целое число

itoa(i,buf,20);

// вычисление длины введенных символов для определения количества цифр в числе

int l = strlen(buf);

// объявление указателя

int*array;

array =(int*)malloc(sizeof(int)*l);

// проверка делимости числа на каждую цифру

for(int loop = 0; loop<1; loop++)

{

array[loop]=i%10;

if(array[loop] == 0 || oldValue % array[loop]! = 0)

return false;

I = (int)(i-I %10)/10;

}

// очистка памяти, выделенной под массив

free(array);

return true;

}

int main()

{

int N;

printf(“Input integer number: ”);

// считывание числа, до которого осуществляется проверка

scanf(“%d”, &N);

for(int i= 1; i<=N; i++)

{

// если число делится на каждую из своих цифр,

if(divide(i))

// то выводим его на экран

print(“%d \n”, i);

}

return 0;

}

3 Задача

Цель: работа со строкой.

Дано предложение, которое заканчивается точкой.

1) удалить все лишние пробелы.

2) удалить во всех словах одинаковые символы, стоящие подряд, оставив только один.

#include <stdio.h>

#include <malloc.h>

#include <string.h>

#defineMAXSTR500

// функция чтения символов и запись их в строку

void pointstring(char*);

// удаление лишних пробелов

voiddelspace(char*,char*);

void samesymb(char*);

void main()

{

char str[MAXSTR];

char strn[MAXSTR];

pointstring(str);

// функция копирования 1-ой строки во 2-ю, игнорируя лишние пробелы

delspace(str, strn);

// функция удаления в слове стоящие подряд одинаковые символы

samesymb(strn);

printf ("%s\n",strn);

}

void pointstring(char* sym)

{

char ch;

do

{

// считывание одного символа

ch=getchar();

// заполнение массива символов sym

*sym=ch;

sym++;

}

// считываем символы, пока не встретится точка

while (ch!='.');

// добавление к строке символов \0, таким образом,symявляется строкой

*sym ='\0';

}

// функция копирования 1-ой строки во 2-ю, игнорируя лишние пробелы

void delspace(char* sym, char* tekstrn)

{

charch;

// признак наличия пробела

intprobel=1;

// инициализация переменной

ch=*sym;

do

{

// если символ является пробелом

if(ch==' ')

{

// то пробел приравниваем к 1, количество пробелов увеличили на 1

if (probel==1) sym++;

else

{

*tekstrn++=*sym++;

probel=1;

}

}

else

{

*tekstrn++=*sym++;

probel=0;

}

ch=*sym;

}

while (*sym!='\0');

*tekstrn='\0';

}

// функция удаления в слове стоящие подряд одинаковые символы

void samesymb(char* word)

{

char* prev;

char* cur;

char* tmpwrd;

tmpwrd=(char*)malloc(strlen(word)+1);

char* curtmp=tmpwrd;

*curtmp=*word;

prev=word;

cur=word+1;

while(*cur!='\0')

{

if(*cur==*prev) cur++;

else

{

*(++curtmp)=*cur;

prev=cur++;

}

}

*(++curtmp)='\0';

strcpy(word, tmpwrd);

free(tmpwrd);

}

Самостоятельная работа

  1. Изменить задание 3 так, чтобы количество элементов в строке задавалось пользователем.

  2. Изменить задание 1 так, чтобы:

  • ввод символов осуществлялся пользователем;

  • память под строку выделялась в динамической области.

  • Добавить в задании 3 функцию условие: удалить во всех словах одинаковые символы, стоящие подряд, оставив только один.

    Лабораторная работа №8

    Указатели на функции

    Цель: закрепление на практике знаний работы с указателями на функцию.

    Методические рекомендации: лабораторная работа рассчитана на 1,5 часа и состоит из анализа одного задания и выполнения самостоятельной работы.

    Обязательное зачетное задание.

    Необходимый уровень знаний:

    • работа с функциями;

    • работа с указателями.

  • Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]