Раздел «Язык Си».C_Progr2:

Вычисления.

Дробные числа.

Для работы с дробными числами в С есть переменные float.

Задача про среднее арифметическое

Даны два числа: a и b. Нужно найти среднее арифметическое этих чисел:

average = ( a + b) / 2

Попробуем написать программу с целыми числами. Назовем файл с текстом программы aver.c

#include <stdio.h>
#include <stdlib.h>

int main(){
  int a;      // число a
  int b;      // число b
  int average;//  результат

// числа (значения) для a и b вводим с клавиатуры
  scanf("%d%d",&a,&b);

// результат поместили в average
  average = ( a + b ) / 2;

// печать average на экран
 printf("average=%d\n",average);
}

Скомпилируем эту программу и запустим. А затем посмотрим на результат.

>gcc aver.c -o aver
>./aver
12 20
16 

Результат оказался правильный. А теперь порообуем запусить эту программу с разными числами и получить результат.

a b aver комментарий
12 20 16 результат правильный
13 7 10 результат правильный
10 7 8 результат не совсем правильный, хотели 8.5
30 -3 13 результат не совсем правильный, хотели 13.5

В двух случаях получили не тот результат, который нужен. Это значит, что целые числа для решения этой задачи не подходят.

Напишем программу avr2.c по-другому.

#include <stdio.h>
#include <stdlib.h>

int main(){
  float a;      //  дробное число a
  float b;      // дробное число  b
  float average;// дробное число  average

// Чтобы получить с клавиатуры дробные числа
// нужно написать %f 
  scanf("%f%f",&a,&b);

// Вычисления. Теперь все числа будут дробные 
  average = ( a + b ) / 2;

//Печать дробных чисел
 printf("average=%f\n",average);

}

Запустим эту программу со всеми числами:

> ./fl
12.  
20.
average=16.000000
> ./fl
7.
13.
average=10.000000
> ./fl
7.
10.
average=8.500000
>./fl
30.
-3.
average=13.500000

Вот теперь ответы нас устраивают.

Чтобы компьютер отличал дробные числа от целых, нужно писать "." в дробном числе. Например, 3.14, 2.0, 0.77 или 0.

REFACTOR Задача 1. Среднее геометрическое.

Даны два числа a и b. Вычислить среднее геометрическое этих чисел geom:

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

В тексте программы нужно использовать математику и команду sqrt(a) - вычисление квадратного корня из числа a

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(){
  float a;      //  дробное число a
  float b;      // дробное число  b

// Чтобы получить с клавиатуры дробные числа
// нужно написать %f 
  scanf("%f",&a);

// Вычисления
  b = sqrt(a);

//Печать
 printf("b=%f\n",b);

}

Чтобы компилировать эту программу, нужно написать

>gcc sq.c -o sq -lm

А потом запустить.

Преобразование целых чисел в дробные и наоборот: дробных в целые.

Если в вычислениях у нас только целые числа, то и результат получится - целое число.

Если одно из чисел в вычислениях - дробное, то результат операции будет - дробное число.

Если к целому числу присвоить дробное, то результат будет целое число без дробной части.

Если к дробному числу присвоить целое, то результат будет - дробное число, а дробная часть будет 0.

Например.

#include <stdio.h>
#include <stdlib.h>

int main(){
  int a; //
  int b; //
  int sum; //
  float af; //
  float bf; //
  float sumf;//
// Присвоить значения переменным
  a = 10;
  b = 15;
  af = 2.5; // дробные числа пишутся с "."
  bf = 5.5;

// Все числа  - целые, результат - целый  
  sum = a + b; 
  printf("sum = a + b = %d\n", sum);

// a - целое, а bf - дробное. Сумма получится дробная
// Но, sum - целое, значит результат целый без 
// дробной части
  sum = a + bf; 
   printf("sum = a + bf = %d\n", sum);

// a и b - целые. Сумма получится целая.
// Но sumf - дробная, значит результат - дробный. 
// А целая часть - 0
  sumf = a + b;
  printf("sumf = a + b = %f\n", sumf);

// af и bf - дробные. Сумма получится дробная
// sumf - дробная, значит результат - дробный. 
  sumf = af + bf;
  printf("sumf = af + bf = %f\n", sumf);

// присвоим только целую часть
  a = af;
   printf("a = %d\n", a);

// присвоим b, появится еще дробная часть, равная 0
  bf = b;
  printf("bf = %f\n", bf);
  
}

REFACTOR Задача 2. Сколько стульев?

Площадь комнаты - S (дробное число). Длина одной стороны ln (дробное число). Ширина стула ch (дробное число).

Вычислить сколько стульев res (целое число) можно поставить у ДРУГОЙ стороны комнаты.

Сделать таблицу для проверки результатов.

Функции

В языке С можно научить компьютер дополнительным командам - функциям.

Тогда для сложных вычислений или других действий можно напечатать только одну команду.

Например.

#include <stdio.h>
#include <stdlib.h>

// Это функция
// hello - имя функции
// void - слово для функций, вместо числа
void hello()
// В этих скобках {} пишем нужные действия (инструкции)
{
// наша функция только печатает текст
 printf("Я первая функция!!\n");
};

int main(){

// Вызов функции. В этом месте она начинает работу 
 hello();
}

Можно написать функцию, которая будет получать числа, делать вычисления и сообщать (возвращать) результат - число.

#include <stdio.h>
#include <stdlib.h>

// Это функция
// average - имя функции
// float - число - результат вычислений
// float a, float b  - получают числа для вычислений
float average( float a, float b)
// В этих скобках {} пишем нужные действия (инструкции)
{
// наша функция будет вычислять среднее арифметическое
   float res; // для результата вычисления
   
// вычисления
   res = (a + b) / 2;

// сообщить (вернуть) результат
   return res;
};

int main(){

  float v1;// скорость первого бегуна
  float v2;//скорость второго бегуна
  float averV; // средняя скорость бегунов

   scanf("%f%f",&v1,&v2);
// Вызов функции. В этом месте она начинает работу 
// Сообщаем ей значения скоротей бегунов
// а результат получаем в averV
  
   averV = average(v1, v2);
   
// печать результата. Чтобы печатать только 2 знака после точки, нужно написать так:
   printf("средняя скорость: %0.2f\n",averV);

}

Еще пример функции.

Дана площадь квадрата area. Нужно вычислить длину стороны квадрата.

Программа называется sq.c

#include <stdio.h>
#include <stdlib.h>

// oneSize - имя функции,
// float s - переменная для передачи значений (ПАРМЕТР)
// float - возвращаемое значение (после вычислений)
float oneSize( float s){
      float lin; // длина стороны
// вычисление квадратного корня
// sqrt() - функция языка С (их много)      
      lin = sqrt(s);
//  возвращаем результат
     return lin;   
};

int main(){
  float area;//площадь
  float lin; // сторона
  scanf("%f",&area);

// вызов функции. Результат кладем в lin  
  lin = oneSize(area);

// печать. 3 знака после точки
   printf("сторона - %0.3f \n", lin); 
}

REFACTOR Задача 3. Расстояние

На плоскости даны две точки. Их координаты x1, y1 и x2, y2 (дробные числа).

Написать функцию float lin( float x1, float y1, float x2, float y2), чтобы вычислить расстояние между точками.

Cделать таблицу для проверки результатов.

REFACTOR Задача 4. Площадь круга

Дан радиус круга (дробное число). Написать функцию float areaCirle(float r) для вычисления площади круга.

Cделать таблицу для проверки результатов.

Написать функцию float lin( float x1, float y1, float x2, float y2), чтобы вычислить расстояние между точками.

Cделать таблицу для проверки результатов.

REFACTOR Задача 5. Площадь треугольника

На плоскости даны три точки. Их координаты x1, y1, x2, y2, x3, y3 (дробные числа).

Написать функцию float areaTri( float x1, float y1, float x2, float y2,float x3, float y3), для вычисления площади треугольника по формуле Герона

.

Cделать таблицу для проверки результатов.

REFACTOR Задача 6. Встреча

Пешеход и вышел из A со скоростью v1. Велосипедист выехал из города A со скоростью v2 через время t - целое число. v2v1.

Написать функцию int catchingUp(float v1, int t, float v2) для вычисления ВРЕМЕНИ когда велосипедист ДОГОНИТ пешехода.

Написать программу, которая вычисляет Расстояние s (дробное число) от города А, до встречи велосипедиста и пешехода.

Cделать таблицу для проверки результатов

-- TatyanaOvsyannikova2011 - 23 Mar 2016

Attachment sort Action Size Date Who Comment
gem_mean.png manage 5.6 K 23 Mar 2016 - 11:12 TatyanaOvsyannikova2011  
geron.png manage 13.1 K 23 Mar 2016 - 13:35 TatyanaOvsyannikova2011  
circle.png manage 28.0 K 24 Mar 2016 - 11:53 TatyanaOvsyannikova2011