![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Функция 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!