Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
1

Удалить из последовательности простые числа и продублировать числа кратные 8

02.06.2015, 22:27. Показов 867. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ввести последовательность натуральных чисел.
Если последовательность не упорядочена по невозрастанию
и не упорядочена по неубыванию,
удалить из последовательности простые числа
и продублировать числа кратные 8.
В противном случае упорядочить последовательность
по неубыванию суммы цифр.
Последовательность хранить в односвязном списке.
Перед завершением программы очистить динамическую память
с помощью процедуры Dispose.

что бы я не вводил, сортирует только по неубыванию суммы цифр, подскажите, что не так, пожалуйста. (ввод из файла)
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
type
    list=^mas;
    mas=record
      data:Integer;
      next:list;
      end;
 
procedure vvod(var head:list);
var p,p1:list;
       f:text;
begin
assign(f,'input.txt');
reset(f);
head:=nil;
while not seekeof(f) do
begin
new(p);
read(f,p^.data);
if head = nil then head:=p
                       else p1^.next:=p;
p1:=p;
end;
p^.next:=nil;
end;
 
  function prost(x:integer):Boolean;
  var i:Integer;
  begin
    prost:=True;
    for i:=2 to Round(Sqrt(x)) do
     if x mod i = 0 then
     begin
       prost:=False;
       Exit;
     end;
  end;
 
  function sumc(x:integer):Integer;
  var s:Integer;
  begin
    s:=0;
    while x>0 do  begin
      s:=s+(x mod 10);
      x:=x div 10;
    end;
    sumc:=s;
  end;
 
procedure sort(var h:list);
  var
    q, w:list;
    x:Integer;
  begin
    w:=h;
    while w^.next<>nil do begin
      q:=w^.next;
      while q<>nil do begin
        if sumc(q^.data)<sumc(w^.data) then begin
          x:=q^.data;
          q^.data:=w^.data;
          w^.data:=x;
        end;
        q:=q^.next;
      end;
      w:=w^.next;
    end;
  end;
 
 procedure sort1(var head:list);
var w,q:list;
x:integer;
begin
 w:=head;
 while w^.next<>nil do begin
 q:=w^.next;
  while q<>nil do begin
   if w^.data<q^.data then begin
    x:=w^.data;
    w^.data:=q^.data;
    q^.data:=x;
   end;
  q:=q^.next;
  end;
 w:=w^.next;
 end;
end;
 
procedure sort2(var h:list);
  var
    q, w:list;
    x:Integer;
  begin
    w:=h;
    while w^.next<>nil do begin
      q:=w^.next;
      while q<>nil do begin
        if w^.data>q^.data then begin
          x:=w^.data;
          w^.data:=q^.data;
          q^.data:=x;
        end;
        q:=q^.next;
      end;
      w:=w^.next;
    end;
  end;
  
 procedure Del(var h:list);
  var c, p, ls:list;
  begin
    c:=h;
    ls:=h;
    while c<>nil do
    begin
      if prost(c^.data) then
      begin
       if c=h then h:=h^.next else
       ls^.next:=c^.next;
       p:=c;
       c:=c^.next;
       Dispose(p);
       Continue;
      end;
      ls:=c;
      c:=c^.next;
    end;
  end; 
 
procedure dubl(var head:list);
 var p,p1:list;
 begin
 p:=head;
 while p<>nil do begin
 if (p^.data mod 8 = 0) then begin
 new(p1);
 p1^.data:=p^.data;
 p1^.next:=p^.next;
 p^.next:=p1;
 p:=p1^.next;
 end
 else p:=p^.next;
 end;
 end;
 
 procedure out(h:list);
var p:list;
g:text;
begin
assign(g,'output.txt');
rewrite(g);
p:=h;
while p<>nil do begin
write(g,p^.data,'  ');
p:=p^.next;
end;
close(g);
end;
 
  var   head, p, p1, ub, vozr:list;
begin
head:=nil; 
vvod(head); ub:=head; vozr:=head;
sort1(ub);
sort2(vozr);
if ((ub=head) or (vozr=head)) then 
sort(head)
else begin del(head); dubl(head); end;
out(head);
p:=head;
while p<>nil do
begin
p1:=p^.next;
Dispose(p);
p:=p1;
end;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2015, 22:27
Ответы с готовыми решениями:

Удалить из последовательности числа, начинающиеся цифрой 2, а среди оставшихся продублировать числа, сумма цифр которых равна 25
Дана последовательность натуральных чисел {Aj}j=1...n (n&lt;=10000). Удалить из последовательности...

Массив. Удалить простые числа и продублировать числа, равные кубу целого числа
добрый вечер) тут надо написать такую программу дана последовательность чисел, удалить из этой...

Получить все двузначные числа, кратные 3, определив функцию, позволяющую распознавать простые числа.
Напишите пожалуйста решение!СПАСИБО! Получить все двузначные числа, кратные 3, определив функцию,...

Помогите вывести на экран из файла out1.txt числа кратные 20 а из второго все простые числа.
Помогите вывести на экран из файла out1.txt числа кратные 20 а из второго все простые числа.

7
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
05.06.2015, 17:25  [ТС] 2
все еще нужна помощь
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
05.06.2015, 22:20 3
Pascal
1
2
3
4
5
6
7
8
begin
head:=nil; 
vvod(head); ub:=head; vozr:=head;
sort1(ub);                                       <---- сортировка по возрастанию
sort2(vozr);                                     <---- сортировка по убыванию
if ((ub=head) or (vozr=head)) then 
sort(head)
else begin del(head); dubl(head); end;
Это вместо простого теста с последовательным сравнением - аналогом действий с массивом.
Pascal
1
2
3
4
5
6
7
8
9
  TestUp:=true;
  TestDown:=true;
  p:=a[0];
  for i:=1 to n-1 do
  begin
    TestUp:=TestUp and (p<=a[i]);
    TestDown:=TestDown and (p>=a[i]);
    p:=a[i];
  end;
Кроме того, судя по тексту sort1 и sort2 значения указателей на начало списка в них не изменяются, т.е. в любом случае по завершению этих процедур up=head и vozr=head.

Добавлено через 3 минуты
И ещё - в состав PABC.NET в одном из меню есть средство автоматического форматирования исходников (расстановка отступов) - воспользуйся им, уважай тех, кому придётся читать исходник.
0
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
06.06.2015, 00:10  [ТС] 4
Просто не очень понимаю, как работают списки, поэтому работаю, как с массивом. что есть р, а, testdown и testup?
Насчёт указателей на начало, похоже в этом и есть моя ошибка, но не мог(ли) бы ты(вы) подсказать, как сделать так, что б указатель менялся?

Про авторасстановку отступов не знал, поищу
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
06.06.2015, 14:59 5
Статья про оформление кода. Внизу статьи ссылки на описания других аспектов оформления.

Для понимания типа Pointer (и иже с ним), а также динамических структур - возьми учебник. Я разбирался по учебнику и книге Н.Вирт "Алгоритмы+структуры данных=программы".

Я бы просто протестировал список на "неубывание"/"невозрастание" без изменения расположения элементов. Примерно так
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  procedure TestOrder(head: list; var NonDecreasingOrder, NonIncreasingOrder: boolean);
  var
    PrevElem, CurrElem: list;
  begin
    NonDecreasingOrder := (head <> nil);
    NonIncreasingOrder := NonDecreasingOrder;
    if (head <> nil) then
    begin
      PrevElem := head;
      CurrElem := head^.Next;
      while CurrElem <> nil do
      begin
        NonDecreasingOrder := NonDecreasingOrder and (PrevElem^.Data <= CurrElem^.Data);
        NonIncreasingOrder := NonIncreasingOrder and (PrevElem^.Data >= CurrElem^.Data);
        PrevElem := CurrElem;
        CurrElem := CurrElem^.Next;
      end;
    end;
  end;
Или можно сделать не процедуру, а функцию, которая возвращает
-1 - невозрастающая
0 - ни та ни другая
+1 - неубывающая
Это уже на вкус.
1
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
07.06.2015, 23:30  [ТС] 6
т.е. этот кусок кода уже можно использовать в качестве проверки?
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
08.06.2015, 00:29 7
Так.
0
0 / 0 / 0
Регистрация: 02.06.2015
Сообщений: 5
08.06.2015, 17:41  [ТС] 8
спасибо
0
08.06.2015, 17:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2015, 17:41
Помогаю со студенческими работами здесь

Создать односвязный список из последовательности чисел, удалить из него все простые числа
Прошу помощи, не могу понять в чем ошибка, надо создать односвязный список из последовательности...

В заданной последовательности удалить простые числа, расположив прочие элементы в порядке, обратном исходному
Даны целые числа {a}_{1},...{a}_{n} где n - целое положительное число (n\leq 100). Если в...

Даны действительные числа. Поменять в последовательности числа кратные
Вы уж простите, но от задачи мозг взрывается, походу я очень тупой=( Подсобите решением!...

Программа, выводящая в обратном порядке все числа от 1 до 50, которые кратные 4 и все простые числа от 1 до 50
нужно написать программу, выводящую в обратном порядке все числа от 1 до 50, которые кратные 4 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru