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

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


теги: c++ список алгоритм

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