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 [14893 просмотра]