Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
1

Если последовательность упорядочена по неубыванию, то оставить ее без изменения, иначе получить последовательность an, an-1, ... , a1

26.02.2014, 15:03. Просмотров 1736. Ответов 18
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста переделать программу под язык Си с Паскаля!

Дана последовательность действительных чисел a1, a2, ... , an (n>=2 и заранее неизвестно). Если последовательность упорядочена по неубыванию, то оставить ее без изменения, иначе получить последовательность an, an-1, ... ,a1.

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
uses crt;
const n =10; {размер последовательности}
type link=^Tlinks;
 Tlinks = record
  x: real;
  next: link;
 end;
 
var i: integer;
    a,b: real;
    f: link;
    flag: boolean;
procedure add(var f: link; a: real);
var cur: link;
begin
 new(cur);
 cur^.x:=a;
 cur^.next:=f;
 f:=cur;
end;
 
begin
 clrscr;
 f:=nil;
 flag:=false;
 writeln('Введите ',n,' чисел: ');
 for i:=1 to n do
   if (i>=2) then
    begin
     if not odd(i) then
     begin
      readln(b);
      if b<a then
       flag:=true;
      add(f,b);
     end
     else
     begin
      readln(a);
      if a<b then
       flag:=true;
      add(f,a);
     end;
    end
    else
     readln(a);
  if flag=false then
   writeln('Последовательность упорядочена по неубыванию')
  else
   begin
    writeln('Получена обратная последовательность: ');
    while f<>nil do
     begin
      write(f^.x,' ');
      f:=f^.next;
     end;
   end;
  readln;
end.

Нужно записать ответ в файл. Решение с использованием линейного односвязного списка.

Большое спасибо!
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2014, 15:03
Ответы с готовыми решениями:

Оставить без изменений последовательность, если она упорядочена по не убыванию или по не возрастанию
Ребят,я начинающая программистка) помогите решить задачу на С Даны действительные числа a1, …,...

Оставить без изменения последовательность, если она упорядочена (по невозрастанию или неубыванию)
Оставить без изменения последовательность а1,...,а30, если она упорядочена по невозрастанию или...

Даны действительные числа . Оставить без изменения последовательность, если она упорядочена по неубыванию, в противном
Даны действительные числа . Оставить без изменения последовательность, если она упорядочена по не...

Если последовательность отсортирована по возрастанию, оставить ее без изменения. Иначе получить иную последовательность
Дана последовательность действительных чисел X1,X2,X3,…,Xn (n&gt;2, заранее неизвестно). Если...

Если последовательность упорядочена по не убыванию, то оставить ее без изменения
Дано натуральное число n,действительные числа а1,...,аn (n&gt;2). если последовательность а1,...,аn...

18
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
26.02.2014, 18:51 2
Лучший ответ Сообщение было отмечено JosephMorgan как решение

Решение

C
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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct node_t {
    int value;
    struct node_t* next;
}   List;
 
//-----------------------------------------------------------------------------
void push(List** list, int value) {
    List* node = malloc(sizeof(List));
    node->value = value;
    node->next = *list;
    *list = node;
}
//-----------------------------------------------------------------------------
int pop(List** list) {
    List* node = *list;
    int value = node->value;
    *list = node->next;
    free(node);
 
    return value;
}
//-----------------------------------------------------------------------------
void print(FILE* f, const List* list) {
    if (list) {
        print(f, list->next);
        fprintf(f, "%d ", list->value);
    }
}
//-----------------------------------------------------------------------------
int isSort(const List* list) {
    const List* back;
    int isRight = 1;
 
    while (list && isRight) {
        back = list;
        if ((list = list->next)) {
            isRight = (list->value <= back->value);
        }
    }
 
    return isRight;
}
//-----------------------------------------------------------------------------
void reverse(List** list) {
    List* new = NULL;
    while (*list) {
        push(&new, pop(list));
    }
    *list = new;
}
//-----------------------------------------------------------------------------
 
int main() {
    FILE* f;
    List* list = NULL;
    int value;
 
    printf("input elemets (0 for exit): ");
 
    while ((scanf("%d", &value) == 1) && (value)) {
        push(&list, value);
    }
 
    if (!isSort(list)) {
        reverse(&list);
    }
 
    print(stdout, list);
 
    if ((f = fopen("file.txt", "w"))) {
        print(f, list);
        fclose(f);
    }
 
    return 0;
}
1
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
26.02.2014, 19:36  [ТС] 3
anmartex, большое спасибо! А могли бы Вы объяснить, что делает каждая подпрограмма?
0
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
27.02.2014, 05:22 4
Цитата Сообщение от JosephMorgan Посмотреть сообщение
А могли бы Вы объяснить, что делает каждая подпрограмма?
Так вроде имена функций говорят сами за себя.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Функция добавления элемента в список
void push(List** list, int value);
 
// Функция извлечения элемента из списка
int pop(List** list);
 
// Вывод элементов списка (в обратном порядке) в поток вывода
void print(FILE* f, const List* list);
 
// Проверка списка на упорядоченность
int isSort(const List* list);
 
// Реверс списка
void reverse(List** list);
0
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
04.03.2014, 06:23  [ТС] 5
anmartex, большое спасибо!

А теперь немного по подпрограммам:

C
1
2
3
4
typedef struct node_t {
    int value;
    struct node_t* next;
}   List;
Здесь мы объявляем нашу последовательность и список, в который она будет преобразовываться?

C
1
2
3
4
5
void push(List** list, int value) {
    List* node = malloc(sizeof(List));
    node->value = value;
    node->next = *list;
    *list = node;
Здесь мы разоминовываем *list и присваиваем ему новое значение?

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

Добавлено через 18 часов 28 минут
anmartex, правильно ли я все расписал, скажите пожалуйста?
0
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
04.03.2014, 08:45 6
C
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
#include <stdio.h>
#include <stdlib.h>
 
typedef struct node_t {
    int value;
    struct node_t* next;
}   List;
 
//-----------------------------------------------------------------------------
// Функция добавления элемента в список
// В качестве параметров передаётся адрес указателя списка и само значение
void push(List** list, int value) {
    // Выделяем память под новый узел
    List* node = malloc(sizeof(List));
    // Присваиваем узлу его значение
    node->value = value;
    // Следующим же узлом будет является нынешняя
    // вершина списка
    node->next = *list;
    // Новый узел становится вершиной списка
    *list = node;
}
//-----------------------------------------------------------------------------
// Функция извлечения элемента из списка
// В качестве параметра передаётся адрес указателя списка
int pop(List** list) {
    // Сохраняем указатель на вершину списка
    List* node = *list;
    // Сохраняем значение удаляемого узла
    int value = node->value;
    // Смещаем вершину списка на уровень ниже
    *list = node->next;
    // Удаляем узел
    free(node);
    // Возвращаем значение удалённого узла
    return value;
}
//-----------------------------------------------------------------------------
// Вывод элементов списка (в обратном порядке) в поток вывода
// В качестве аргументов передаются указатель на поток вывода и
// непосредственно сам список
void print(FILE* f, const List* list) {
    // Если элемент списка не равен NULL
    if (list) {
        // Рекурсивно вызываем себя, только в качестве второго
        // параметра передаётся следующий узел
        print(f, list->next);
        // Выводим значение узла
        fprintf(f, "%d ", list->value);
    }
}
//-----------------------------------------------------------------------------
// Проверка списка на упорядоченность
// В качестве параметра передаётся указатель на список
int isSort(const List* list) {
    const List* back;
    // По дефолту список упорядочен
    int isRight = 1;
 
    // Пока очередной элемент списка существует и является
    // упорядоченным выполняем следующее ...
    while (list && isRight) {
        // Сохраняем указатель на предыдущий узел
        back = list;
        // Берём следующий узел и если он существует то ...
        if ((list = list->next)) {
            // Проверяем на условие что следующий меньше либо равен
            // предыдущему 
            isRight = (list->value <= back->value);
        }
    }
 
    // Возвращаем рузультат проверки
    return isRight;
}
//-----------------------------------------------------------------------------
// Реверс списка
// В качестве аргумента принимаем адрес указателя списка
void reverse(List** list) {
    List* new = NULL;
    // Пока есть элементы в списке
    while (*list) {
        // Перекладываем элементы из старого списка в новый
        push(&new, pop(list));
    }
    // Сохраняем сформированный (новый) список
    *list = new;
}
//-----------------------------------------------------------------------------
 
int main() {
    FILE* f;
    List* list = NULL;
    int value;
 
    printf("input elemets (0 for exit): ");
 
    // Считываем значение из стандартного потока ввода
    // очередное число, до тех пор пока не встретится 0 или
    // будет введён иной символ
    while ((scanf("%d", &value) == 1) && (value)) {
        // Добавляем элемент в список
        push(&list, value);
    }
 
    // Проверяем получившийся список на упорядоченность
    if (!isSort(list)) {
        // В случае нарушения упорядоченности выполняем
        // реверс списка
        reverse(&list);
    }
 
    // Выводим данные на экран
    print(stdout, list);
 
    // Пытаемся открыть файл file.txt для записи
    // и если получается, то ...
    if ((f = fopen("file.txt", "w"))) {
        // Выводим данные в открытый файл
        print(f, list);
        // Закрываем файл
        fclose(f);
    }
 
    return 0;
}
1
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
05.03.2014, 06:49  [ТС] 7
anmartex, большое спасибо.
Например, после компиляции я ввожу 3 числа: 56, 71, 12. Программа выводит 12, 71, 56. Но как сделать так, чтобы это выводилось в файле? Я в папке программы создал файл file.txt, занес туда значения 56, 71, 12. Далее я закрыл файл, зашел в программу и вновь ввел значения. Я так понял, что результат вновь должен записаться в этот файл, но ничего не происходит. Подскажите пожалуйста, что я делаю не так?

Добавлено через 12 часов 45 минут
anmartex, так ли это? Большое спасибо!
0
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
05.03.2014, 06:49 8
Цитата Сообщение от JosephMorgan Посмотреть сообщение
Нужно записать ответ в файл.
А ниже пишите:
Цитата Сообщение от JosephMorgan Посмотреть сообщение
Я в папке программы создал файл file.txt, занес туда значения 56, 71, 12.
Вы определитесь. Программа должна считывать данные из файла или всё-таки записывать?

Цитата Сообщение от JosephMorgan Посмотреть сообщение
Подскажите пожалуйста, что я делаю не так?
Исходя из постановки задания, после запуска программы и ввода вами данных, программа выводит результат в консоль и в файл "file.txt"
0
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
05.03.2014, 17:50  [ТС] 9
anmartex, спасибо!
List -- это сама последовательность. list - измененная последовательность. value -- ??? isRight -- ?? push -- ??? isSort -- ???
Подскажите пожалуйста значения те переменных, после которых знаки вопроса и правильно ли описаны те, у которых есть описание?
0
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
06.03.2014, 09:22 10
Цитата Сообщение от JosephMorgan Посмотреть сообщение
List -- это сама последовательность. list - измененная последовательность. value -- ??? isRight -- ?? push -- ??? isSort -- ???
Подскажите пожалуйста значения те переменных, после которых знаки вопроса и правильно ли описаны те, у которых есть описание?
JosephMorgan, напомнило Бородино (М.Ю. Лермонтов):
...
Смешались в кучу кони, люди,
И залпы тысячи орудий
Слились в протяжный вой…
List - это тип данных. Собственно вот он:
C
1
2
3
4
typedef struct node_t {
    int value;
    struct node_t* next;
}   List;
list - это переменная, указатель типа List, указывает всегда на "верхний" элемент списка;
value - тоже переменная, тип int, нужна для считывания очередного числа со стандартного потока ввода (с консоли);
isRight - переменная, несёт в себе состояние о том, что список является сортированным;
push, isSort - это функции, описывал я их уже не раз. Читайте внимательнее комментарии.
C
1
2
3
4
5
// Функция добавления элемента в список
void push(List** list, int value);
 
// Проверка списка на упорядоченность
int isSort(const List* list);
0
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
10.03.2014, 17:44  [ТС] 11
anmartex, большое спасибо! А как сделать считывание из файла, а не с консоли?
0
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
10.03.2014, 18:27 12
C
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
int main() {
    FILE* f;
    List* list = NULL;
    int value;
 
    if ((f = fopen("source.txt", "r")) == NULL) {
        perror("source.txt");
        return 1;
    }
 
    // Считываем значение из стандартного потока ввода
    // очередное число, до тех пор пока не встретится 0 или
    // будет введён иной символ
    while ((fscanf(f, "%d", &value) == 1) && (value)) {
        // Добавляем элемент в список
        push(&list, value);
    }
    fclose(f);
 
    // Проверяем получившийся список на упорядоченность
    if (!isSort(list)) {
        // В случае нарушения упорядоченности выполняем
        // реверс списка
        reverse(&list);
    }
 
    // Выводим данные на экран
    print(stdout, list);
 
    // Пытаемся открыть файл file.txt для записи
    // и если получается, то ...
    if ((f = fopen("file.txt", "w"))) {
        // Выводим данные в открытый файл
        print(f, list);
        // Закрываем файл
        fclose(f);
    }
 
    return 0;
}
1
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
11.03.2014, 19:12  [ТС] 13
anmartex, так это и есть вся программа (последний Ваш ответ выше) или часть, которую нужно вставить в самом начале?
0
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
12.03.2014, 14:39 14
Это, если внимательно присмотреться, функция main. Остальное остаётся неизменным.
0
JosephMorgan
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 30
12.03.2014, 14:57  [ТС] 15
anmartex, спасибо. А если написать эту программу, используя линейный односвязный список без заглавного звена, ничего более (без стеков, деков, очередей и пр.) Вот как я сделал: первая подпрограмма - подпрограмма ввода:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
list in(FILE *a)
{ list *r, *t, float c;
fscanf(a, "%f", &c);
r -> el = c;
r -> next = NULL;
t = r;
 
while(fscanf(a, "%f", &c) != EOF
{ fscanf (a, "%f", &c);
t -> next = new list;
t = t -> next
t -> el = c;
t -> next = NULL; }
return r; }
Помогите пожалуйста с подпрограммой проверки на упорядоченность и "переворота" последовательности. Ответ, как и ввод, осуществляется через файл.

Спасибо!
0
kate300895
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 1
08.05.2014, 20:52 16
Помогите, при компиляции этой программы VS 2012 выдает ошибки:
(14)error C2440: инициализация: невозможно преобразовать "void *" в "List *"
Для преобразования "void*" к указателю на тип, не являющемуся "void", требуется явное приведение
(80)error C2059: синтаксическая ошибка: new
(84)error C2059: синтаксическая ошибка: ,
(87)error C2059: синтаксическая ошибка: ;
Как это исправить, чтобы программа работала?
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
08.05.2014, 23:33 17
kate300895, Не используйте этот исходный код. Там нет освобождения выделенной памяти помимо этого функция reverse содержит утечку памяти.
0
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
10.05.2014, 14:21 18
kate300895, так ведь написано же, что необходимо явное приведение типа.
C
1
List* node = (List*)malloc(sizeof(List));
Цитата Сообщение от castorsky Посмотреть сообщение
Там нет освобождения выделенной памяти
Она там по логике не нужна.

Цитата Сообщение от castorsky Посмотреть сообщение
функция reverse содержит утечку памяти
Перед тем как такое заявлять внимательно смотрите код. Никакой утечки там нет.
0
castorsky
1973 / 1076 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
10.05.2014, 20:20 19
anmartex, Да, я сразу не увидел где освобождается память. Приношу свои извинения.
1
10.05.2014, 20:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 20:20

Оставить без изменения последовательность, если она упорядочена
Даны целые числа а1...аn, где n - целое положительное число (n&lt;=100). Оставить без изменения...

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

Оставить без изменения последовательность а1 - а30, если она упорядочена по возрастанию или по убыванию
Даны действительные числа а1.....а30. Оставить без изменения последовательность а1.....а30, если...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru