Решите задачи

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;

}

Результат работы программы:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: