• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Задача На Циклы

  • Автор темы Homka
  • Дата начала
H

Homka

Задание: образует ли десятичная запись n в квадрате упорядочённую по убыванию последовательность.

C++:
#include <stdio.h>
#include <math.h>
#include <conio.h>
float n,k,i, numb,
int cifri, mas[10];
/*int numb;*/
void main()
{
clrscr();
cifri=0;
printf("Vvedite n:\n");
scanf("%f", &n,);
numb=pow(n,2);
printf("%.0f", numb);
do
{
a=numb%10;
numb/=10;
mas[i]=mas[i]+a;
cifri++;
}
while(numb>0);
printf("Kolichestvo cifer=%d\n", cifri);
for(i=0;i<k; i++)
{
if(mass[i]>mass[i+1])
{ printf("Posledovatelnost' po ubivaniju\n");}
else
{ printf( "Posledovatelnost' narushena"); }
getch();
}
}

Подскажите, что не так... может поправите к верному коду программы.

Заранее спасибо.
 
H

Homka

Толком не могу понять задание...

Если внятно объясну, то вот: число, допустим 9.
Я возвожу в квадрат: 81

И я должен 81 разбить на массив: [8][1]

И сравнить, массив идёт по убыванию или возрастает.

и где вы задаете k?

Немножко переделал код:

C++:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int n,k,i,a,t;
int c, m[100];
main()
{
clrscr();
printf("Vvedite n:");
scanf("%d",&n);
n=n*n;
printf("%d\n", n);
i=0;
while(n)
{
a=n%10;
n/=10;
m[i]=a;
i++;
k++;
printf("%d", m[i]);
}
for(i=0;i<k; i++)
if(m[i]>m[i+1])
t++;
else
t--;
if(t=k)
{
printf("\nPosledovatelnost ne po ubivaniu");
}
else
{
printf("Posledovatelnost' po ubivaniju\n");
}
getch();
return n*n;
}
 
S

Senset

Если внятно объясну, то вот: число, допустим 9.
Я возвожу в квадрат: 81

И я должен 81 разбить на массив: [8][1]

И сравнить, массив идёт по убыванию или возрастает.

мммм... это интересно, я так понимаю проблема именно с разбитием на массив.
Без рекурсий и доп. функций это будет так:
C++:
int determ=1;
while (determ<n) determ*=10;
if (determ==1) determ=10;
else determ/=10;
while(n)
{
if (n>determ)
{
a=n/determ;
n=n-a*determ;
determ/=10;
if (determ==1) determ=10;
}
else
{
a=n%determ;
n=0;
}
m[i]=a;
i++;
k++;
}

И весь код станет вот таким:
C++:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int n,k,i,a,t;
int c, m[100];
main()
{
clrscr();
printf("Vvedite n:");
scanf("%d",&n);
n=n*n;
printf("%d\n", n);
i=0;
int determ=1;
while (determ<n) determ*=10;
if (determ==1) determ=10;
else determ/=10;
printf("determ=%d\n",determ);
while(n)
{
if (n>determ)
{
a=n/determ;
n=n-a*determ;
determ/=10;
if (determ==1) determ=10;
}
else
{
a=n%determ;
n=0;
}
m[i]=a;
i++;
k++;
}
for (i=0;i<k;i++) printf ("%d ",m[i]);
for(i=0;i<k; i++)
if(m[i]>m[i+1])
t++;
else
t--;
if(t=k)
{
printf("\nPosledovatelnost ne po ubivaniu");
}
else
{
printf("Posledovatelnost' po ubivaniju\n");
}
getch();
return n*n;
}
 
H

Homka

Senset, спасибо.)

И ещё вопросик: вот задача
V-36kQ9i4yI.jpg


Часть Б). Какой код должен быть?... я с условиями нахождения максимального значения не могу сделать.

Часть А) более лёгкая, чем Б). Поможете?
 
S

Senset

Часть А) более лёгкая, чем Б). Поможете?[/b]

C++:
//получим сумму первой строки (предполаем что индексация матрицы начинается с 0)
double max=0;
int max_string=0;
for (int i=0;i<n;i++) max+=m[0,i];

for (int i=1;i<n;i++)
{
double sum=0;
for (int j=0;j<n;j++)
{
if (j>=i) sum+=m[i,j]; //учитываем только элементы правее главной диагонали (учитывая значение на самой диагонали)
}
if (sum>max)
{
max=sum;
max_string=i;
}
} 
//Здесь получаем, что: max - хранит значение максимальной суммы, max_string - хранит номер строки, где сумма нужных элементов максимальна
printf("max=%0.4f max_string=%0.4f",max,max_string);

Чтобы переделать этот код для задачи "Б", достаточно дополнить условие, которое считает сумму нужных элементов
 
H

Homka

C++:
//получим сумму первой строки (предполаем что индексация матрицы начинается с 0)
double max=0;
int max_string=0;
for (int i=0;i<n;i++) max+=m[0,i];

for (int i=1;i<n;i++)
{
double sum=0;
for (int j=0;j<n;j++)
{
if (j>=i) sum+=m[i,j]; //учитываем только элементы правее главной диагонали (учитывая значение на самой диагонали)
}
if (sum>max)
{
max=sum;
max_string=i;
}
} 
//Здесь получаем, что: max - хранит значение максимальной суммы, max_string - хранит номер строки, где сумма нужных элементов максимальна
printf("max=%0.4f max_string=%0.4f",max,max_string);

Чтобы переделать этот код для задачи "Б", достаточно дополнить условие, которое считает сумму нужных элементов

Так не поделитесь условиями для части Б?
 
S

Senset

Так не поделитесь условиями для части Б?
:( Нет, потому что достаточно разобраться с тем как идет накопление суммы для части "А", и тогда достаточно легко и просто понять, что нужно дописать чтобы работало и для части "Б". А Вы ленитесь.
 
H

Homka

:( Нет, потому что достаточно разобраться с тем как идет накопление суммы для части "А", и тогда достаточно легко и просто понять, что нужно дописать чтобы работало и для части "Б". А Вы ленитесь.

Хорошо. Попробую сам. Если что, вышлю код, чтоб поправить наверняка ^^
 
H

Homka

:( Нет, потому что достаточно разобраться с тем как идет накопление суммы для части "А", и тогда достаточно легко и просто понять, что нужно дописать чтобы работало и для части "Б". А Вы ленитесь.

Уважаемый Senset.

У меня вообще не приходит в голову, какое условие нужно для части "Б".


C++:
#include <stdio.h>
#include<conio.h>

void main()
{
int t=0,i,j,N,Max=0;
clrscr();
printf("Enter a size of mass 'N'\n");
scanf("%d",&N);
if (N<=18)
{
int mass[18][18];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
scanf("%d",&mass[i][j]);
}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
printf("%d ", mass[i][j]);
t++;
if(t==N)
{
printf("\n");
t=0;
}
}
for(i=0;i<N;i++)
{
for(j=i;j<N;j++);
}
{
for(i=N;i<N;i--)
{
for(j=N;j<N;j--)
{
if(Max<mass[i][j])
Max=mass[i][j];
}
}
}
printf("Max=%d\n", Max);
}
else
{
printf("\nN>18 - uslovie narusheno");
}
getch();
}

Что не так я написал? :\
 
S

Senset

Уважаемый Senset.

У меня вообще не приходит в голову, какое условие нужно для части "Б".


C++:
........
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
printf("%d ", mass[i][j]);
t++;
if(t==N)
{
printf("\n");
t=0;
}
}
............

Это беспредел! Конечно это работает (в смысле вывод матрицы), но согласитесь неудобно кушать через нос.
Обратите внимание на этот код:
C++:
for(i=0;i<N;i++)
{
for(j=0;j<N;j++) printf("%d ", mass[i][j]);
printf("\n");
}
и постарайтесь понять как это происходит.

for(i=N;i<N;i--)
{
for(j=N;j<N;j--)
{
if(Max<mass[j])
Max=mass[j];

Прежде, чем делать что-то подобное (хотя я не понимаю зачем это) нужно посмотреть "а чему равен Ваш Max изначально"?... по-моему чему-то нехорошему (т.е. нулю), а значит если матрица состоит из элементов ниже нуля (Ваш алгоритм не заработает)

for(i=0;i<N;i++)
{
for(j=i;j<N;j++);
}
Отличный бесполезный цикл (даже два). Зачем Вы это сделали?

Итого:
1) С вводом\выводом всё ок (посмотрите мой код для вывода)
2) Начальное значение Max - не зачет (посмотрите как я нахожу начальное значение максимума).
3) Попробуйте продублировать части моего кода, которые я приводил выше (для элементов правее главной диагонали) и посмотрите что нужно менять чтобы "уходить" от привязки к главной диагонали.
P.S. когда приводите код постарайтесь отделять пробелами блоки кода (как я например) --> так проще читать и видеть вложенности
 
S

Senset

Senset, спасибо.)

И ещё вопросик: вот задача
V-36kQ9i4yI.jpg


Часть Б). Какой код должен быть?... я с условиями нахождения максимального значения не могу сделать.

Часть А) более лёгкая, чем Б). Поможете?

И еще будет просто замечательно, если Вы уточните задание.
Например: как выглядит "заштрихованная" область для: N=3,N=5,N=8, N=9 для вариантов "А" и "Б".
P.S. Вдруг это не главные диагонали, и если так, то каким образом идет определение области (м.б. пользователь сам указывает нужные элементы)?
 
H

Homka

И еще будет просто замечательно, если Вы уточните задание.
Например: как выглядит "заштрихованная" область для: N=3,N=5,N=8, N=9 для вариантов "А" и "Б".
P.S. Вдруг это не главные диагонали, и если так, то каким образом идет определение области (м.б. пользователь сам указывает нужные элементы)?

Спасибо)

Сдал я отчёт по лабораторной работе!) :)

Спасибо за помощь!)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!