Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Форматированный ввод данных



Функция scanf () (прототип содержится в файле stdio.h) обеспечивает форматированный ввод. Ее можно записать в следующем формальном виде:

int scanf ("управляющая строка", аргумент_1, аргумент_2,...);

Аргументы scanf () должны быть указателями на соответствующие значения. Для этого перед именем переменной записывается символ &. Назначение указателей будет подробно рассмотрено далее.

Управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов. В нее могут включаться:

· пробелы, символы табуляции и перехода на новую строку (все они игнорируются);

· спецификации преобразования, состоящие из знака %, возможно, символа * (запрещение присваивания), возможно, числа, задающего максимальный размер поля, и самого символа преобразования;

· обычные символы, кроме % (считается, что они должны совпадать с очередными неизвестными символами во входном потоке).

Рассмотрим символы преобразования функции scanf () (указываются после символа %):

с -м на входе ожидается появление одиночного символа;

d или i - на входе ожидается десятичное целое число и аргумент является указателем на переменную типа int;

D или l -м на входе ожидается десятичное целое число и аргумент является указателем на переменную типа long;

e или Е - на входе ожидается вещественное число с плавающей точкой;

f - на входе ожидается вещественное число с плавающей точкой;

g или G - на входе ожидается вещественное число с плавающей точкой;

о - на входе ожидается восьмеричное целое число и аргумент является указателем на переменную типа int;

О - на входе ожидается восьмеричное целое число и аргумент является указателем на переменную типа long;

s - на входе ожидается появление строки символов;

х - на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа int;

Х - на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа long;

р - на входе ожидается появление указателя в виде шестнадцатеричного числа;

n - применяется в операциях форматирования. Аргумент, соответствующий этому символу спецификации, должен быть указателем на целое. В него возвращается номер позиции (после ввода), в которой записана спецификация % n;

u - на входе ожидается беззнаковое целое число и аргумент является указателем на переменную типа unsigned int;

U - на входе ожидается беззнаковое целое число и аргумент является указателем на переменную типа unsigned long;

[ ] - сканирует входную строку для получения символов.

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

F - изменяет указатель, заданный по умолчанию, на указатель типа far;

N - изменяет указатель, заданный по умолчанию, на указатель типа near;

h - преобразует аргумент к типу short int (может записываться перед символами d, i, о, u, х);

l - преобразует аргумент к типу long int (может записываться перед символами d, i, o, u, x);

L - преобразует аргумент к типу long double (может записываться перед символами е, f, g).

Ввести целое число (int a;), символ (char b;) и вещественное число (float t;) можно так:

scanf("%d", &a);

scanf("%c", &b);

scanf("%d%c%f", &a, &b, &t);

Замечание. Функция scanf () осуществляет "чтение" данных из стандартного потока ввода stdin в соответствии со значениями спецификаторов, указанных в управляющей строке. Процесс "чтения" данных из потока синхронизирован с их извлечением. По организации механизма размещения данных stdin представляет собой дек, то есть очередь, реализованную по правилу " FIFO " (Fist Input Fist Output – первым пришел, первым вышел). Однако, если в потоке stdin нет данных нужного типа, функция scanf () не может их самостоятельно извлечь. Для очистки потока stdin используется функция fflush (), объявленная в файле stdio.h. Поэтому организация ввода данных в формате должна быть реализована по следующей схеме:

int Flag; // переменная, для чтения результата вызова

// функции scanf()

int X1; // инициализируемая переменная, значение которой,

// например, должно быть в диапазоне от 0 до 10

do

{

printf("\nВведите значение целочисленной переменной X1:");

Flag=scanf("%d",&X1);

if(Flag==0||Flag==EOF)

{

printf("\a Ошибка ввода данных."

"\n-------------------------------"

"\n Повторная инициализации");

fflush(stdin);

}

if(X1<0||X1>40)

{

printf("\nВводимое значение должно быть в диапазоне"

" от 0 до 40. Повторите ввод значения"

" переменной.");

Flag=0;

}

}while(Flag==0||Flag==EOF);


ПРИЛОЖЕНИЕ 2.

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

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <process.h>

int *A, *B; /* Указатели на динамические массивы */

int numbRows, numbCols; /* Размерности массивов */

char *exitMsg="Для завершения работы программы нажмите”

“ на любую клавишу...";

/*.......Блок объявления пользовательских функций....... */

void transp(int *arr1, int *arr2, int nRows, int nCols);

void initSizeTable(void);

void CreateTable(void);

void inputCountTable(int *arr, int nRows, int nCols);

void displTable(int *arr, int nRows, int nCols);

/*................Точка входа в программу............... */

int main(void)

{

clrscr(); /* Очистка экрана */

initSizeTable();

CreateTable();

inputCountTable(A,numbRows,numbCols);

clrscr();

printf("\nИсходная матрица-массив %d*%d:",numbRows,numbCols);

displTable(A,numbRows,numbCols);

transp(A,B,numbRows,numbCols);

printf("\nТранспонированная матрица-массив %d*%d:",

numbCols,numbRows);

displTable(B,numbCols,numbRows);

printf(exitMsg);

(void)getch();

free(A);

free(B);

clrscr();

printf("\nПравило хорошего тона: уходя уходи...");

return 0;

}

/*.......Блок определения пользовательских функций....... */

/*

Функция транспонирования матрицы –

целочисленного динамического массива:

int *arr1 - указатель на исходную матрицу-массив,

int *arr2 - указатель на транспонированную матрицу-массив.

*/

void transp(int *arr1, int *arr2, int nRows, int nCols)

{

int rows, cols;

for(rows=0;rows<nRows;rows++)

for(cols=0;cols<nCols;cols++)

*(arr2+cols*nRows+rows)=*(arr1+rows*nCols+cols);

}

/*

Функция для отображения двумерного массива в текстовом режиме

на экране компьютера с формированием фона за отображаемыми

данными.

*/

void displTable(int *arr, int nRows, int nCols)

{

int rows, cols;

int curX, curY;

printf("\n");

curX=wherex();

curY=wherey();

textbackground(LIGHTBLUE);

for(int i=0; i<nRows; i++)

{

for(int j=0; j<nCols*8; j++)

{

printf(" ");

}

printf("\n");

}

gotoxy(curX,curY);

for(rows=0; rows<nRows; rows++)

{

for(cols=0; cols<nCols; cols++)

cprintf("%6d ",*(arr+rows*nCols+cols));

printf("\n");

}

textbackground(BLACK);

}

/* Инициализация глобальных переменных - размерностей массива */

void initSizeTable(void)

{

printf("Введите количество строк: ");

scanf("%d",&numbRows);

printf("Введите количество столбцов: ");

scanf("%d",&numbCols);

}

/* Выделение памяти для динамических массивов */

void CreateTable(void)

{

if((A=(int*)calloc(numbRows*numbCols, sizeof(int)))==NULL)

{

printf("\nОшибка при создании массива А.");

printf("\nНет доступной оперативной памяти.");

printf(exitMsg);

(void)getch();

exit(-1);

}

if((B=(int*)calloc(numbRows*numbCols, sizeof(int)))==NULL)

{

printf("\nОшибка при создании массива В.");

printf("\nНет доступной оперативной памяти.");

printf(exitMsg);

(void)getch();

exit(-1);

}

}

/* Инициализация значений двумерного массива, переданного по ссылке Пользователь может прервать ввод значений, нажав комбинацию клавиш Ctrl+Z */

void inputCountTable(int *arr, int nRows, int nCols)

{

printf("\nИнициализация значений массива:\n");

printf("Замечание: чтобы прервать ввод данных”

“ нажмите Ctrl+Z\n");

printf("Неинициализированные значения будут заполнены”

“ нулями.\n");

for(int rows=0; rows<nRows; rows++)

for(int cols=0; cols<nCols; cols++)

{

printf("Введие значение А[%d][%d]: ",rows,cols);

if(scanf("%d",(arr+rows*nCols+cols))==EOF)

{

printf("\nДосрочный выход из блока ввода данных...");

goto END;

}

}

END: printf("\nВвод данных окончен. Нажмите любую клавишу для”

“ продолжения...");

(void)getch();

}

Листинг 2. Программная реализация генератора псевдо-случайных чисел (ГПСЧ), подчинённых нормальному закону распределения; табличное постраничное отображение смоделированных данных, их сортировка и отображение упорядоченной по возрастанию последовательности.

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <process.h>

#include <math.h>

long int X1, X2;

float Mo, SKO;

FILE *out, *out1;

double Ravn1(void);

double Ravn2(void);

double Norm(void);

void StrSel(double *A, int nn);

void DispArr(double *A, int nn);

void fileRes(FILE *a, double *A, int nn);

char *msg1="\nПолучение выборки ПСЧ, подчиненных нормальному “

“закону распределения";

char *msg2="ОШИБКА: нет доступной свободной оперативной памать!\n"

"Перегрузите работающую DOS-сессию, из которой запускается”

“ программа.";

char *msgExit="Для завершения работы программы нажмите любую”

“ клавишу...";

char *msgRes="\n\tРабота программы завершена."

"\n\tВыходные данные моделирования сохранены в текстовых”

“ файлах: "\n\tВ файле GAUS_RES.TXT - полученная “

“последовательность ПСЧ, "\n\tа в файле GAUS_RES1.TXT”

“ отсортированные в порядке возрастания \n\t значений “

“для дальнейшей обработки и построения гистограммы.\n";

int main(void)

{

int n; /* Количество генерируемых значений */

double *arr; /* Указатель на динамический массив данных */

int i;

clrscr();

printf(msg1);

printf("\n");

for(i=0;i<80;i++) putch('*');

printf("\n\Введите объем выборки (целое положительное число”

“ не более 100): ");

scanf("%d",&n);

if((arr=(double*)calloc(n,sizeof(double)))==NULL)

{

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

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

(void)getch();

exit(-1);

}

//arr1=arr;

if((out=fopen("gaus_res.txt","w+"))==NULL)

{

puts("\n\tОШИБКА: Не удалось создать файл для “

“результатов...\n");

printf("Вывод данных будет осуществляться только на “

“экран!\n");

}

if((out1=fopen("gaus_res1.txt","w+"))==NULL)

{

puts("\n\tОШИБКА: Не удалось создать файл для “

“результатов...\n");

printf("Вывод данных будет осуществляться только на “

“экран!\n");

}

printf("\n\tВведите значение для инициализации ГПСЧ, “

“Х1[0]:");

scanf("%ld",&X1);

printf("\n\tВведите значение для инициализации ГПСЧ, “

“Х2[0]:");

scanf("%ld",&X2);

/* Блок формирования результатов */

printf("\nИнициализация параметров распределения\n");

for(i=0;i<80;i++) putch('*');

printf("Введите значения математического ожидания Мо: ");

scanf("%f",&Mo);

printf("Введите значение среднего квадратичного отклонения “

“СКО: ");

scanf("%f",&SKO);

/* Формирование "нормальной" последовательности */

for(i=0;i<n;i++)

{

*(arr+i)=Norm();

}

getch();

clrscr();

printf("Полученная последовательность:\n");

for(i=0;i<n;i++)

{

fprintf(out,"\n A[%d]: %7.2f",i,*(arr+i));

}

DispArr(arr,n);

if((fclose(out))!=NULL)

{

puts("\n\tCannot close file results");

}

printf("\n\tДля продолжения нажмите любую клавишу.");

getch();

clrscr();

printf("\n\tДанные, упорядоченные по возрастанию:");

(void)getch();

StrSel(arr,n);

DispArr(arr,n);

if((fclose(out1))!=NULL)

{

puts("\n\tCannot close file results");

}

free(arr);

printf(msgRes);

printf("\n\t%s",msgExit);

(void)getch();

// clrscr();

return 0;

}

/* ************************************************************ */

double Ravn1(void)

{

X1=(430*X1+2531)%11979;

return X1/11979.;

}

double Ravn2(void)

{

X2=(430*X2+2531)%11979;

return X2/11979.;

}

double Norm(void)

{

return (Mo+SKO*sqrt(-2*log(Ravn1()))*cos(2*M_PI*Ravn2()));

}

/* Функция сортировки методом Прямого выбора */

void StrSel(double *A, int nn)

{

int i,j,k;

double x;

for(i=0;i<nn-1;i++)

{

x=*(A+i); k=i;

for(j=i+1;j<nn;j++)

if(*(A+j)<x)

{

k=j; x=*(A+k);

}

*(A+k)=*(A+i); *(A+i)=x;

}

}

void DispArr(double *A, int nn)

{

/* Данные отображаются постранично в виде таблицы из 5 столбцов */

int page,index=0,i,j;

page=nn/100+1;

while(page>0)

{

clrscr();

for(i=0;i<5;i++)

{

for(j=0;j<20;j++)

{

if(index>=nn) break; /* Вывод окончен */

gotoxy(i*16+1,j+2);

printf("%3d %.2f",index,*(A+index));

index++;

}

if(index>=nn) break;

}

gotoxy(2,23);

printf("Для продолжения нажмите любую клавишу...");

(void)getch();

page--;

}

printf("\nДанные выведены полностью. Нажмите любую клавишу”

“ для продолжения.");

(void)getch();

clrscr();

}

void fileRes(FILE *a, double *A, int nn)

{

/* Данные отображаются постранично в виде таблицы из 5 столбцов */

int page,col,blok,numbPage=0,index=0,i,j;

page=nn/100+1;

while(page>1)

{

for(i=0;i<20;i++)

{

for(j=0;j<5;j++)

{

index=numbPage*100+j*20+i;

fprintf(a,"%3d %.2f",index,*(A+index));

}

fprintf(a,"\n");

//if(index>=nn) break;

}

numbPage++;

page--;

}

/* Формирование неполной страницы... */

blok = nn-index; /* Вычисляем, сколько элементов осталось

вывести...*/

col=blok/20;

if(blok%20>0) col++;

for(i=0;i<20;i++)

{

for(j=0;j<5;j++)

{

index=numbPage*100+j*20+i;

if(index>=nn)continue;

fprintf(a,"%3d %.2f",index,*(A+index));

}

fprintf(a,"\n");

//if(index>=nn) break;

}

}






Дата публикования: 2014-11-18; Прочитано: 402 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2025 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.61 с)...