
КПЯПЧ1 Контрольная работа №2 / kontr2
.doc
Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники»
Кафедра программного обеспечения информационных технологий
Контрольная работа №2
(вариант 14)
по дисциплине
Конструирование программ и языки программирования
Часть 1
студентки …
факультета ФНиДО
специальности ПОИТ
зач. кн. №701021с-14
Минск 2010
Контрольная работа № 2
Файлы.
Вариант 14.
Дан файл F. Определить, являются ли два первых символа файла цифрами.
Решение задачи в СИ:
//Контрольная работа №2. Вариант 14.
//Дан файл F. Определить, являются ли два первых символа файла цифрами.
//Программа проверки первых двух симолов файла.
//Путь к папке с файлами: dir_base_file = "d:\\work\\"
#include "stdafx.h"
#undef UNICODE
#include "windows.h"
#include "stdlib.h"
void rusprint(char *string);
int prov_char(char ch);
void file_name(char *str, int maxl);
int _tmain(int argc, _TCHAR* argv[]) //главная функция программы
{
int flag1, flag2, flag_exit;
char c1, c2;
char *s, *namef, *adress;
char *dir_base_file = "d:\\work\\"; //путь к папке с файлами данных
FILE *data_base;
int maxl = 7; //максимальная длина имени файла (без расширения)
flag_exit = 0;
namef = (char*) calloc(maxl+1, sizeof(char)); //выделяем память для строки с именем файла
adress = (char*) calloc(100, sizeof(char)); //выделяем память для строки с адресом файла
s = (char*) calloc(100, sizeof(char)); //выделяем память для строки запроса
do //цикл управления работой программы
{
system("cls");
rusprint(" ПРОВЕРКА ПЕРВЫХ ДВУХ СИМВОЛОВ ФАЙЛА:\n");
printf("_____________________________________________________________________\n");
rusprint(" Введите имя файла: ");
printf("%s", dir_base_file);
file_name(namef, maxl); //функция ввода и проверки имени файла с клавиатуры
strcpy(adress, dir_base_file); //копируем путь в строку адреса
strcat(adress, namef); //копируем имя в строку адреса
if (fopen(adress, "r") == NULL) //проверяем существование файла путем его открытия
{
rusprint(" Такого файла не существует.\n");
}
else
{
data_base = fopen(adress, "r"); //если файл существует, то открываем его для чтения
c1 = fgetc(data_base); //считываем 1 символ из файла
c2 = fgetc(data_base); //считываем второй символ из файла
fclose(data_base); //закрываем файл данных
if (c1 != EOF && c2 != EOF) //если оба символа удалось считать из файла
{
flag1 = flag2 = 0;
flag1 = prov_char(c1); //проверяем первый символ
flag2 = prov_char(c2); //проверяем второй символ
if (flag1 == 0 && flag2 == 0) //если оба символа являются цифрами:
{
rusprint("\n Первые 2 символа файла являются цифрами.\n\n");
}
else
{
rusprint("\n Первые 2 символа файла НЕ являются цифрами.\n\n");
}
}
else //если не удалось считать 2 символа из файла:
{
rusprint(" Не удается считать 2 символа из файла. Проверьте содержимое файла.\n");
}
}
rusprint(" Завершить программу? (y/n): ");
scanf("%s", s); //считываем введенную строку символов
if (*s == 'y') //если введен "у", то завершаем программу; иначе - повторяем цикл
{
flag_exit = 1;
}
}
while(flag_exit == 0);
free(adress); //освобождаем память строки адреса
free(namef); //освобождаем память строки имени
free(s); //освобождаем память строки запроса
return 0;
}
void rusprint(char *string) //функция вывода на экран русских строк
{
char *strrus;
strrus = (char*) calloc(100, sizeof(char)); //выделяем память под преобразованную строку
::CharToOem(string, strrus); //перекодируем массив cимволов
printf("%s", strrus); //выводим преобразованную строку на экран
free(strrus); //освобождаем память
}
int prov_char(char ch) //функция проверки символов
{
int flag, j;
flag = 0;
j = int(ch); //преобразуем тип данных
if(j<48 || j>57) //проверяем на соответствие
{
flag = 1;
}
return flag; //возвращаем флаг
}
void file_name(char *str, int maxl) //функция считывания с клавиатуры имени файла str максимальной длинны maxl (без расширения)
{
char *s; //объявляем строку символов
int i, j, flag;
s = (char*) calloc(100, sizeof(char)); //выделяем память для строки запроса
do
{
scanf("%s", s); //считываем введенную строку символов
flag = 0;
for (i = 0; s[i] != NULL && flag == 0; i++) //посимвольно проверяем введенную строку пока нету ошибки в строке и пока не достигнут конец строки
{
if (i >= maxl && s[i] != NULL) //если превысили максимальную длинну строки, то выводим сообщение и повторяем ввод
{
flag = 1; //код ошибки 1 - превышение максимальной длины
rusprint(" Ошибка: максимальная длинна имеин файла 7 букв.\n");
rusprint(" Повторите ввод: ");
}
else //пока не привысим максимальную длину строки:
{
j = int(s[i]); //проверяем посимвольно строку на вхождение символа в заданный интервал для латинских букв
if(j<65 || (j>90 && j<97) || j>122)
{
rusprint(" Ошибка: неправильно введено имя файла, допустимы только англ. буквы.\n");
rusprint(" Повторите ввод: ");
flag = 2; //код ошибки 2 - недопустимые символы
}
}
}
}
while (flag != 0); //повторяем цикл считывания и преобразования пока есть данные об ошибке
strcpy(str, s); //копируем проверенную строку для ее передачи в другую функцию
free(s); //освобождаем память строки запроса
s = NULL;
}