PDA

Просмотр полной версии : Решение проблем в программировании


gpo8ocek
29.08.2010, 11:23
#include <stdio.h>
#include <math.h>
#include <algorithm>

using namespace std;

struct coord {
double x, y;
};

struct point {
coord t;
point *next;
};

coord a[100];

int main ()
{
int n, i, j, maxn, minn;
double min, max;

freopen("input.txt", "rw", stdin);
freopen("output.txt", "wt", stdout);

scanf("%d", &n);
scanf("%lf%lf", &a[0].x, &a[0].y);

min = a[0].y;
max = min;
maxn = minn = 0;

for (i = 1; i < n; i++) {
scanf("%lf%lf", &a[i].x, &a[i].y);
if (a[i].y > max) {
max = a[i].y;
maxn = i;
}
if (a[i].y < min) {
min = a[i].y;
minn = i;
}
}

point.t = a[maxn];

}

На строчке
<<point.t = a[maxn];>>
вылетает
<<error C2143: синтаксическая ошибка: отсутствие ";" перед ".">>
причём, 2 раза.

McCormick
29.08.2010, 23:14
point - это тип. Создай переменную данного типа и ей присваивай значение.

gpo8ocek
30.08.2010, 15:09
тьфу, внатуре :)) Засиделся слишком за компом :))

SoaT
07.10.2010, 18:30
Помогите плз с задачей. Не могу понять почему стопится выполение :(
Натуральное число называется палиндромом, если оно читается одинаково с обеих сторон, например, 171.
Возьмём любое число. Если оно не палиндром, то перевернем его и сложим с исходным. Если не получится палиндром, то проделаем с ним то же и т.д. пока не получится палиндром. Для всех чисел от 100 до 200 найти, через сколько шагов получится палиндром и какой.
# include<iostream>
# include<math.h>

int pere(int x) {
int i,imax,y, mas[100],z;

for (i=0; x>0; i++) {
mas[i]=x%10;
x/=10;
}

imax=i-1;

for(z=pow(10,imax),i=0,y=0; i<=imax; z/=10,i++) {
y+=mas[i]*z;

}

return(y);
}

using namespace std;

int palin(int x ){
int i,j, m[1000];
for (i=0; x>0; i++) {
m[i]=x%10;
x/=10;
}
i=i-1;
for (j=i,i=0;i<j; i++,j--) {
if (m[i] != m[j]) return 0;
}
return 1;
}

int main() {
int ch,i,sum;

for(ch=100; ch<=200; ch++) {
cout<<ch;
if (palin(ch)==1) cout<<" palindrom\n";
else {
i=0; sum=ch;
while (palin(sum)==0) {
sum=ch+pere(sum);
i++;
}
cout<<" "<<sum; cout<<" kol_shagov - "<<i<<endl;
}
}
}

100 101 kol_shagov - 1
101 palindrom
102 303 kol_shagov - 1
103 404 kol_shagov - 1
104 505 kol_shagov - 1
105 606 kol_shagov - 1
106 707 kol_shagov - 1
107 808 kol_shagov - 1
108 909 kol_shagov - 1
109 121 kol_shagov - 3
110 121 kol_shagov - 1
111 palindrom
112 323 kol_shagov - 1
113 424 kol_shagov - 1
114 525 kol_shagov - 1
115 626 kol_shagov - 1
116 727 kol_shagov - 1
117 828 kol_shagov - 1
118 929 kol_shagov - 1
119 414 kol_shagov - 62
120 141 kol_shagov - 1
121 palindrom
122 343 kol_shagov - 1
123 444 kol_shagov - 1
124 545 kol_shagov - 1
125 646 kol_shagov - 1
126 747 kol_shagov - 1
127 848 kol_shagov - 1
128 949 kol_shagov - 1
129 828 kol_shagov - 35
130 161 kol_shagov - 1
131 palindrom
132 363 kol_shagov - 1
133 464 kol_shagov - 1
134 565 kol_shagov - 1
135 666 kol_shagov - 1
136 767 kol_shagov - 1
137 868 kol_shagov - 1
138 969 kol_shagov - 1
139 161 kol_shagov - 10
140 181 kol_shagov - 1
141 palindrom
142 383 kol_shagov - 1
143 484 kol_shagov - 1
144 585 kol_shagov - 1
145 686 kol_shagov - 1
146 787 kol_shagov - 1
147 888 kol_shagov - 1
148 989 kol_shagov - 1
149 505 kol_shagov - 10
150 252 kol_shagov - 2
151 palindrom
152 1111 kol_shagov - 103
153 585 kol_shagov - 24
154 5555 kol_shagov - 10
155 22122 kol_shagov - 53
156 7557 kol_shagov - 121
157 686 kol_shagov - 40
158 383 kol_shagov - 36
159 393 kol_shagov - 9
160 282 kol_shagov - 2
161 palindrom

zhekas
08.10.2010, 03:30
подозреваю, что в 46 строке
sum=ch+pere(sum);
надо заменить на
sum=sum+pere(sum);

На примере числа 162. 162 - не палиндром. Производим операцию
162+261=423 . 423 - не палиндром. Дальше производим операцию над числом 423
423+324=747 747 - палиндром.

У вас же первое слагаемое всё время исходное число 162.

SoaT
08.10.2010, 09:50
подозреваю, что в 46 строке
...
У вас же первое слагаемое всё время исходное число 162.
Возьмём любое число. Если оно не палиндром, то перевернем его и сложим с исходным. Если не получится палиндром, то проделаем с ним то же и т.д. пока не получится палиндром
После долгих дебатов было решено, что в условии так имеется ввиду как написано у меня. Вопрос в другом. Почему по моему не решается задача?

zhekas, ты пробовал откомпилить и запустить? У меня на g++ 4.4.5 стопится. И на винде в VS 6.0 (синтаксис изменялся само-собой) тоже стопится.

zhekas
08.10.2010, 13:44
В таком случае данная процедура теряет смысл как алгоритм сведения числа к палиндрому.
А программа не стопится а зацикливается, т.е. не может выйти из цикла, поскольку не находит такого числа.

SoaT
08.10.2010, 15:41
zhekas, угу. Сделал sum+=pere(sum) и пришлось ещё все int заменить на unsigned int, а то некоторые числа уж больно здоровые)
Спасибо

zhekas
08.10.2010, 16:23
Боюсь, что они длиннее чем вы думаете. И замена даже на long их не спасает. Хотя вру. у меня просто int и long -это один и тот же тип.
Хотя sum вполне может перескакивать через максимальное значение, И получится не правильный ответ.

SoaT
08.10.2010, 18:28
zhekas, unsigned int же. Когда ставил long или просто int, то ответ получался не палиндром, да ещё и минусовой.

zhekas
08.10.2010, 18:32
За счет того что unsigned всегда положительный вы могли и не заметить перехода за максимальное значение.
Более того с помощью отладчика gdb можно заметить, что для ch=196

при i=30 sum меняется
с sum=3121672202
на sum=849466119

То есть sum уменьшилась. А этого не может быть sum может только возрастать. Значит sum перескочило через максимальное значение

SoaT
08.10.2010, 20:22
zhekas, оО так это и проверку толком то не сделать чтоли?

zhekas
09.10.2010, 02:38
В принципе, тут надо работать не с числами а с массивом разрядов (тем более вы и так сначала преобразуете число в массив разрядов, а потом обратно). От этого массива требуется только операция сложения, что достаточно просто.

Число 196 После 48150 шагов так и не преобразовалось в палиндром. sum имеет 20000 знаков, С остальными числами всё в порядке.
Числа 177 и 187 обрели свои настоящие палиндромы.

Добавлено через 1 час 10 минут
# include<iostream>
# include<math.h>

const int m=20000;
int sum[m],n;
int pere() {
int i,p, mas[m];

for (i=0; i<n; i++) {
mas[i]=sum[i];
}
p=0;
for(i=0;i<n;i++) {
sum[i]=(mas[i]+mas[n-1-i]+p)%10;
p=(mas[i]+mas[n-1-i]+p)/10;
}
if (p!=0)
{
sum[n]=p;
n=n+1;
}

return 0;
}

using namespace std;

int palin(){
int i,j;
for (j=n-1,i=0;i<j; i++,j--) {
if (sum[i] != sum[j]) return 0;
}
return 1;
}

int main() {
int ch,i,j;

for(ch=100; ch<=200; ch++) {
cout<<ch;
sum[0]=ch%10;
sum[1]=(ch%100)/10;
sum[2]=ch/100;
n=3;
if (palin()==1) cout<<" palindrom\n";
else {
i=0;
while ((palin()==0)&(n<m)) {
pere();
i++;
}
cout<<" ";
if (n>=m)
cout<<" ne_nashel ";
else
for (j=n-1;j>=0;j--)
cout<<sum[j];
cout<<" kol_shagov - "<<i<<endl;
}
}
}

SoaT
15.10.2010, 12:47
zhekas, для переворота использую другой вариант, в 2-е строки без массивов. Да и задача уже "отвалилась", не надо вообщем.
За помощь спасибо!

opium
26.03.2011, 23:00
Подскажите, можно ли в с++ ввести команду, чтобы по заданной директории открывался файл?