Решите задачи.
1. Пусть имеется несколько функций одного аргумента. Для каждой из них
требуется распечатать таблицу значений на заданном отрезке. Отрезок и шаг
изменения аргумента для каждой функции свои. Оформите процесс печати в
виде отдельной функции с именем Print_Tab_F(), параметрами которой
должны быть имя табулируемой функции, отрезок определения аргумента и
шаг его изменения. Для набора функций примените массив указателей на
функции. Функции для табуляции возьмите из 2-й лабораторной работы в
количестве 6 начиная с номера данного преподавателем.
Листинг программы:
#include <math.h>
#include <stdio.h>
#define N 6
double f1(double x);
double f2(double x);
double f3(double x);
double f4(double x);
double f5(double x);
double f6(double x);
double Print_Tab_F(double fname(double x),double a,double b,double h); // имя ф-ии, начальное зн-е, конечное зн-е, шаг изменения аргумента
typedef double (*T_p_F[N])(double x);
int main(){
T_p_F p_F={&f1,&f2,&f3,&f4,&f5,&f6};
double A[N]={4,0.5,5,6,8,3};
double B[N]={5, 1 ,7,8,9,4};
double h[N];
for (int i=0;i<N;i++)
h[i]=(B[i]-A[i])/N;
for (int j=0;j<N;j++)
Print_Tab_F(*p_F[j],A[j],B[j],h[j]);
return 0;
}
double Print_Tab_F(double fname(double x),double a,double b,double h){
double i;
for (i=a;i<=b;i=i+h)
printf(" f=%6.3g",fname(i));
printf("\n");
return 0;
}
double f1(double x){
return x*sqrt(x);
}
double f2(double x){
return 1+exp(x);
}
double f3(double x){
return 1/(pow(x,3));
}
double f4(double x){
return 1/(pow(x,2));
}
double f5(double x){
return (2*x+1)/sqrt(x);
}
double f6(double x){
return 1/(1+exp(-x));
}
Результат работы программы:
2. Напишите функцию, реализующую алгоритм "Решета Эратосфена". Алгоритм позволяет находить простые числа и заключается в следующем.
1. Выписываются все числа от 2 до N. Первое простое число 2. Вычеркиваются все числа кратные 2.
2. Первое оставшееся число 3 - простое. Вычеркиваются все числа кратные 3
и т.д. В результате останутся только простые числа. Требуется найти все
простые числа меньшие N.
#include <stdio.h>
#include <math.h>
int main(){
int i,j,prch;
const int N=10;
double Arr[N];
//Заполнение массива
for (i=1;i<=N;i++){
Arr[i-1]=i;
printf(" %g ",Arr[i-1]);
}
//Алгоритм Решета
printf("\n");
for (i=1;i<N;i++){
if (Arr[i]!=0)
{
for (j=i+1;j<N;j++)
{
if (fmod(Arr[j], Arr[i])==0)
Arr[j]=0;
}
} else continue;
}
for (i=1;i<N;i++){
if (Arr[i]!=0)
printf(" %g ",Arr[i]);
}
return 0;
}
Результат работы для N=10
3. Напишите функцию определяющую число "счастливых" билетов в рулоне,
если номер первого билета m, а количество билетов n. Билеты могут быть 4-
х,6-и и 8-и значные. Билеты считаются "счастливыми", если суммы первой и
второй половины цифр номера билета одинаковы.
Листинг программ:
#include <stdio.h>
#include <math.h>
int main()
{
int A,i,j,k;
int n,count=0,hcount=0; //count-счётчик счастливых билетов
int Sum1=0,Sum2=0;
const int N=4;
double B[N+1],C[N+1]; //B-массиц цифр, С- массив делителей
for (i=0;i<N+1;i++)
{
B[i]=0;
C[i]=powf(10,i);
}
printf("enter first ticket:");
scanf("%d", &A);
printf(" enter number of tickets:");
scanf("%d",&n);
printf("\n");
for (k=A;k<=A+n;k++)
{
//перевод числа в массив цифр
for (i=1;i<N+1;i++)
{
B[i]=(fmod(k,C[i])); //если что к заменить на А
for (j=0;j<i;j++)
B[i]=B[i]-B[j];
}
//убираем разряды
for (i=1;i<N+1;i++)
{
B[i]=B[i]/C[i-1];
}
//Проверка контрольных сумм
for (i=1;i<=N/2;i++)
Sum1=Sum1+B[i];
for (i=(N/2)+1;i<=N;i++)
Sum2=Sum2+B[i];
if (Sum1==Sum2) count++;
Sum1=0; Sum2=0;//обнуляем суммы
}
printf(" count=%d",count);
return 0;
}
Результат работы программы:
4. Напишите функцию Shift_R(mas,n,k,s), которая циклически сдвигает массив mas длины n вправо или влево на k позиций. s – переключатель направления.
Листинг программы:
#include <stdio.h>
#include <math.h>
int Shift_R(int mas[],int n,double k,int s);
int main(){
int A[5]={1,2,3,4,5};
int k;
int N=5;
Shift_R(A,5,7,1);
for (k=0;k<N;k++)
printf(" %d ",A[k]);
return(0);
}
int Shift_R(int mas[],int n,double k,int s)
{
if (k>n) k=fmod(k,n);
int i,j,buf;
if (s!=0) //вправо
{
for (j=1;j<=k;j++)
{
buf=mas[n-1];
for (i=n-1;i>=0;i--)
{
mas[i]=mas[i-1];
}
mas[0]=buf;
}
} else //влево
{
for (j=1;j<=k;j++)
{
buf=mas[0];
for (i=0;i<n-1;i++)
{
mas[i]=mas[i+1];
}
mas[n-1]=buf;
}
}
return 0;
}
Результат работы программы:
6. Заполните квадратную таблицу размером [n x n] последовательными целыми числами от 1 до n^2. Числа располагаются по спирали, начиная с правого верхнего угла и продвигаясь по часовой стрелке.
Листинг программы:
#define N 5
#include <iostream>
using namespace std;
int main()
{
int C=N*N,i_0=0, j_0=0, i_N=N-1, j_N=N-1,v=1,count=0;
//С- число элементов матрицы
int i,j;//Текущие индексы
int A[N][N];
do
{
switch(v)
{
case 1:
i=i_0;j=j_N;
do{A[i++][j]=++count;}while(i<=i_N);
j_N--;
v=2;
break;
case 2:
i=i_N;j=j_N;
do{A[i][j--]=++count;}while(j>=j_0);
i_N--;
v=3;
break;
case 3:
i=i_N;j=j_0;
do{A[i--][j]=++count;}while(i>=i_0);
j_0++;
v=4;
break;
case 4:
i=i_0;j=j_0;
do{A[i][j++]=++count;}while(j<=j_N);
i_0++;
v=1;
break;
}
}
while(count<C);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cout<<A[i][j]<<"\t";
cout<<endl;
}
return 0;
}
Результат работы программы: