Основы программирования. Учебное пособие
.pdfПример программы с переопределенными именами объектов
# 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) = n!· m!/(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
