Лабораторная работа №1 Вариант №1
.doc
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №1
по дисциплине
«Программирование на языке высокого уровня»
на тему:
«Указатели, динамическое выделение памяти, работа с файлом»
|
Студент |
|
|
|
|
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
|
|
||||||||
|
|
|
|
|
Фарафонов А.С. |
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2010
-
Задание
Задание
Программа должна предоставлять возможность нескольким пользователям работать с числовыми данными. Сведения о пользователях должны храниться в отдельном текстовом файле пользователей: для каждого пользователя указывается имя пользователя и пароль (пароль в файле должен храниться задом наперед). Числовые данные всех пользователей хранятся в одном файле данных.
-
При запуске программы необходимо запросить имя пользователя и его пароль (при вводе пароля на экране отображать символы «*» вместо реально вводимых символов).
-
Если имя пользователя найдено в файле пользователей и введенный пароль верен, то загружаются пользовательские числовые данные. В противном случае должно выдаваться сообщение об ошибке и завершение программы.
-
Программа должна предоставлять пользователю следующие возможности по работе с числовыми данными:
-
Вывод элементов массива X
-
Добавление нового элемента в конец массива X
-
Удаление элемента из массива X
-
Расчет заданной функции F(X) над элементами массива X и вывод значения функции пользователю.
-
Расчет элементов массива Y по формуле Yi=G(Xi) и вывод их пользователю в виде
y[1] = 3.543
y[2] = 6.422
y[3] = -14.223
…………
При выводе округлять значения Yi до 3-х знаков после запятой.
№ |
F |
G |
1 |
Сумма |
-
Блок-схема
-
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
void PasswordTest(int *n){
char File[]="I:/1.txt", UserName[20], Password[10], P1[20], P2[100];
FILE *fl;
int p=0, p1=0, p2=0,x, i=-1;
if ((fl=fopen(File,"r+"))==NULL)//открытие файла для чтения
{
printf("Ошибка 0: невозможно открыть файл\n");
getch();
exit(1);
}
printf("Введите имя пользователя:\t");//ввод данных
gets(UserName);
printf("Введите пароль(8 символов):\t");
for(int i=0;i<8;i++)//считывание пароля
{
Password[i]=getch();
printf("*");
if(i==7)
Password[8]='\0';
}
strrev(Password);//обращение пароля
while(!feof(fl))//проверка именя пользователя и пароля
{
if(p==0)
*n=*n+1;
p1=0;
p2=0;
fgets(P2,100,fl);
fgets(P1,20,fl);
fgets(P2,10,fl);
for(int i=0;i<8;i++)//проверка пароля
if(Password[i]==P2[i])
p2++;
if(strlen(UserName)==(strlen(P1)-1))//имени пользователя
for(int i=0;i<strlen(P1);i++)
if(UserName[i]==P1[i])
p1++;
if((p1==strlen(UserName))&&(p2==8))
p=1;//если пароль и имя соответственно совпадают
}
if(p==0)//если не совпадают
{
printf("\nОшибка 1: Пароль или имя пользователя введены неправильно");
getch();
exit(1);
}
fclose(fl);//закрытие файла
}
void PoluchenieMassiva(int n, int **x, int *kol)
{
int k=0, p=0, *X, j=0;
char File[]="I:/1.txt", E[100]="", num[10]="";
FILE *fl;
if((fl=fopen(File,"r+"))==NULL)
{
printf("Ошибка 2: невозможно открыть память\n");
getch();
exit(1);
}
while(k!=n)//перенос курсора на нужного пользователя
{
k++;
if(k!=n)
for(int i=0;i<3;i++)
fgets(E,100,fl);
}
fgets(E,100,fl);//считывание строки с массивом
for(int i=0;i<strlen(E);i++)//подсчет количества элементов массива
if(E[i]==' ')
p++;
*kol=p;
X = (int (*)) malloc(p*sizeof(int));//выделение памяти под массив
if(!X)
{
printf("Ошибка 4: Требуемая память не выделена.\n");
getch();
exit(1);
}
p=0;
for(int i=0;i<strlen(E);i++)//разбиение строки на элементы массива
{
if(E[i]!=' ')
{
num[j]=E[i];
j++;
}
else
{
X[p]=atoi(num);
j=0;
for(int q=0;q<strlen(num);q++)
num[q]=' ';
p++;
}
}
*x=X;
}
void VyvodX(int **x, int kol)
{
for(int i=0;i<kol;i++)//вывод массива
printf("\nX[%d] = %d",i,*(*x+i));
}
void Dobavlenie(int **x,int kol,int n)
{
double u, xp=0;
int max_length=0,kol_strok=0;
char File[]="I:/1.txt", S[100]="", chislo[50], Str[100]="", **Mas_file_strings;
FILE *fl;
if((fl=fopen(File,"r+"))==NULL)
{
printf("\nОшибка 9: Ошибка при открытии файла");
getch();
exit(1);
}
while(!feof(fl))
{
fgets(S,100,fl);
kol_strok++;//подсчет количества строк в файле
if(strlen(S)>max_length)//подсчет максимальной длины строки в файле
max_length=strlen(S);
}
fclose(fl);
Mas_file_strings=(char **)malloc(kol_strok*sizeof(char));//выделение памяти одномерный массив, по количеству строк
if(!Mas_file_strings)
{
printf("Ошибка 6: Требуемая память не выделена.\n");
getch();
exit(1);
}
for(int i=0;i<kol_strok;i++)
{
Mas_file_strings[i]=(char *)malloc((max_length+11)*sizeof(char));//выделение памяти под двумерный массив, по колисеству элементов в строки + 10 элементов (для добавления)
if(!Mas_file_strings)
{
printf("Ошибка 7: Требуемая память не выделена.\n");
getch();
exit(1);
}
}
if((fl=fopen(File,"r+"))==NULL)
{
printf("\nОшибка 8: Ошибка при открытии файла");
getch();
exit(1);
}
for(int i=0;i<kol_strok;i++)
{
fgets(S,(max_length+10),fl);
for(int j=0;j<(max_length+10);j++)
Mas_file_strings[i][j]=S[j];//запись файла в массив
}
printf("\nВведите число, которое хотите добавить в конец массива:");
scanf("%lf",&xp);//ввод нового элемента
for(int i=1;i<n;i++)//считывание до нужной строки, курсор переносится на нужную строку
for(int j=0;j<3;j++)
fgets(S,100,fl);
for(int i=0;i<kol;i++)//формирование строки с массивом
{
u=(double)*(*x+i);
gcvt(u,15,chislo);
strcat(Str,chislo);
Str[strlen(Str)-1]=' ';
}
gcvt(xp,15,chislo);
strcat(Str,chislo);//добавление элемента
Str[strlen(Str)-1]=' ';
strcat(Str,"\n");//окончательный вариант строки Str
n--;
rewind(fl);
for(int i=0;i<=strlen(Str);i++)
Mas_file_strings[(n*3)][i]=Str[i];
for(int i=0;i<kol_strok;i++)
fprintf(fl,"%s", Mas_file_strings[i]);
printf("\nОперация произведена успешно!\n");
fclose(fl);
}
void Udalenie(int **x,int kol,int n)
{
double u;
int max_length=0,kol_strok=0, xp=0;
char File[]="I:/1.txt", S[100]="", chislo[50], Str[100]="", **Mas_file_strings;
FILE *fl;
if((fl=fopen(File,"r+"))==NULL)
{
printf("\nОшибка 9: Ошибка при открытии файла");
getch();
exit(1);
}
while(!feof(fl))
{
fgets(S,100,fl);
kol_strok++;//подсчет количества строк в файле
if(strlen(S)>max_length)//подсчет максимальной длины строки в файле
max_length=strlen(S);
}
fclose(fl);
printf("\n%d\t%d\n",kol_strok,max_length);
Mas_file_strings=(char **)malloc(kol_strok*sizeof(char));//выделение памяти одномерный массив, по количеству строк
if(!Mas_file_strings)
{
printf("Ошибка 6: Требуемая память не выделена.\n");
getch();
exit(1);
}
for(int i=0;i<kol_strok;i++)
{
Mas_file_strings[i]=(char *)malloc((max_length+11)*sizeof(char));//выделение памяти под двумерный массив, по колисеству элементов в строки + 10 элементов (для добавления)
if(!Mas_file_strings)
{
printf("Ошибка 7: Требуемая память не выделена.\n");
getch();
exit(1);
}
}
if((fl=fopen(File,"r+"))==NULL)
{
printf("\nОшибка 8: Ошибка при открытии файла");
getch();
exit(1);
}
for(int i=0;i<kol_strok;i++)
{
fgets(S,(max_length+10),fl);
for(int j=0;j<(max_length+10);j++)
Mas_file_strings[i][j]=S[j];//запись файла в массив
}
printf("\nВведите элемент, который хотите удалить из массива:");
scanf("%d",&xp);//ввод номера удаляемого элемента
for(int i=1;i<n;i++)//считывание до нужной строки, курсор переносится на нужную строку
for(int j=0;j<3;j++)
fgets(S,100,fl);
for(int i=0;i<kol;i++)//формирование строки с массивом
{
if(i!=(xp-1))
{
u=(double)*(*x+i);
gcvt(u,15,chislo);
strcat(Str,chislo);
Str[strlen(Str)-1]=' ';
}
}
Str[strlen(Str)-1]=' ';
strcat(Str,"\n");//окончательный вариант строки Str
n--;
rewind(fl);
for(int i=0;i<=strlen(Str);i++)
Mas_file_strings[(n*3)][i]=Str[i];
for(int i=0;i<kol_strok;i++)
fprintf(fl,"%s", Mas_file_strings[i]);
printf("\nОперация произведена успешно!\n");
fclose(fl);
}
void RaschetFunction(int **x, int kol)
{
int summa=0;
for(int i=0;i<kol;i++)
summa=summa+(*(*x+i));
printf("Сумма элементов массива= %d",summa);
}
void RaschetY(int **x, int kol)
{
float *F;
F=(float *)malloc(kol*sizeof(int));
for(int i=0;i<kol;i++)
{
if(*(*x+i)<0)
{
F[i]=(float)5*(*(*x+i))*(*(*x+i))+3;
}
else if((*(*x+i)>=0)&&(*(*x+i))<=20)
{
if(*(*x+i)!=1)
F[i]=(float)(*(*x+i)-5)/(*(*x+i)-1);
else
{
printf("\nОшибка вычисление, х не может быть равен 1\n");
F[i]=NULL;
}
}
else if(*(*x+i)>20)
{
F[i]=(float)*(*x+i)/6;
}
}
for(int i=0;i<kol;i++)
printf("F[%d]= %.3f\n",i,F[i]);
}
void main()
{
int k, n=0, *x, kol, kol_strok=0, max_length, *L;
setlocale(LC_ALL,"Russian");
PasswordTest(&n);//проверка на наличие в файле имени пользователя и пароля
re: printf("\n\nЧто вы хотите делать\n1:Вывод элементов массива Х\n2:Добавление нового элемента в конец массива Х\n3:Удаление элемента из массива Х\n4:Рассчет заданной функции над элементами массива Х и вывод значений\n5:Рассчет элементов массива Y по формуле Y=G(X) и вывод их пользователю\n");
scanf("%d",&k);
switch(k)//выбор действия
{
case 1:
PoluchenieMassiva(n, &x, &kol);//считывание массива из файла
VyvodX(&x, kol);//вывод массива
break;
case 2:
PoluchenieMassiva(n, &x, &kol);//считывание массива из файла
Dobavlenie(&x, kol, n);//добавление элемента
break;
case 3:
PoluchenieMassiva(n, &x, &kol);//считывание массива из файла
Udalenie(&x, kol, n);//удаление жлемента
break;
case 4:
PoluchenieMassiva(n, &x, &kol);//считывание массива из файла
RaschetFunction(&x,kol);//расчет функции
break;
case 5:
PoluchenieMassiva(n, &x, &kol);//считывание массива из файла
RaschetY(&x, kol);//расчет по системе
break;
default:
exit(1);//выход
}
goto re;//возврат к выбору действия
getch();
}
-
Контрольный пример
Пример содержимого файла:
12 65 98 23 12 -1 1 5 666 -13
admin
11111111
-1 2 3 4 5 -20 12 30
OLOLO
22222222
1 2 4 5 6 -666
KOT
876543214321
-
Выводы о проделанной работе
При выполнении данной лабораторной работы я научился работать с файлами, считывать и записывать информацию. Также получил знания по работе с динамическими массивами и указателями.
-
Список использованной литературы
-
Шилдт Г. Искусство программирования на C++. БХВ.2005
-
Шилдт Г. C++ Руководство для начинающих. Вильямс.2005
-
Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004