БлогNot. 20 не пригодившихся в сентябре задачек

20 не пригодившихся в сентябре задачек

По тем же причинам, что изложены тут, вдруг кому пригодится или за поисковый спам сойдёт :) Языки везде - C/C++ и Pascal. Для быстрого поиска нужного слова на странице нажимайте комбинацию клавиш Ctrl+F.

1. Задан двумерный массив целых чисел размерностью 100*100. Необходимо, чтобы программа:

  • инициализировала этот массив 0;
  • 10 точек со случайными координатами выставляла в значение 1;
  • вычисляла среднее значение координат х и у (среднее по индексам строк и столбцов) от ненулевых значений массива (консольный C/C++).

#include <stdio.h>
#include <stdlib.h>
 
const int n=100;
static int a[n][n];
int main () {
 int i,j;
 randomize();
 for (i=0; i<10; )  {
  int r=random(n);
  int c=random(n);
  if (a[r][ c]==0) { a[r][ c]=1; i++; }
  else continue; //хотим все точки разными
 }
 long int x=0,y=0;
 for (i=0; i<n; i++)
 for (j=0; j<n; j++) {
  if (a[i][j]!=0) { x+=i; y+=j; }
 }
 printf ("\nX(sr)=%.3lf, Y(sr)=%.3lf",(double)x/10,(double)y/10);
 fflush(stdin); getchar();
 return 0;
}

2. Определить, является ли количество простых чисел, меньших 10000, простым числом (консольный C/C++).

#include <stdio.h>
#include <math.h>
 
int simple (int n) {
 if (n<2) return 0;
 else if (n<4) return 1;
 for (int i=2; i<=floor(sqrt(n)); i++) if (n%i==0) return 0;
 return 1;
}
 
int main () {
 int k=0;
 for (int i=1; i<10000; i++) if (simple(i)) k++;
 printf ("\n%s",(simple(k)?"Yes":"No"));
 return 0;
}

Если в условии не количество, а сумма, строки 12-13 примут вид

long int k=0;
for (int i=1; i<10000; i++) if (simple(i)) k+=i;

3. Вычислить сумму ряда (приближенное значение функции exp) с точностью eps. Значения x и eps вводятся с клавиатуры. Полученный результат и значение библиотечной функции exp вывести на экран (консольный C/C++).

разложение экспоненты в ряд
разложение экспоненты в ряд
#include <stdio.h>
#include <math.h>
 
int main () {
 double x,eps;
 printf ("\nx, eps? ");
 scanf ("%lf",&x);
 scanf ("%lf",&eps);
 double sum0=exp(1);
 double xi=1.,ifact=1,sum=0.;
 int i=0;
 do {
  sum+=xi/ifact;
  i++;
  xi*=x;
  ifact*=i;
 } while (fabs(sum-sum0)>eps);
 printf ("\nSumm=%.12lf, function=%.12lf",sum,sum0);
 fflush (stdin);
 getchar();
 return 0;
}

4. Вывести предложение, в котором каждое слово будет задом наперед. Нельзя пользоваться встроенными функциями для работы со строками или массивами символов. Например:Рейсовый автобус №8 задерживается на 30 минут => йывосйеР суботва 8№ ястеавижредаз ан 03 .туним (консольный C/C++; возможно, не всё идеально, например, есть сравнение указателей).

#include <stdio.h>
 
int main () {
 char *s = "Abracadabra kupila sebe abyrvalg";
 char *p=s;
 printf ("\n");
 while (*s++) {
  if (*s==' ') {
   char *b=s-1;
   while (b>=p) printf ("%c",*b--);
   printf (" ");
   p=s+1;
  }
 }
 char *b=s-1; //повторить для последнего слова
 while (b>=p) printf ("%c",*b--);
 return 0;
}

5. Заполнить текстовый файл N действительными числами, полученными с помощью датчика случайных чисел. Найти сумму минимального и максимального элементов этого файла (консольный C/C++).

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
int main () {
 const int n=100;
 const int range=10;
 FILE *f = fopen ("file.txt","wt");
 if (!f) {
  printf ("\n Не могу создать файл, проверьте права!");
  fflush (stdin);
  getchar();
  exit(1);
 }
 double amax=-DBL_MAX,amin=DBL_MAX;
 for (int i=0; i<n; i++) {
  double a = (double)rand()/(RAND_MAX+1)*range;
  fprintf (f,"%lf ",a);
  if (a>amax) amax=a; 
  if (a<amin) amin=a;
 }
 printf ("\nSum=%lf",amin+amax);
 fflush (stdin);
 getchar();
 return 0;
}

6. Даны натуральное число n и вещественное число x. Среди чисел exp(cos(x^2k))sin(x^3k) (k = 1, 2, ..., n) найти ближайшее к какому-нибудь целому (консольный C/C++).

#include <stdio.h>
#include <math.h>
 
int main() {
const int n=10;
double x=11.1,i,a,amin=0.5,res;
for (int k=1; k<=n; k++) {
 double f=exp(cos(pow(x,2*k)))*sin(pow(x,3*k));
 a=modf(f,&i);
 if(fabs(a)<amin) { 
   amin=fabs(a); res=f; 
 }
}
printf ("\nResult=%lf (%lf in fractional part)",res,amin);
fflush (stdin);
getchar();
return 0;
}

7. Дана квадратная матрица А(6;6). Определить наименьший из элементов верхнего и наибольший из элементов нижнего треугольников. Их значения определяют интервал. Среди элементов главной диагонали найти количество элементов, лежащих вне интервала (консоль Visual C++).

#include <iostream>
using namespace std;
 
int main () {
 const int n=6;
 int a[n][n] = {
  {1,2,3,4,8,-6},
  {6,-8,4,4,5,6},
  {-8,-2,9,4,5,6},
  {8,2,3,-4,-5,-6},
  {1,2,3,3,2,1},
  {6,5,4,3,2,1}
 };
 int min=a[0][1],max=a[1][0],i,j;
 for (i=0; i<n; i++)
  for (j=i+1; j<n; j++) if (a[i][j]<min) min=a[i][j];
 for (i=0; i<n; i++)
  for (j=0; j<i; j++) if (a[i][j]>max) max=a[i][j];
 int k=0;
 for (i=0; i<n; i++) 
  if (a[i][i]<min || a[i][i]>max) k++;
 cout << "k=" << k;
 cin.sync(); cin.get();
 return 0;
}

8. Напечатать таблицу значений функции (консоль Visual C++).

функция
функция
#include <stdio.h>
#include <math.h>
using namespace std;
 
double f(double n, double a) {
 int i2;
 double sum=0;
 for (int i=1; i<=n; i++) {
  if (fabs(a)<=1) i2=i;
  else i2=i*i;
  sum+=a/i2;
 }
 return sum;
}
 
int main () {
 for (int n=5; n<9; n++) {
  printf ("\n");
  for (int a=-1; a<3; a++) {
   double fz=f(n,a);
   printf ("%.3lf ",fz);
  }
 }
 fflush (stdin); getchar();
 return 0;
}

9. Дано целое число в диапазоне 20 – 69, определяющее возраст (в годах). Вывести строку – словесное описание указанного возраста, обеспечив правильное согласование числа со словом «год», например: 20 – «двадцать лет», 32 – «тридцать два года», 41 – «сорок один год». Нельзя использовать оператор goto и массивы (консоль Visual C++).

#include <iostream>
using namespace std;
 
int main () {
  setlocale(LC_ALL, "rus");
  int k = 31; //или ввести возраст k в годах
  if (k<30) cout << "двадцать";
  else if (k<40) cout << "тридцать";
  else if (k<50) cout << "сорок";
  else if (k<60) cout << "пятьдесят";
  else cout << "шестьдесят";
  if (k%10) cout << " ";
  if (k%10==1) cout << "один";
  else if (k%10==2) cout << "два";
  else if (k%10==3) cout << "три";
  else if (k%10==4) cout << "четыре";
  else if (k%10==5) cout << "пять";
  else if (k%10==6) cout << "шесть";
  else if (k%10==7) cout << "семь";
  else if (k%10==8) cout << "восемь";
  else if (k%10==9) cout << "девять";
  cout << " " << (k%10==0||k%10>4?"лет":(k%10==1?"год":"года"));
  cin.sync(); cin.get();
  return 0;
}

10. Дано натуральное число N. Выяснить, можно ли представить N в виде произведения трех последовательных целых чисел (С++, фрагмент, алгоритм "студенческий").

int n=100; //или ввести n
int answer=0;
for (int i=1; i<n; i++) if (i*(i+1)*(i+2)==n) { answer=1; break; }
cout << (answer?"да":"нет");

11. Составить алгоритм, определяющий количество способов, какими задуманное число n>1 можно представить в виде суммы n=i^3+j^3, считая, что перестановка слагаемых нового способа не даёт (консольный Си/C++; верхние границы циклов не продуманы).

#include <stdio.h>
int main () {
int n=1000,k=0,i,j;
for (i=0; i<n; i++)
for (j=i; j<n; j++)
if (i*i*i+j*j*j==n) k++;
printf ("\n%d sposob(ov)",k);
return 0;
}

12. Определить сумму чисел не пустой последовательности за которой следует нуль и подсчитать среднеарифметическое значение (консольный Си/C++).

#include<stdio.h>
int main()
{
    int CurrentValue, Sum = 0, Kol = 0;
    while(scanf("%i",&CurrentValue) && CurrentValue!=0) {
        Sum=Sum + CurrentValue; Kol++;
    }
    printf("Sum: %i Average: %.2f",Sum,(float)Sum/Kol);
}

13. С клавиатуры вводятся символы до тех пор, пока предложение не закончится. Концом предложения считать символы: '!', '?'. Посчитать кол-во введенных символов, отличных от пробела (Pascal)

uses crt;
var s:string;
 k,i:integer;
  c:char;
begin
 repeat
  c:=readkey;
  write (c);
  s:=s+c;
 until (c='!') or (c='?');
 writeln;
 k:=0;
 for i:=1 to length(s) do if s[i]<>' ' then inc(k);
 writeln ('k=',k);
 reset (input); readln;
end.

14. Задан символьный массив размера N. Определить число элементов в массиве не являющихся символами латинского алфавита. Число N принять равным 12 (консольный Си/C++).

#include <stdio.h>
#include <string.h>
 
int main () {
 const int n=12;
 char s[n+1];
 puts ("Enter the string: ");
 fgets(s,n+1,stdin);
 int len = strlen (s),kol=0;
 s[len]='\0';
 for (int i=0; i<len; i++)
 if (!(s[i]>='a' && s[i]<='z' || s[i]>='A' && s[i]<='Z')) kol++;
 printf ("\nKol=%d",kol);
 fflush (stdin); getchar();
 return 0;
}
Enter the string:
Abyrka, idi na $#@!

Kol=3

т.к. больше n символов не вводится (fgets)

15. Число сочетаний Cnk (консольный Си/C++)

#include <stdio.h>
 
const int n1=20;
int k,n,a[n1],p[n1];
 
void cnk(int m,int l) {
 //m-сколько осталоась выбрать,l - номер элемента с которого начниаем
 int i,j;
 if (m==0) { //Здесь - обработка комбинации
  printf ("\n");
  for (j=0;j<k;j++) printf ("%d ",p[j]);
 }
 else for (i=l;i<=n-m;i++) {
   p[k-m]=a[i];
   cnk(m-1,i+1);
 }
}
 
int main ()  {
 printf ("\nПодмножества из N по K");
 printf ("\nВведите N (2-%d):",n1);
 fflush (stdin);
 scanf("%d",&n);
 printf ("\nВведите K:");
 fflush (stdin);
 scanf("%d",&k);
 for (int i=0;i<n;i++) a[i]=i+1; //данный массив может быть заполнен произвольно
 cnk(k,0);
 fflush (stdin); getchar();
}
Введите N (2-20):3

Введите K:2

1 2
1 3
2 3

16. Определить все ли числа натурального числа N, представленного в девятиричной системе счислений являются одинаковыми (консоль Visual C++).

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main () {
 int n;
 char s[128];
 setlocale( LC_ALL, ".1251" );
 cout << "Введи десятичное натуральное число";
 cin >> n;
 _itoa (n,s,9);
 int res=1;
 for (int i=1; i<strlen(s); i++) if (s[i]!=s[i-1]) { res=0; break; }
 cout << (res?"Все одинаковые":"Есть разные");
 cin.sync(); cin.get();
}

проверка: 80 десятичное = 88 в 9-ричной, ответ "Все одинаковые"

17. Даны натуральные числа а и b, b > 0. Найти частное и остаток при делении а на b, оперируя лишь с целыми числами и не используя операции деления целых и взятия остатка от деления, за исключением деления 2 четных чисел; число шагов не должно превосходить C1*log(a/b) + C2 для некоторых констант C1, C2 (консольный Си/C++)

#include <stdio.h>
 
void main () {
 int a,b;
 a = 137; b = 13; //или ввести с клавиатуры
 int b1=b;
 while (b1<=a) b1*=2;
 int q = 0;
 int r = a;
 while (b1!=b) {
  b1/=2; q*=2;
  if (r>=b1) { r-=b1; q++; }
 }
 printf ("\nChastnoe=%d,ostatok=%d",q,r);
 getchar();
}

18. Вычислить произведение, используя рекурсивную функцию (Pascal)

произведение
произведение
function p(n:integer):real;
begin
 if n>0 then p:=p(n-1)*(9.2*cos(sqr(n))-abs(sin(n/1.1)))
 else p:=1;
end;
 
begin
 write (p(10):9:3);
 readln;
end.

19. Дана матрица 10 на 10. Данные введены через randomize в диапазоне от 0 до 100. Преобразовать матрицу так, чтобы четные элементы выше диагонали матрицы и сама диагональ стали нулевыми. И вывести исходную матрицу и преобразованную (Pascal)

const n=10;
var a:array [1..n,1..n] of integer;
 i,j:integer;
begin
 randomize;
 write ('исходная матрица');
 for i:=1 to n do begin
  writeln;
  for j:=1 to n do begin
   a[i,j]:=random(101);
   write (a[i,j]:4);
  end;
 end;
 for i:=1 to n do
 for j:=i to n do
  if (i=j) or (a[i,j] mod 2 = 0) then a[i,j]:=0;
 writeln;
 write ('преобразованная матрица');
 for i:=1 to n do begin
  writeln;
  for j:=1 to n do write (a[i,j]:4);
 end;
 writeln;
 write ('дави батон для выхода');
 readln;
end.

20. Определить, образуют ли элементы массива геометрическую прогрессию (консольный C++).

#include <stdio.h>
 
int geopro (int n, double a[]) {
 double q=a[1]/a[0];
 for (int i=2; i<n; i++) {
  if (a[i]/a[i-1] != q) return 0;
  q = a[i]/a[i-1];
 }
 return 1;
}
 
void main () {
 const int n = 10;
 double *a = new double [n];
 a[0] = 2;
 double q = 0.5;
 for (int i=1; i<n; i++) a[i] = a[i-1] * q; //делаем геом.прогрессию
 //a[4]=100; //если раскомментарить - нарушит прогрессию и ответ="нет"
 printf ("\nResult = %s",(geopro(n,a)?"Yes":"No"));
 getchar();
}

Нужно учесть, что сравнение вещественных чисел

if (a[i]/a[i-1] != q)

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

#include <math.h> //в начале программы
//...
if (fabs(a[i]/a[i-1]-q)>eps)

где eps - малое число, допустимая погрешность сравнения, например

double eps = 1e-8;

Вариант без вычисления q в функции может быть таким:

int geopro (int n, double a[]) {
 const double eps=1e-3;
 for (int i=1; i<n-1; i++) {
    if (fabs(a[i]*a[i]-a[i-1]*a[i+1])>eps) return 0;
 }
 return 1;
}

08.10.2014, 13:26 [14770 просмотров]


теги: c++ список pascal

К этой статье пока нет комментариев, Ваш будет первым