Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17107 / 2712 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 4:

Операторы

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >

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

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

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

Пример:

int 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:

/*квадраты чисел*/
int main( ) /*получение квадратов*/
{
	int n=1;
	while(n < 11) {
		printf("%10d %10d\n", n, n*n);
		n=n+1;
	}
}

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

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

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

/* пшеница*/
#include <stdio.h> 
#define NUMBER 64 /* число клеток на шахматной доске*/
#define CROP 7E14 /* весь урожай пшеницы, 
	выраженный в числе зерен*/
int 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 до закрывающей фигурной скобки.

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Вадим Ратьков
Вадим Ратьков
Россия, Красноярск, СФУ ИППС