Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №1 Вариант №1

.doc
Скачиваний:
19
Добавлен:
20.06.2014
Размер:
2.39 Mб
Скачать

2

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

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

по дисциплине

«Программирование на языке высокого уровня»

на тему:

«Указатели, динамическое выделение памяти, работа с файлом»

Студент

подпись, дата

фамилия, инициалы

Группа

Принял

Фарафонов А.С.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2010

  1. Задание

Задание

Программа должна предоставлять возможность нескольким пользователям работать с числовыми данными. Сведения о пользователях должны храниться в отдельном текстовом файле пользователей: для каждого пользователя указывается имя пользователя и пароль (пароль в файле должен храниться задом наперед). Числовые данные всех пользователей хранятся в одном файле данных.

  1. При запуске программы необходимо запросить имя пользователя и его пароль (при вводе пароля на экране отображать символы «*» вместо реально вводимых символов).

  2. Если имя пользователя найдено в файле пользователей и введенный пароль верен, то загружаются пользовательские числовые данные. В противном случае должно выдаваться сообщение об ошибке и завершение программы.

  3. Программа должна предоставлять пользователю следующие возможности по работе с числовыми данными:

  1. Вывод элементов массива X

  2. Добавление нового элемента в конец массива X

  3. Удаление элемента из массива X

  4. Расчет заданной функции F(X) над элементами массива X и вывод значения функции пользователю.

  5. Расчет элементов массива Y по формуле Yi=G(Xi) и вывод их пользователю в виде

y[1] = 3.543

y[2] = 6.422

y[3] = -14.223

…………

При выводе округлять значения Yi до 3-х знаков после запятой.

F

G

1

Сумма

  1. Блок-схема

  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();

}

  1. Контрольный пример

Пример содержимого файла:

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

  1. Выводы о проделанной работе

При выполнении данной лабораторной работы я научился работать с файлами, считывать и записывать информацию. Также получил знания по работе с динамическими массивами и указателями.

  1. Список использованной литературы

  1. Шилдт Г. Искусство программирования на C++. БХВ.2005

  2. Шилдт Г. C++ Руководство для начинающих. Вильямс.2005

  3. Страуструп Б. Язык программирования С++. Специальное издание, 3-изд. Бином.2004