31 не пригодившаяся в октябре задачка
...становящийся традиционным сброс. Практически всё на C (совместимом с C++) или сразу на C++, писалось в консоли Studio.
1. Сформировать "треугольную" матрицу (показаны ненулевые элементы):
1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main () { const int n=5, m=7; //строк и столбцов int a[n][m],i,j,k=0; for (i=0; i<n; i++) for (j=0; j<m; j++) a[i][j]=0; //занулили for (i=0; i<n; i++) { //записали 1 куда надо for(j=k; j<m-k; j++) a[i][j]=1; k++; } for (i=0; i<n; i++) { printf ("\n"); for (j=0; j<m; j++) printf ("%2d",a[i][j]); //вывели } fflush(stdin); getchar(); return 0; }
2. В тексте на английском языке найти и вывести на экран найденные названия дней недели.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { char text[] = "This is text. It contains Sunday, and tuesday \n\ and no more any weekdays"; char *weekdays[] = { "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" }; puts ("Text is:"); puts (text); char *separators=" ,.;:\n!?-"; char *token = strtok(text, separators); int i; while(token != NULL) { if (strlen(token)>5) for (i=0; i<7; i++) if (stricmp(weekdays[i],token)==0) printf("%s ", token); token = strtok(NULL, separators); } fflush(stdin); getchar(); return 0; }
3. Если исходная строка не содержит цифр (символов с ASCII-кодами от 48 до 57), то она является не зашифрованной. Необходимо заменить все символы с кодами 33-99 на их двузначные коды. Символы с другими кодами выводятся без изменений.
Пример:
Введите строку: Hello! Вывод. Строка не зашифрована. Шифр: 72ello33.
И наоборот, если содержит, то она является зашифрованной.
Пример:
Введите строку: 72ello33 Вывод. Строка зашифрована. Шифр: Hello!
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <conio.h> #include <string.h> #include <windows.h> int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); char str[30],str2[60]; printf("\n Введите строку: "); scanf("%s",&str); int i; int contains=0; for (i=0; i<strlen(str); i++) { if (str[i]>='0' && str[i]<='9') { contains=1; break; } } printf ("\n Строка "); printf ("%s",(contains?"":"не")); printf (" зашифрована "); str2[0]='\0'; char buf[3]; int len = strlen(str); if (contains) { i=0; while (i<len) { int code=0; if (str[i]>='0' && str[i]<='9') { if (i<len-1) { if (str[i+1]>='0' && str[i+1]<='9') { strncpy (buf,&str[i],2); buf[2]='\0'; sscanf (buf,"%d",&code); if (code>=33 && code<=99) sprintf (buf,"%c",code); } } } if (!code) { buf[0]=str[i]; buf[1]='\0'; } else i++; strcat (str2,buf); i++; } printf ("\n Исходная строка: %s",str2); } else { for (i=0; i<len; i++) { if (str[i]>=33 && str[i]<=99) sprintf (buf,"%2d",str[i]); else { buf[0]=str[i]; buf[1]='\0'; } strcat(str2,buf); } printf ("\n Шифр: %s",str2); } fflush (stdin); getch(); return 0; }
4. В метании молота состязается n спортсменов. Каждый из них сделал m бросков. Побеждает спортсмен, у которого максимален наилучший бросок. Если таких несколько, то из них побеждает тот, у которого наилучшая сумма результатов по всем попыткам. Если и таких несколько, победителем считается спортсмен с минимальным номером. Определите номер победителя соревнований (нумерация с нуля).
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <fstream> using namespace std; const int nmax=20, mmax=20; int data[nmax][mmax]; int n,m; int read (string filename) { ifstream f; f.open (filename, ios::in); if (!f) return 0; f >> n; if (f.eof() || n<1 || n>nmax) return 0; f >> m; if (f.eof() || m<1 || m>mmax) return 0; for (int i=0; i<n; i++) for (int j=0; j<m; j++) { if (f.eof()) return 0; f >> data[i][j]; } return 1; } int winner() { int max=0,number=0; for (int i=0; i<n; i++) { int sum=0; for (int j=0; j<m; j++) sum += data[i][j]; if (sum>max) { max=sum; number=i; } } return number; } int main () { if (!read("data.txt")) cout << "File data.txt not found or incorrect" ; else cout << "number of winner is " << winner(); cin.sync(); cin.get(); return 0; }
Файл data.txt лежит в текущей папке, той же, где файл .cpp решения (в Visual Studio - путь ПАПКА_ПРОЕКТА/ПАПКА_ПРОЕКТА).
В файле сначала расположены 2 числа n и m (число строк и стобцов в массиве, натуральные числа от 2 до 20 включительно), затем следует n строк по m числовых значений, например
4 3 8 8 8 5 9 3 9 9 7 6 6 2
5. После ввода с клавиатуры данных массива структур (фамилия, возраст в годах), вывести на экран список, отсортированный по возрасту.
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <clocale> #include <cstdlib> #include <cstring> using namespace std; const int maxn=20; const int maxname=20; int n=0; struct people { char name[maxname]; int age; }; people *p=0; void swap (int i, int j) { char temp[maxname]; strcpy (temp,p[i].name); strcpy (p[i].name,p[j].name); strcpy (p[j].name,temp); int t=p[i].age; p[i].age=p[j].age; p[j].age=t; } int main(){ setlocale(LC_ALL, "Russian"); do { cout << "Сколько записей (от 2 до " << maxn <<")? "; cin >> n; } while (n<2 || n>maxn); p = new people [n]; if (p==0) { cout << "Не могу выделить память. Нажмите клавишу для выхода"; cin.sync(); cin.get(); exit (1); } for (int i=0; i<n; i++) { cout << endl << "Введите фамилию " << (i+1) << " "; cin >> p[i].name; cout << "Введите возраст " << (i+1) << " "; cin >> p[i].age; } for (int i=0; i<n-1; i++) { for (int j=i+1; j<n; j++) { if (p[i].age>p[j].age) { swap (i,j); } } } cout << "Отсортированный список" << endl; for (int i=0; i<n; i++) { cout << p[i].name << " " << p[i].age << endl; } cout << "Нажмите клавишу для выхода"; cin.sync(); cin.get(); return 0; }
6. Программно преобразовать цветной Bitmap в чёрно-белый. Код не оптимизирован, и подходит только для 24/32-битных растров. Файл с именем image.bmp соответствующего формата должен находиться в текущей папке.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <malloc.h> #include <stdint.h> //только для 24/32-битных растров int bmp_to_gray(const char* fn){ int bpp, width, height, r, g, b; long off; size_t num, size, i; uint8_t* bits, *pb; uint16_t finf[7]; uint32_t inf[10]; FILE* fp = fopen(fn, "rb+"); if(fp == NULL) return 0; num = fread((void*)&finf[0], sizeof(finf[0]), 7, fp); if((finf[0] != 0x4D42) || (num != 7)){ fclose(fp); return 0; } num = fread((void*)&inf[0], sizeof(inf[0]), 10, fp); bpp = (int)((inf[3] >> 16) & 0xFFFF); if((inf[4] != 0) || (bpp < 24) || (bpp > 32) || (num != 10)){ fclose(fp); return 0; } off = (long)((uint32_t)finf[6] << 16) | finf[5]; fseek(fp, off, SEEK_SET); if(feof(fp)){ fclose(fp); return 0; } width = (int)inf[1]; height = (int)inf[2]; if(height < 0) height = 0 - height; size = (size_t)((width * bpp + 31) & ~31) / 8 * height; bits = (uint8_t*)malloc(size); if(bits == NULL){ fclose(fp); return 0; } num = fread((void*)bits, 1, size, fp); if(num != size){ fclose(fp); free(bits); return 0; } bpp /= 8; pb = bits; for(i = 0; i < size; i += bpp){ r = (int)pb[0]; g = (int)pb[1]; b = (int)pb[2]; pb[0] = (uint8_t)((r * 77 + g * 150 + b * 29 + 128) / 256); pb[1] = pb[0]; pb[2] = pb[0]; pb += bpp; } fseek(fp, off, SEEK_SET); num = fwrite((const void*)bits, 1, size, fp); fflush(fp); fclose(fp); //free(bits); if(num != size) num = 0; return (num > 0); } int main(void) { if(bmp_to_gray("image.bmp")) puts("yes to gray."); else puts("error convert!"); return 0; }
7. Определить какая из заданных точек ближе к началу координат. Учесть случай, когда ответов несколько (точки равноудалены).
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> #include <math.h> using namespace std; void main() { setlocale(0,"russian"); double x1 , x2 , y1 , y2 , x3, у3, ResultA , ResultB, ResultC; cout << " Введите x1 точки A : "; cin >> x1; cout << " Введите у1 точки A : "; cin >> y1; cout << " Введите х2 точки B : "; cin >> x2; cout << " Введите у2 точки B : "; cin >> y2; cout << " Введите x3 точки C : "; cin >> x3; cout << " Введите у3 точки C : "; cin >> у3; ResultA = sqrt((x1 * x1)+(y1 * y1)); ResultB = sqrt((x2 * x2)+(y2 * y2)); ResultC = sqrt((x3 * x3)+(у3 * у3)); double Min = min ( min (ResultA , ResultB), ResultC); cout << "Ближе к началу координат " << (ResultA==Min ? "A " : "") << (ResultB==Min ? "B " : "") << (ResultC==Min ? "C" : ""); _getch(); }
8. Дана строка, состоящая из групп нулей и единиц. Подсчитать количество единиц в группах с нечетным количеством символов.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { const char *s = "1110000010101011110101100"; //123 4 5 6 7 int len = strlen (s), cnt =0, all=0; for (int i=0; i<len; i++) { if (s[i]=='1') cnt++; else { //по условию в строке только нули и единицы if (cnt%2) all+=cnt; cnt=0; } } printf ("\n%d",all); getchar(); return 0; }
9. В заданном тексте на русском языке заменить "Ь" на "Ъ" (с учётом регистра символов)
#define _CRT_SECURE_NO_WARNINGS #include <windows.h> #include <locale.h> #include <stdio.h> #include <string.h> int main() { setlocale(LC_ALL,"Rus"); SetConsoleCP(1251); SetConsoleOutputCP(1251); char *text= new char [80]; strcpy(text,"Заменяем мягький знакЬ на твёръдый"); int len=strlen(text); for (int i=0; i<len; i++) if (strchr("ьЬ",text[i])) text[i]-=2; puts (text); getchar(); return 0; }
10. Пользователь вводит целое положительное число n. Найти значение суммы 1^1 + 2^3 + 3^5 + 4^7 + ... + n^(2n-1), где "^" обозначает "возведение в степень". Вывести на экран таблицу всех значений суммы, которые не выходят за пределы диапазона типа long int.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> #include <limits.h> int main() { int n=0; printf ("\nN="); fflush (stdin); scanf("%d",&n); long int sum=0L,i; for (i=1L;;i++) { sum+=pow((double)i,2*i-1); if (sum>0 && sum<INT_MAX) printf ("%ld:%ld ",i,sum); else break; } fflush(stdin); getchar(); return 0; }
На самом деле, для 32-разрядного кода уже на 7-м слагаемом сумма уйдет в переполнение, то есть, станет отрицательной.
11. Ввести и вывести двумерный массив с помощью указателей (в коде не должно быть квадратных скобок).
#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> void main() { int n, i, j, a; int **el; printf("Enter n = "); scanf("%i", &n); el = (int **)calloc(n, sizeof(int *)); for (i = 0; i < n; i++) { *el = (int *)calloc(n, sizeof(int)); } for (i = 0; i < n; i++) { int *ptr = (int *)el+i; for (j = 0; j < n; j++) { printf("Enter a[%i][%i] = ", i + 1, j + 1); scanf("%i", &a); *(ptr+j) = a; } } for (i = 0; i < n; i++) { int *ptr = (int *)el+i; for (j = 0; j < n; j++) { printf(" %i", *(ptr+j)); } printf("\n"); } _getch(); }
12. Вычислить произведение (1+sin0.1)(1+sin0.2)...(1+sin10), используя цикл while
#include <stdio.h> #include <math.h> int main() { double p=1,n=0.1; while (n<10.01) { p*=(1+sin(n)); n+=0.1; } printf ("\n%.15lf",p); getchar(); return 0; }
Ответ будет близок к 0
13. Дано натуральное число n и действительное значение х. Вычислить сумму sinx+sin^2x+...+sin^nx (где "^" - возведение в степень), используя цикл do ... while и не используя функцию pow.
#include <stdio.h> #include <math.h> int main() { int n=10,i=1; double x=0.1,sum=0,sx=sin(x),item=sx; do { sum+=item; item*=sx; } while (++i<=n); printf ("\n%lf",sum); getchar(); return 0; }
14. Вычислить сумму 1+1/(2*2*2)+1/(3*3*3)+...+1/(n*n*n), используя цикл while
#include <stdio.h> #include <math.h> int main() { double sum=0; int i=1,n=10; while (i<=n) { sum+=1./(i*i*i); i++; }; printf ("\n%lf",sum); getchar(); return 0; }
15. Почему эта программа зацикливается на чтении из файла?
#define _CRT_SECURE_NO_WARNINGS #include <windows.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> int main(void) { setlocale(LC_ALL,"Rus"); SetConsoleCP(1251); SetConsoleOutputCP(1251); FILE *fp = fopen ("text.txt","r"); if (fp==NULL) { printf ("\nне удалось открыть файл"); getchar(); exit (1); } float a; while (1) { fscanf (fp,"%f",&a); if (feof(fp)) break; //Если файл кончился, выйти из цикла //здесь выполняется обработка очередного значения a, например: printf ("%.2f ",a); } fclose(fp); fflush(stdin); getchar(); return 0; }
если файл text.txt вот такой:
1 1.5 -3.5 2 3.5
Предолжить 2 способа решения проблемы :)
А ты либо трусы надень, либо крестик сними... В смысле, или убери русскую локаль, для которой разделитель целой и дробной части числа - не точка, а запятая:
// setlocale(LC_ALL,"Rus");
либо в файле замени . на ,
1 1,5 -3,5 2 3,5
16. Написать программу для поиска 100 первых простых чисел.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> int simple (long double n) { if (n<=1) return 0; //1 - не простое if (n<4) return 1; //2, 3 таки да for (int i=2; i<=floor(sqrt(n+0.)); i++) if ((long int)n%i==0) return 0; return 1; } int main() { const int n = 100; int i,cnt; for (i=cnt=0;;i++) { if (simple(i)) { printf ("%d)%d ",cnt+1,i); cnt++; if (cnt==n) break; } } getchar(); return 0; }
17. (бредовая). Написать макрос, который переводит время из 24-часового представления в 12-часовое. Использовать при этом структуру "время", которая имеет поля "час", "минута", "секунда".
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #define PEREVOD(my,str) sprintf (str,"%02d:%02d:%02d %s", my.h%12, my.m, my.s, (my.h<12?"am":"pm")) int main () { struct time { int h,m,s; }; time my = { 23, 59, 0 }; char str[80]; PEREVOD(my,str); printf ("\n%s", str); getchar(); return 0; }
18. Отсортировать только положительные элементы одномерного целочисленного массива по возрастанию.
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int main () { const int n = 7; int a[n] = { 3, -1, 5, 2, 1, 0, -7 }; for (int i=0; i<n-1; i++) for (int j=i+1; j<n; j++) if (a[i]>0 && a[j]>0 && a[i]>a[j]) { int t=a[i]; a[i]=a[j]; a[j]=t; } for (int i=0; i<n; i++) cout << a[i] << " "; cin.sync(); cin.get(); return 0; }
19. Во введённой строке текста поменять местами первую и последнюю букву каждого слова.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { char *token, buf[81],*separators = "\t,.:!? "; puts ("Enter the text"); gets(buf); token = strtok(buf, separators); while(token != NULL) { int len=strlen(token); char c=token[len-1]; token[len-1]=token[0]; token[0]=c; printf ("%s ",token); token = strtok(NULL, separators); } getchar(); return 0; }
Знаки препинания этот код не сохраняет.
Enter the text mama mila ramu milom! aamm ailm uamr milom
20. Из слов исходной строки удалить все символы, стоящие на нечётных местах.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main () { char *token, buf[81],*separators = "\t,.:;!? "; strcpy (buf," mama\tmila, ramu milom! Mila Ramu ne razbila."); token = strtok(buf, separators); while(token != NULL) { for (int i=0; i<strlen(token); i+=2) printf ("%c",token[i]); //если 0 - "чётная" позиция и отсчёт символов в слове ведётся с нуля, иначе немного поменять цикл token = strtok(NULL, separators); if (token) printf (" "); } getchar(); return 0; }
21. В одномерном массиве, состоящем из N вещественных элементов, вычислить: номер максимального по модулю элемента массива; сумму элементов массива, расположенных после первого положительного элемента. Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [а, b], а потом — все остальные.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> int main () { const int n = 10; double m[n] = { -3, -35, 2, 13, 8, 34, 1, 4, -3, 0 }; double sum=0,max=m[0]; int i,j,nmax=0; int first=0; for (i=0; i<n; i++) { if (fabs(m[i])>max) { max=fabs(m[i]); nmax=i; } if (first) sum+=m[i]; if (m[i]>0) first=1; } printf ("\nNumber=%d, Summa=%.1lf",nmax,sum); double a=-4,b=10; for (i=0; i<n-1; i++) { if (floor(m[i])>=a && floor(m[i])<=b) continue; for (j=i+1; j<n; j++) { if (floor(m[j])>=a && floor(m[j])<=b) { double temp=m[i]; m[i]=m[j]; m[j]=temp; } } } printf ("\nnew array: "); for (i=0; i<n; i++) printf ("%.0lf ",m[i]); getchar(); return 0; }
22. Дано натуральное число. Определить номер некоторой заданной цифры в нём, считая от конца числа. Если такой цифры нет, ответом должно быть число 0; если таких цифр в числе несколько, должен быть определён номер самой правой из них.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main () { long int n = 334752; //число int d = 3; //извлекаемая цифра int p = 1; int found = 0; while (n) { int digit = n%10; if (digit==d) { found=1; break; } n/=10; p++; } printf ("\n%d",found?p:0); getchar (); return 0; }
23. Составить программу, которая находит наибольшее из трёх целых чисел, введенных пользователем. Если таких чисел несколько, выдавать соответствующие сообщения.
#include <stdio.h> int main(void) { int a, b, c; scanf("%d %d %d", &a,&b,&c); int max = a; if (b>max) max=b; if (c>max) max=c; if (max==a) printf ("a=%d ",a); if (max==b) printf ("b=%d ",b); if (max==c) printf ("c=%d",c); return 0; }
24. Написать программу для простой обработки слов из текста. В программе должна быть функция на проверку того, является ли слово палиндромом. Файл читается по слову со стандартного потока ввода stdin с помощью спецификатора %s функции scanf. не использовать методы из string.h (cstring).
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int is_palindrome(char *buf) { char *start=buf,*end; while (*buf) { end=buf; buf++; } while (end>=start) { if (*end!=*start) return 0; end--; start++; } return 1; } int main(void){ char buf[81]; puts("Enter the text, Ctrl+Z for exit\n"); while(scanf("%s",buf)==1) { if (is_palindrome(buf)) printf ("\npalindrome: %s",buf); else printf ("\nword: %s",buf); } getchar(); return 0; }
25. Заполнить главную диагональ матрицы единицами, матрица может быть не квадратной.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { const int n=5,m=4; int a[n][m],i,j; for (i=0; i<n; i++) for (j=0; j<m; j++) { a[i][j] = (i==j?1:0); } for (i=0; i<n; i++) { printf ("\n"); for (j=0; j<m; j++) printf ("%d\t",a[i][j]); } fflush (stdin); getchar(); return 0; }
26. Дана матрица размерностью M × N. Описать функцию, которая возвращает массив. Для каждого столбца матрицы с чётным номером (2, 4, ...) найти сумму его элементов. Условный оператор не использовать.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int * func (int m, int n, int **a) { int * v = (int *) malloc ((n/2)*sizeof(int)); for (int j=1,k=0; j<=n; j+=2) { v[k]=0; for (int i=0; i<m; i++) v[k]+=a[i][j]; k++; } return v; } int main() { const int m=5,n=6; int i,j; int **a = (int **)malloc(m*sizeof(int *)); for (i=0; i<m; i++) a[i]=(int *)malloc(n*sizeof(int)); for (i=0; i<m; i++) { printf ("\n"); for (j=0; j<n; j++) { a[i][j]=i+j; printf ("%d\t",a[i][j]); } } int *v = func(m,n,a); printf ("\n"); for (j=0; j<n/2; j++) printf ("\t%d\t",v[j]); fflush (stdin); getchar(); return 0; }
27. Дана матрица А(M,N). Если среди элементов матрицы есть хотя бы одно простое число, отсортировать элементы ее строк по возрастанию значений.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int a[20][20],i,j,n,m,k,f; puts ("Введите n и m"); scanf ("%d %d",&n,&m); printf ("\nSource:"); for (i=0;i<n;i++) { printf ("\n"); for (j=0;j<m;j++) { a[i][j]=rand()%100; //scanf ("%d",&a[i][j]); printf ("%d ",a[i][j]); } } int is=0; for (i=0;i<n;i++) for (j=0;j<m;j++) for (k=2;k<=floor(sqrt(0.+a[i][j]));k++) if (a[i][j]%k==0) { is=1; break; } printf ("\nDestination:"); if (is) for (i=0;i<n;i++) { printf ("\n"); for (j=0;j<m-1;j++) for (k=j+1;k<m;k++) if (a[i][j]>a[i][k]) { f=a[i][j]; a[i][j]=a[i][k]; a[i][k]=f; } for (j=0;j<m;j++) printf ("%d ",a[i][j]); } else printf (" no simple number!"); fflush(stdin); getchar(); return 0; }
28. В файле data.txt заданы следующие данные: фамилия учащегося, класс, 4 оценки, например:
Putin 1a 2 2 2 2 Medvedev 2b 3 4 4 3 Obamka 1a 4 4 4 3 IlyaMuromets 1a 5 5 5 5 HBZKto 1a 4 3 4 5
Распечатать фамилии тех учеников, которые не получили ни одной тройки за последнюю четверть. В каких классах учатся эти ученики? Каков их средний балл?
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { char fam[30],klass[3]; int ball[4]; int i,j,c3; float sred; FILE *f=fopen("data.txt","rt"); if (f==NULL) { printf ("\nCan't open file data.txt in current folder!"); fflush(stdin); getchar(); return 1; } for (i=0; i<5; i++) { fscanf (f,"%s %s",fam,klass); c3=0; sred=0; for (j=0; j<4; j++) { fscanf (f,"%d",&ball[j]); if (ball[j]==3) c3++; sred+=ball[j]; } fscanf (f,"\n"); if (c3==0) printf ("\n%s %s %.2f",fam,klass,sred/4); } fclose(f); fflush(stdin); getchar(); return 0; }
29. Имеются 10 гирь весом 100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000, 3000 г. Сколькими способами гирями этого набора можно составить вес в v грамм?
Опять диофантово уравнение :) Для v=3000 (3 кг) получится 599 способов, а для v=9000 - что-то ужасное :)
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main () { const int n = 10; int *a = (int *)malloc(n*sizeof(int)); //коэффиценты a[0]=100; a[1]=200; a[2]=300; a[3]=500; a[4]=1000; a[5]=1200; a[6]=1400; a[7]=1500; a[8]=2000; a[9]=3000; int k = 3000; //правая часть int *b = (int *)malloc(n*sizeof(int)); int *c = (int *)malloc(n*sizeof(int)); int i,j; for (i=0; i<n; i++) { b[i]=k/a[i]; c[i]=0; } long int s; int count=0; int found=0; do { //Начало цикла перебора s=0; for (i=0; i<n; i++) s+=a[i]*c[i]; if (s==k) { //Вывод очередного решения c[i] printf ("\n%d) ",++count); for (i=0; i<n; i++) { printf ("%d*%d",a[i],c[i]); if (i<n-1) printf ("+"); } printf ("=%d",k); } found = 0; for (i=n-1; i>-1; i--) { if (c[i]==b[i]) for (j=i; j<n; j++) c[j]=0; else { c[i]++; break; } } if (i<0) found = 1; } while (!found); //Конец цикла перебора fflush(stdin); getchar(); return 0; }
30. Ввести натуральное число и определить, какие цифры встречаются в нём несколько раз, а какие - только один раз (вывести отдельно). Обеспечить защиту от ввода некорректных данных.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <conio.h> #include <stdlib.h> int main () { char str[81]; int ch,k=0,i,c[10]; printf ("\nPrint digits, ENTER is OK, ESC is exit\n"); do { fflush(stdin); ch=getch(); if (ch>='0' && ch<='9') { printf ("%c",ch); str[k++]=ch; } else if (ch==13) { if (k>0) { for (i=0; i<10; i++) c[i]=0; for (i=0; i<k; i++) c[str[i]-'0']++; printf ("\nRepeating: "); for (i=0; i<10; i++) if (c[i]>1) printf ("%d ",i); printf ("\nNo repeating: "); for (i=0; i<10; i++) if (c[i]==1) printf ("%d ",i); k=0; } else printf ("\nNo digits!"); printf ("\nTry it again, baby\n"); } } while (ch!=27); return 0; }
31. Задана последовательность из 70 целых чисел. Определить, со скольки отрицательных чисел она начинается.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int a[70],i; printf ("\n"); for (i=0; i<70; i++) { a[i]=-90+rand()%100; printf ("%d ",a[i]); } int cnt=0; for (i=0;i<70;i++) if (a[i]>=0) break; printf ("\n%d negative int in start",i); fflush (stdin); getchar(); return 0; }
30.10.2015, 17:46 [8550 просмотров]