Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы программирования. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
955 Кб
Скачать

Пример программы с переопределенными именами объектов

# include <stdio.h>

 

сhar st [ ] = "СТРОКА1";

//Определение глобального объекта

void f1 ( void )

 

{ printf ("%s", st ) ;

//Вывод значения глобальной st

сhar st [ ] = "СТРОКА2";

//Определение локальногообъекта вблоке 1

printf ("%s", st ) ;

//Вывод значения СТРОКА2

 

//локальной st блока 1

scanf ("%s", &st ) ;

//Ввод нового значения локальной st блока 1

{ сhar st [ ] = "СТРОКА3"; //Определение локального объекта в блоке 2

printf ("%s", st ) ;

//Вывод значения СТРОКА3

 

//локальной st блока 2

}

//Конец блока 2

printf ("%s", st ) ; //Вывод нового значения локальной st блока 1 } //Конец блока 1

void f2 ( char *st )

{ printf ("%s", st ) ; //Вывод значения формальной st блока 3

{сhar st [ ] = "СТРОКА4"; //Определение локального объекта в блоке 4 printf ("%s", st ) ; //Вывод значения СТРОКА4 локальной st блока 4

}

//Конец блока 4

 

printf ("%s", st ) ;

//Вывод значения формальной st

}

//Конец блока

3

void main ( )

{printf ("%s", st ) ; //Вывод значения СТРОКА1 глобальной st в блоке 5 scanf ("%s", &st ) ; //Ввод нового значения глобальной st

extern int p; //Описание глобальной переменной p определенной ниже if ( p ) f1( ); else f2 ( st );

printf ("%s", st ) ; //Вывод значения глобальной st } //Конец блока 5

int p = 5; //Определение глобальной переменной p

61

Имя переменной st типа строка определено вне функций и переопределяется в функциях f1 и f2. Комментарии показывают видимость имени st в разных блоках программы.

6.10.ЗАДАЧИ И РЕШЕНИЯ

1.Написать программу решения задачи, выполняя ее декомпозицию на подзадачи:

1) Описать функцию степень (x, n) от вещественного x и натурального n, вычисляющую величину xn, и использовать ее для вычисления b = 2.7k + (a + 1)-5 .

#include <stdio.h>

#include <conio.h > const int n = 15; const int n1= 10; const int n2 = 20;

float step (float x, int n) { int i;

float y;

for(i = 0, y = 1; i < n; i++) y *= x; return y;}

void main ( ) { int k;

float b; scanf("%d", &k);

b= step (2.7, k) + 1. / step ( a + 1.0, 5);

printf (" %f ", b); getch ( );

}

2) Даны координаты трех точек плоскости, определить номер координатной четверти для каждой из трех точек (считать, что координаты точек не совпадают с началом координат).

#include <stdio.h>

#include <conio.h > const int n = 15;

62

const int n1= 10; const int n2 = 20;

int number (float x, float y) { int i;

if (x > 0)

if (y > 0) i = 1; else i = 4; else

if (y > 0) i = 2; else i = 3; return i;}

void main ( )

{ float x1, x2, x3, y1, y2, y3;

scanf ("%f %f %f %f %f %f "), &x1, &y1, &x2, &y2, &x3, &y3); printf ("\n точка %f %f в %d четверти ", x1, y1, number ( x1, y1)); printf ("\n точка %f %f в %d четверти ", x2, y2, number ( x2, y2));

printf ("\n точка %f %f в %d четверти ", x3, y3, number ( x3, y3)); getch ( );

}

3) Вычислить значение функции F(m, n) = nm!/(n + m)! , где n и m – неотрицательные целые числа.

#include <stdio.h>

#include <conio.h > const int n = 15; const int n1= 10; const int n2 = 20;

void main ( ) { int n, m, F; int fact ( int);

scanf( “%d %d”, &n, &m);

F= fact (n)* fact (m) / fact (n + m); printf (“ %d ”, F); getch ( );

}

63

int fact ( int a) { int i, y;

if ( !a ) return 1;

for(i = 2, y = 1; i < = a; i++) y *= i; return y;}

4) По заданным вещественным векторам x, y, z размером m (m ≤ 20) каждый, вычислить величину (a, a) – (b, c), где a обозначает тот из векторов, в котором самый большой минимальный элемент (считать, что такой вектор единственный), b и c обозначают два других вектора, а (p, q) – скалярное произведение p и q.

#include <stdio.h >

#include <conio.h > const int n = 20;

void input (float a[ ], int n); float minx (float a[ ], int n);

float scal (float p[ ], float q[ ], int n); void main ( )

{

int m, i;

float a, b,c,s, x[n], y[n], z[n];

printf ("\n введите размер вектора "); scanf("%d ", &m);

printf ("\n введите три вектора "); input ( x, m); input ( y, m); input ( z, m);

a = minx (x, m); b = minx (y, m); c = minx (z, m); if (a > b)

if (a > c) s = scal (x, x, m) - scal (y, z, m); else s = scal (z, z, m) - scal (y, x, m);

else

if (b > c) s = scal (y, y, m) - scal (x, z, m); else s = scal (z, z, m) - scal (y, x, m);

printf ("\n%f ", s); getch ( );

}

64

void input (float a[ ], int n) { int i;

for (i = 0; i < n; i++ ) scanf ("%f ", &a[i]);

}

float minx (float a[ ], int n) { int i;

float min =a[0];

for (i = 1; i < n; i++ ) if (a[i] < minx) minx = a[i]; return minx;

}

float scal (float p[ ], float q[ ], int n) { int i;

float s = 0;

for ( i = 0; i < n; i++ ) s += p[i] * q[i]; return s;

}

5) Даны три матрицы размером n×m (n, m ≤ 20) каждая. Напечатать ту из них, где больше упорядоченных по возрастанию строк (если таких матриц несколько, то напечатать любую из них).

#include <stdio.h>

#include <conio.h > const int p = 20;

void input ( float x[ ][p], int n, int m); int count ( float x[ ][p], int n, int m); int order ( float *x, int n);

void write (float x[ ][p], int n, int m);

void main ( ) {int n, m, i, j;

float q1, q2, q3, s, a[p][p], b[p][p], c[p][p];

65

printf ("\n введите размер матрицы "); scanf("%d %d", &n, &m);

printf ("\n введите три матрицы ");

input ( a, n, m); input ( b, n, m); input ( c, n, m);

q1 = count (a, n, m); q2 = count (b, n, m); q3 = count (c, n, m); if (q1 > q2)

if (q1 > q3) write (a, n, m); else write (c, n, m);

else

if (q2 > q3) write (b, n, m); else write (c, n, m);

getch ( );

}

void input (float x[ ][p], int n) { int i, j;

for (i = 0; i < n; i++ ) for (j = 0; j < m; i++ )

scanf ("%f ", &x[i][j]);

}

int count (float x[ ][p], int n, int m) { int i, k = 0 ;

for (i = 0; i < n; i++ ) k += order (x[i], m); return k;

}

int order (float *x, int n) { int i;

for (i = 0; i < n - 1 && x[i] < x[i + 1]; i++ ); if (i == n - 1) return 1;

else return 0;

66

}

void write (float x[ ][p], int n, int m) { int i, j;

for (i = 0; i < n; i++ )

{ for (j = 0; j < m; i++ ) printf ("%f ", x[i][j] );

printf ("\n"); }

}

6) По заданному числу a > 0 вычислить величину

3 a 6 a2 1

 

 

7 3 a

1

Корни вычислять с заданной точностью 0 < ɛ < 1 по следующей ите-

рационной формуле: y0=1; yn+1 = yn + (x/ynk-1 yn) / k

(n =0, 1, 2, …),

за ответ взять приближение yn+1 , для которого │yn+1 - yn│< ɛ .

#include <stdio.h >

#include <conio.h >

float eps;

float sgrtk (float x, int k) { int i;

float y, yn, s; yn = 1;

do

{y = yn;

for(i = 1, s = y; i < k; i++) s *= y; yn = y + (x / s - y) / k; }

while (fabs (yn - y) >= eps) return yn;

}

void main ( ) { float a, y;

scanf("%f %f", &a, &eps);

67

y = (sqrtk (a, 3) - sqrtk (a * a + 1, 6) ) / ( 1.0 + sqrtk (a + 3, 7)); printf (" %f ", y);

getch ( );

}

7) Используя рекурсию вычислить сумму элементов последовательности положительных вещественных чисел, оканчивающейся отрицательным числом).

#include <stdio.h>

#include <conio.h >

float sum ( ) {float x;

scanf ("%f ", &x ); if (x < 0) return 0;

else return sum ( ) + x;

}

void main ( ) { float y;

y = sum ( ); printf (" %f ", y); getch ( );

}

8) Дана непустая последовательность символов, являющаяся правильной записью формулы вида:

<формула > ::= < цифра > | (< формула > < знак > < формула > )

<знак > ::= + | - | *

<цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Вычислить алгебраическое значение формулы.

#include <stdio.h>

#include <conio.h >

int formula ( ) {int x, y; char sym, op;

68

scanf ("%c", &sym );

if (sym >= ′0′ && sym <= ′9′) return sym - ′0′; else

{ x = formula ( ); scanf ("%c", &op ); y = formula ( ); scanf ("%c", &sym ); switch ( op )

{

case +: return x + y; break; case -: return x - y; break; case *: return x * y; break;

}

}

}

void main ( )

{ printf (" %d ", formula ( )); getch ( );

}

ТЕМА 7

ЗАДАЧИ ДЛЯ САМОСТОЯТЕЛЬНОГО РЕШЕНИЯ

7.1.ПРОСТЫЕ ТИПЫ И ВЫРАЖЕНИЯ

1)Записать на языке Си выражение, истинное при выполнении указанного условия и ложное в противном случае:

а) x принадлежит отрезку [0, 1]; б) x лежит вне отрезка [0, 1];

в) каждое из чисел x, y, z положительно;

г) ни одно из чисел x, y, z не является положительным; д) только одно из чисел x, y, z положительно;

69

е) логическая переменная a имеет значение true, а логическая переменная b имеет значение false;

ж) целое K делится на 7;

з) уравнение ax2 + bx + c = 0 (a ≠ 0) не имеет вещественных корней; и) точка (x, y) лежит вне круга радиуса r с центром в точке (1, 0); к) натуральное n является полным квадратом;

л) x = max (x, y, z); м) x ≠ max (x, y, z);

2) Записать на языке Си следующие формулы:

a)

xyz 3,3(x 4 y)

;б) 21 x ;

в) 3 1 x ;

 

107 lg 4

г) b + sin2 π4 ;

 

д) cos 2 + │tg y│;

е) abc

c

;

 

ab

ж)

 

x y

 

b

;

з) 104 3

1 ;

и) { ( ax b)x +c}x d .

 

 

x y

 

 

a

 

 

5

 

 

 

7.2.ОПЕРАТОРЫ

1)Записать оператор присваивания, в результате выполнения которого переменная получает значение истина, если выполняется указанное условие, и значение ложь в противном случае:

а) из чисел x, y, z только одно отличается от двух других; б) x – положительное число;

в) хотя бы одно из чисел x, y, z положительно; г) только одно из чисел x, y, z положительно;

д) p делится нацело на q (p, q – натуральные числа);

е) только одна из логических переменных a, b имеет значение “истина”;

ж) только одна из логических переменных a, b, c имеет значение “истина”;

з) цифра 3 входит в десятичную запись четырехзначного целого числа;

и) все цифры четырехзначного целого числа различны;

к) год с порядковым номером y является високосным (год является високосным, если его номер кратен 4, однако из годов кратных 100 високосными являются лишь кратные 400; например, 1700, 1800 и 1900 – невисокосные годы, а 2000– високосный);

70

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]