Ввод-вывод в Си

Язык Си / Ввод-вывод в Си

 

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h. Эта библиотека содержит функции

  • printf() — для вывода информации
  • scanf() — для ввода информации.

 

Вывод информации

Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.

Общая форма записи функции printf():

 
printf("СтрокаФорматов", объект1, объект2, ..., объектn);


СтрокаФорматов состоит из следующих элементов:

  • управляющих символов;
  • текста, представленного для непосредственного вывода;
  • форматов, предназначенных для вывода значений переменных различных типов.

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

  • ‘\n’ — перевод строки;
  • ‘\t’ — горизонтальная табуляция;
  • ‘\v’ — вертикальная табуляция;
  • ‘\b’ — возврат на символ;
  • ‘\r’ — возврат на начало строки;
  • ‘\a’ — звуковой сигнал.

 
Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:

  • %d — целое число типа int со знаком в десятичной системе счисления;
  • %u — целое число типа unsigned int;
  • %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
  • %o — целое число типа int со знаком в восьмеричной системе счисления;
  • %hd — целое число типа short со знаком в десятичной системе счисления;
  • %hu — целое число типа unsigned short;
  • %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
  • %ld — целое число типа long int со знаком в десятичной системе счисления;
  • %lu — целое число типа unsigned long int;
  • %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
  • %f — вещественный формат (числа с плавающей точкой типа float);
  • %lf — вещественный формат двойной точности (числа с плавающей точкой типа double);
  • %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
  • %c — символьный формат;
  • %s — строковый формат.

 
Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа %. После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
  int a = 5;
  float x = 2.78;
  printf("a=%d\n", a);
  printf("x=%f\n", x);
  getchar();
  return 0;
}

Результат работы программы
Вывод в Си

Тот же самый код может быть представлен с использованием одного вызова printf:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main()
{
  int a = 5;
  float x = 2.78;
  printf("a=%d\nx=%f\n", a, x);
  getchar();
  return 0;
}

Табличный вывод

При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
  float x = 1.2345;
  printf("x=%10.5f\n", x);
  getchar();
  return 0;
}

Результат выполнения
Форматированный вывод в Си

В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.

Вывод числа с указанием количества знакомест

Ввод информации

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

 
scanf ("CтрокаФорматов", адрес1, адрес2,...);


Строка форматов аналогична функции printf().
Для формирования адреса переменной используется символ амперсанд ‘&’:
адрес = &объект

Строка форматов и список аргументов для функции обязательны.

Пример на Си
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
#include <stdio.h>
#include <stdlib.h> // для перехода на русский язык
int main()
{
  float y;
  system("chcp 1251"); // переходим в консоли на русский язык
  system("cls");       // очищаем окно консоли
  printf("Введите y: "); // выводим сообщение
  scanf("%f", &y);     // вводим значения переменной y
  printf("Значение переменной y=%f", y); // выводим значение переменной y
  getchar(); getchar();
  return 0;
}

Результат работы программы:
Функция scanf()

Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку
 
#define _CRT_SECURE_NO_WARNINGS 


Другой вариант — воспользоваться функцией защищенного ввода scanf_s( ), которая появилась несколько позже, но содержит тот же самый список параметров.
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
  int a;
  printf("a = ");
  scanf_s("%d", &a);
  printf("a = %d",a);
  getchar(); getchar();
  return 0;
}


Назад: Язык Си

Комментариев к записи: 17

  • опечатка- формат не задан. нет f после y=%10.5
    1
    2
    float y=1.2345;
    printf("\n Значение переменной y=%10.5\n", y);


    • Елена Вставская
      \t - горизонтальная табуляция - отступ, чтобы при выводе значений в несколько столбиков они выводились друг под другом. \v - вертикальная табуляция - переводит курсор на следующую строку и начинает вывод не с начала строки, а с текущей позиции, но в некоторых случаях срабатывает некорректно. \a - звуковой сигнал, который слышен при "выводе на печать" этого символа.



  • Правильно ли я поняла, что для ввода 4-х значного целого числа можно использовать формат %4d , т.е  scanf("%4d", &y) ?

    • Елена Вставская
      От некорректного ввода никто не застрахован, поэтому количество цифр при вводе указывать бессмысленно. Эти форматы влияют только на вывод.


  • георгий
    подпрограмма для вывода на экран натуральных чисел из текстового файла целых чисел в 16-ричном виде. Функцию scanf не использовать. помогите решить

    • Елена Вставская
      Функцию scanf для вывода в любом случае использовать не получится :) В чём будет заключаться помощь?

  • Константин
    Не работает scanf на С.После ввода первой переменной с клавиатуры программа или завершает работу, или выводит некорректно посчитанные результаты бесконечно. Компилятор MinGW. Прилагаю код
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #define _CRT_SECURE_NO_WARNINGS // для возможности использования scanf
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    int main (void) {
      char *locale = setlocale (LC_ALL, "");
      double a, b, xk, xn, deltax, y, sum, x;
      printf("Введите число a: \n");
      scanf( "%.1lf", &a);
      printf("Введите число b: \n");
      scanf("%.1lf", &b);
      printf ("Введите число xn: \n ");
      scanf("%.1lf", &xn);
      printf("Введите число xk: \n");
      scanf("%.1lf", &xk);
      printf("Введите число dx: \n");
      scanf("%.2lf", &deltax);
      printf ("\n");
        x = xn;
        y = 0.0;
        while (x>=xn & x<=xk){
          if (xb){
          y = pow(fabs((pow(x,2)-a*exp((x-b)))),(1/3.0));
                
          printf("При х = %.2lf", x);
          printf( "   y =%lf", y);
          printf("\n");  
          };
          if (x>a & x<=6){
          sum = 0.0; 
          int k;
          for (k =5;k<=12;k++){
          sum = sum + (sqrt(k) +x)/log(k);
          };
          y = sum;

          printf("При х = %.2lf", x);
          printf( "   y =%lf", y);
          printf("\r\n");  
    }
          x+=deltax;

          };
          return 0;
        }

  • всем привет) можете мне объяснить этот код мне надо пояснение этого кода. Заранее спасибо
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // Разработать рекурсивный метод для записи числа, являющегося отражением заданного
    // натурального числа n. Пример: n=123; результат – число: 321. Выводить по одной цифре нельзя
    #include <stdio.h>
        int reverse;         
        int rev(int revNum)
        {
           if(revNum)
           {
              reverse = (reverse * 10) + (revNum % 10);
              rev(revNum/10);    //recurs vyzov
           }
           else              
            return;    //kogda obrchis raven 0 to vernutsa k abonentu
        return reverse;          
        }

       int main()
       {
           int num;
           printf("Vvesti chislo:");
           scanf("%d",&num);
           printf("Obratnoe chislo:%d\n",rev(num));
           return 0;
       }

    • Елена Вставская
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      #include <stdio.h>
      int reverse = 0; // здесь будет число с обратным порядком цифр
      int rev(int revNum) // допустим, revNum = 123
      {
        if (revNum) // если передано число больше 0
        {
          reverse = (reverse * 10) + (revNum % 10); // reverse = reverse*10+3:
                                // 1 итерация: reverse = 0*10+3
                                // 2 итерация: reverse = 3*10+2
                                // 3 итерация: reverse = 32*10+1
          rev(revNum / 10);              // 1 итерация: вызываем функцию рекурсивно для числа 12
                                // 2 итерация: вызываем функцию рекурсивно для числа 1
                                // 3 итерация: вызываем функцию рекурсивно для числа 0 (будет выход по условию в строке 5)
        }
        return reverse;  // возвращаем полученное число
      }

      int main()
      {
        int num;
        printf("Vvesti chislo:");
        scanf_s("%d", &num);    // ввод числа
        printf("Obratnoe chislo:%d\n", rev(num)); // вывод значения, которое получено в reverse
        getchar(); getchar();
        return 0;
      }

  • Елизавета
    Добрый день! пишу программу на СИ первый раз. Задача такая: даны координаты вершин треугольника. Определить: как относительно треугольника лежит начало координат. Решала через площади (дали подсказку). Но выдает неверный ответ , когда тока лежит внутри треугольника , пишет что "вне". Подскажите пожалуйста что не так(
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include "math.h"
    #include "stdafx.h"
    int_tmain(int argc, _TCHAR* argv[])
    {
       float x1, y1, x2, y2, x3, y3, a, b, c, p, p1, p2, p3, s, s1, s2, s3, s0, l1, l2, l3;
       scanf("%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &x3, &y3);
      a=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); //считаем стороны треугольника
      b=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
      c=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
        l1=sqrt(x1*x1+y1*y1); // считаем расстояние от начала координат до вершин
        l2=sqrt(x2*x2+y2*y2);
        l3=sqrt(x3*x3+y3*y3);
      p=(a+b+c)/2; //вычисляем полупериметр основного треугольника
      p1=(l1+a+l2)/2;
      p2=(l2+b+l3)/2;
      p3=(l3+c+l1)/2;
       s=sqrt(p*(p-a)*(p-b)*(p-c)); //вычисляем площадь основного треугольника
       s1=sqrt(p1*(p1-l1)*(p1-a)*(p1-l2));
       s2=sqrt(p2*(p2-l2)*(p2-b)*(p2-l3));
       s3=sqrt(p3*(p3-l3)*(p3-c)*(p3-l1));
    if((s1==0) || (s2==0) || (s3==0)) printf("na storone");
    else { if (s0<=s) printf("vnutri");
           else printf("vne treugolnika");
         }
     return 0;
    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *