Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на Си.doc
Скачиваний:
361
Добавлен:
02.05.2014
Размер:
1.3 Mб
Скачать

Применение функции scanf( )

Поскольку мы будем пользоваться функцией scanf( )эпизодически, мы рассмотрим здесь только основные особенности ее применения. Для функцииscanf( )указывается управляющая строка и следующий за ней список аргументов. Основное различие функцийprintf( )иscanf( )заключается в особенностях данного списка. Функцияprintf( )использует имена переменных, константы и выражения, а функцияscanf( )- только указатели на переменные. Мы ничего не должны знать о таких указателях. Необходимо помнить только два правила:

1. Если нам нужно ввести некоторое значение и присвоить его переменной одного из основных типов, то перед именем переменной требуется писать символ &.

2. Если мы хотим ввести значение строковой переменной, использовать символ & не нужно.

Пример:

main()

{

int age;

float assets;

char fio[50];

printf("Введите ваш возраст, оклад, фамилию. \n");

scanf("%d %f", &age, &assets);

scanf("%s", fio); /* & отсутствует при указании

массива символов */

printf("%d $%.0f %s\n",age, assets, fio);

}

Функция scanf( )использует некоторые специальные знаки, пробелы, символы табуляции и "новая строка", для разбиения входного потока символов на отдельные поля. Она согласует последовательность спецификаций преобразования с последовательностью полей, опуская упомянутые специальные знаки между ними. Исключением является спецификация %c , обеспечивающая чтение каждого следующего символа даже в том случае, если это пустой символ.

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

1. Отсутствует спецификация %g.

2. Спецификации %f и %e эквивалентны. Обе спецификации допускают наличие или отсутствие знака строки цифр с десятичной точкой или без нее и поля показателя степени.

3. Для чтения целых чисел типа short применяется спецификация %h.

Функция scanf( )не является одной из наиболее часто используемых функций языка Си. Мы обсуждаем ее из-за универсальности.

Особенности работы с языком Си. Задание фиксированной ширины полей оказывается полезным при печати данных столбиком.

Например:

printf("%d %d %5d\n",val1,val2, val3);

Результат выглядит так:

11 222 3333

4 5 23

22222 3332 11111

Эти же данные можно представить в улучшенном виде, если задать достаточно большую фиксированную ширину поля:

printf("%9d %9d %9d\n" val1,val2, val3);

Результат будет выглядеть так:

11 222 3333

4 5 23

22222 3332 11111

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

А теперь рассмотрим два примера работы с циклом while:

/*квадраты чисел*/

main( ) /*получение квадратов*/

{

int n=1;

while(n < 11) {

printf("%10d %10d\n", n, n*n);

n=n+1;

}

}

Эта программа выводит на печать первые 10 чисел и их квадраты.

Второй пример.

Согласно легенде, один правитель обещал наградить ученого, оказавшего ему большую услугу. Ученый, когда его спросили, что бы он хотел получить в награду, указал на шахматную доску и сказал: "Положите одно пшеничное зерно на первую клетку, два - на вторую, четыре на третью, восемь на следующую и т.д." Правитель был поражен, услышав такую скромную просьбу. Программа, приведенная ниже, показывает, в какое положение попал правитель!

/* пшеница*/

#define NUMBER 64 /* число клеток на шахматной доске*/

#define CROP 7E14 /* весь урожай пшеницы,

выраженный в числе зерен*/

main( )

{

double current, total;

int count =1;

printf("КЛЕТКА ЧИСЛО СУММА ЗЕРЕН ДОЛЯ\n");

total = current = 1.0;/*начинаем с одного зерна*/

printf("%4d %15.2e %13.2e %12.2e\n",count,

current, total, total/CROP);

while(count < NUMBER) {

count = count + 1;

current = 2.0*current;

/*удвоенное число зерен на следующей клетке */

total = total +current; /* коррекция суммы*/

printf ("%4d %15.2e %13.2e %12.2e\n",count,

current, total, total/CROP);

}

}

Это пример составного оператора. От открывающей фигурной скобки оператораwhileдо закрывающей фигурной скобки.

Составной оператор используется в следующих случаях:

1. Чтобы сгруппировать несколько логических связанных операторов в один оператор.

2. В качестве тела функции.

3. Для ограничения видимости определений частью программы, т.е. для локализации действия описаний.

Составной оператор имеет следующую форму:

{

определения и описания

операторы

}

Определения переменных внутри составного оператора имеют больший приоритет, чем определения переменных с тем же именем для области действия составного оператора. Эти переменные видимы, т.е. доступны, только внутри составного оператора. Глобальные переменные являются видимыми внутри составного оператора только при условии, что их определения не изменены локальными определениями.

! Применяйте отступы от поля в строках, чтобы сделать структуру программы наглядной!