Форум программистов, компьютерный форум CyberForum.ru

В списке целых чисел подсчитать количество переменных знаков. Вывести между какими элементами - C++

Войти
Регистрация
Восстановить пароль
 
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
09.10.2011, 18:40     В списке целых чисел подсчитать количество переменных знаков. Вывести между какими элементами #1
Вроде односвязный список организовал, но вдруг приспичило двусвязный сделать. Прошу подскажите с какой стороны зайти.
List.cpp
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/* 
 * File:   List.cpp
 * Author: iWord
 * 
 */
 
#include "List.h"
#include <locale>
#include <stdio.h>
#include <stdlib.h>
 
List::List() {
    setlocale(LC_ALL, "");
    printf("\033[44m \033[37m \033[1m Конструктор по умолчанию начал работу \033[m \033[m \033[m \n");
 
    list *tmp;
    tmp = new list;
 
    tmp -> info = 0;
    tmp -> next = NULL;
    start = tmp;
 
    printf("\033[44m \033[37m \033[1m Конструктор по умолчанию закончил работу \033[m \033[m \033[m \n");
}
 
List::List(int count, int method) {
 
    int item, item_1;
    char buffer[200];
 
    printf("\033[44m \033[37m \033[1m Конструктор с параметрами начал работу \033[m \033[m \033[m \n");
 
    list *tmp1, *tmp2;
    tmp1 = new list;
 
    tmp1 -> info = 0;
    tmp1 -> next = NULL;
    start = tmp1;
 
    time_t time_var;
    time_var = time(NULL);
    srandom(time(NULL));
 
    for (int i = 0; i < count; i++) {
        if (!method) {
            printf(" \033[36m \033[1m Введите элемент очереди \033[m \033[m \n");
            fgets(buffer, 120, stdin);
            item = atoi(buffer);
        } else {
            item = rand() % 101;
            item_1 = item;
            for (int i = 0; i < item_1; i++) {
                item = item * (-1);
            }
        }
        tmp1 = start;
        while (tmp1 -> next != NULL)
            tmp1 = tmp1 -> next;
        tmp2 = (list*) malloc(sizeof (list));
        tmp2 -> info = item;
        tmp2 -> next = NULL;
        tmp1 -> next = tmp2;       
        start -> info++;
    }
printf("\033[44m \033[37m \033[1m Конструктор с параметрами завершил работу \033[m \033[m \033[m \n");
}
 
List::~List() {
    printf("\033[44m \033[37m \033[1m Деструктор начал работу \033[m \033[m \033[m \n");
    
    while (!Empty()) {
        Delete(start -> info);
    }
        printf(" \033[31m \033[1m Память освобождена \033[m \033[m \n");
        printf("\033[44m \033[37m \033[1m Деструктор завершил работу \033[m \033[m \033[m \n");
}
 
int List::Empty(){
    if (start -> info) {
        return 0;
    }else{
        return 1;
    }
}
 
void List::Append(int item){
    list *tmp1,*tmp2;
    tmp1 = start;
    while (tmp1 -> next != NULL)
        tmp1 = tmp1 -> next;
    tmp2 = (list*)malloc(sizeof(list));
    tmp2 -> info = item;
    tmp2 -> next = NULL;
    tmp1 -> next = tmp2;
    start ->info++;
}
 
void List::Delete(int item){
    list *tmp1,*tmp2;
    tmp2 = start;
    for (int i = 1; i < item; i++)
      tmp2 = tmp2 -> next;
    tmp1 = tmp2 -> next;
    tmp2 -> next = tmp1 -> next;
    free(tmp1);
    start -> info--;
}
 
void List::Print(){
    list *tmp;
    if (!start -> info) {
        printf(" \033[36m \033[1m Очередь пуста \033[m \033[m \n");
    }else{
        tmp = start;
        tmp = tmp -> next;
        while (tmp != NULL) {
            printf("\033[36m \033[1m %d \033[m \033[m",tmp -> info);
            tmp = tmp -> next;
        }
    }
}
 
int List::Value(int number){
    list *tmp;
    tmp = start;
    for (int i = 0; i < number; i++)
        tmp = tmp -> next;
    return tmp -> info;
}
 
void List::Insert(int position,int item){
    list *tmp,*tmp1,*tmp2;
    tmp = addres(position - 1);
    tmp1 = tmp -> next;
    tmp2 = (list*)malloc(sizeof(list));
    tmp2 -> info = item;
    tmp -> next = tmp2;
    tmp2 -> next = tmp1;
    start -> info++;
}
List.h
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
/* 
 * File:   List.h
 * Author: iWord
 *
 */
 
#ifndef LIST_H
#define LIST_H
 
struct list{
    int info;
    struct list *next;
    struct list *prev;
};
 
class List {
protected:
    struct list *start;
    int buffer;
public:
    
    /**
     * @constructor     Конструктор по умолчанию
     */
    
    List();
    
    /**
     * @constructor     Конструктор с параметрами
     * @param count     Количество элементов
     * @param method    Метод заполнения
     */
    
    List(int count, int method);
    
    /**
     * @destructor      Деструктор
     */
    
    virtual ~List();
    
    /**
     * @method          Проверка на заполненность списка
     */
    
    int Empty();
    
    /**
     * @method          Добавление в конец списка
     */
    
    void Append(int item);
    
    /**
     * @method          Удаление элемента
     */
    
    void Delete(int item);
    
    /**
     * @method          Печать списка
     */
    
    void Print();
    
    /**
     * @method          Возвращение значения элемента списка
     * @return          Значение элемента
     */
    
    int Value(int number);
    
    /**
     * @method          Вставка элемента списка
     */
    
    void Insert(int position,int item);
    
    /**
     * 
     * @method Печать отрезка  
     */
    
    void Negative_pos();
    
    list *addres(int number){
        list *tmp;
        tmp = start;
        for (int i = 0; i < number; i++)
            tmp = tmp -> next;
        return tmp;
    };
 
};
 
#endif  /* LIST_H */
main.cpp
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/* 
 * File:   main.cpp
 * Author: iWord
 *
 */
 
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <locale>
#include "List.h"
#include <malloc.h>
#include <time.h>
#include <string.h>
 
int main(int argc, char** argv) {
    
    setlocale(LC_ALL,"");
    
    int count,method,i,methodx;
    int params[10];
    
    char buffer[500];
    char temp[500];
    char text[10][500];
    char *slovar[] = {"count","method","zadanie","author"};
    
    FILE *config,*log;
    time_t times;
    
    if((log = fopen("lab1.log","a")) == NULL){
        printf("\033[31m Ошибка открытия файла логирования!\033[m \n");
        printf("\033[1m Нажмите Enter. \033[m \n");
        getchar();
        
        if((log = fopen("lab1.log","wt")) == NULL){
            printf("\033[31m Ошибка открытия файла логирования!\033[m \n");
            printf("\033[1m Нажмите Enter. \033[m");
            getchar();
            exit(0);
        }else{
            printf("\033[1m Файл протокола открыт успешно. \033[m \n");
        }
    }else{
         printf("\033[1m Файл протокола открыт на добавление данных. \033[m \n");
    }
    
    times = time(NULL);
    fprintf(log,"\n%s : запуск программы \n",ctime(&times));
    
    if((config=fopen("configure.config","r")) == NULL){
        times = time(NULL);
        fprintf(log,"%s : ошибка открытия конфигурационного файла! \n",ctime(&times));
        printf("\033[31m \033[1m Ошибка открытия конфигурационного файла! \033[m \033[m \n");
        getchar();
        exit(0);
    }
    
fgets(temp,5,config);
        if (strlen(temp)==5)
            {
 
            if (strstr(temp,"Laba1")==0) 
            {
                fprintf(log,"Не верный конфигурационный файл!\n");
                puts("Не верный конфигурационный файл!");
                printf(" ERROR = %s\n", temp);
                getchar();
        }
            }
 printf("Конфигурационный файл верен.\n");
 
 rewind(config);
 fgets(buffer,200,config);
 i = 0;
 while (!feof(config)){
     fgets(buffer,300,config);
     if(buffer[0]!='#'){
         for (int i = 0; i < 4; i++) {
             if(strstr(buffer,slovar[i]) != NULL){
                 strcpy(text[i],strchr(buffer,'='));
             }
            }
     }
    }
 
 for (int i = 1; i < strlen(text[0]); i++) 
     buffer[i-1] = text[0][i];
 params[1] = atoi(buffer);
 
 for (int i = 1; i < strlen(text[1]); i++) 
     buffer[i-1] = text[1][i];
 params[2] = atoi(buffer);
 
 for(i=1;i<=strlen(text[2]);i++)
     buffer[i-1]=text[2][i];
        
 for (i=0;i<=strlen(buffer);i++) 
        text[2][i]=buffer[i];
 
  for(i=1;i<=strlen(text[3]);i++)
     buffer[i-1]=text[3][i];
        
 for (i=0;i<=strlen(buffer);i++) 
        text[3][i]=buffer[i];
 
 count = params[1];
 method = params[2];
 
 printf("\n \033[36m \033[1m Лабораторная работа №1 \n \033[m");
 printf("\033[1mЗадание: %s \033[m ",text[2]);
 fprintf(log,"%s :%s",ctime(&times),text[2]);
 printf("\033[1mВыполнил: %s \033[m ",text[3]);
 fprintf(log,"%s :выполнил %s",ctime(&times),text[3]);
 printf("\n\033[36m\033[1m____________________________________________________ \n\033[m");
 printf("Количество элементов в списке: %d",count);
 fprintf(log,"%s :количество элементов в списке - %d",ctime(&times),count);
 
 if(method != 0){
     puts("\nВыбран автоматический режим.");
     fprintf(log,"%s :выбран автоматический режим.",ctime(&times));
     methodx = 1;
 }else{
     puts("\nВыбран ручной режим.");
     fprintf(log,"%s :выбран ручной режим.",ctime(&times));
     methodx = 0;
 }
 
 if(count <0 || count > 20){
     printf("\033[31m\033[1mВы указали слишком большое количество элементов очереди: %d.\nИнтервал значений от 0 < x < 20. По умолчанию будет устаовлено значение 5.\033[m",count);
     fprintf(log,"%s :Вы указали слишком большое количество элементов очереди: %d.\nИнтервал значений от 0 < x < 20. По умолчанию будет устаовлено значение 5",ctime(&times),count);
 }
 
 List mylist(count,method);
 mylist.Insert(2,10);
 mylist.Print();
 
 
 
 
    
 
 
 
    printf("\n____________________________________________________ \n \033[1m Работа программы успешно завершена \033[m \n");
    getchar();
    return 0;
}
configure.config
C++
1
2
3
4
5
6
7
8
9
Laba1
#Количество элементов очереди n>0&n<20
count=10
#Способ заполнения 0-ручное заполнение, другое значение - автозаполнение
method=1
#Формулировка задания
zadanie=В списке целых чисел подсчитать кол-во переменных знаков. Вывести между какими элементами
#Автор
author=Мухамедгалиев Ринат ИВТ-21
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 18:40     В списке целых чисел подсчитать количество переменных знаков. Вывести между какими элементами
Посмотрите здесь:

C++ Среди N введённых целых чисел найти количество соседей разных знаков.
Подсчитать количество целых чисел среди чисел a, b, c C++
В одномерном массиве целых чисел содержится два нулевых значения. Подсчитать сумму чисел, заключённых между двумя нулями. C++
Подсчитать количество перемен знака в последовательности целых чисел C++
Массив из 20 целых чисел. Подсчитать количество четных чисел C++
Подсчитать количество целых среди чисел a.b.c C++
С++: подсчитать количество знаков и вывести самое большое значение C++
Для вводимой последовательности целых чисел найти максимальную разность между соседними элементами C++
Ввести массив целых чисел. Вставить число 0 между элементами, имеющими разный знак C++
C++ Среди N введённых целых чисел найти количество соседей разных знаков
Среди N введённых целых чисел найти количество соседей разных знаков C++
Определить количество чисел, стоящих между максимальным и минимальным элементами массива C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
09.10.2011, 20:33     В списке целых чисел подсчитать количество переменных знаков. Вывести между какими элементами #2
Something like this.
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
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
#include <iostream>
#include <ctime>
#include <cstdlib>
 
// базовый класс элемента связного списка
// так же содержит некоторую логику
struct node_base_ {
  node_base_ *next; // указатель на следующую запись
  node_base_ *prev; // указатель на предыдущую запись
  // при создании без параметров, поля указывают сами на себя
  node_base_() : next(this), prev(this) {}
  // при задании параметров, реализует "вставку" элемента в список
  node_base_(node_base_ *next_, node_base_ *prev_)
    : next(next_), prev(prev_) {
    prev_->next = this;
    next_->prev = this;
  }
  // при удалении элемента удаляет разрыв в списке
  virtual ~node_base_() {
    prev->next = next;
    next->prev = prev;
  }
};
 
// шаблонная структура элемента связного списка
template <class Tp_>
struct node_: public node_base_ {
  Tp_ value;  // содержимое элемента
  // конструктор, вызывает базовый
  node_() : node_base_() {}
  // конструктор с параметрами, вызывает базовый
  node_(node_base_ *next_, node_base_ *prev_, const Tp_ &value_)
    : node_base_(next_, prev_), value(value_) {}
};
 
// шаблонный класс итератора двусвязного списка
template <class ValueType,
          class Pointer = ValueType*, class Reference = ValueType&>
class iterator_base_ {
 public:
  typedef ValueType  value_type;
  typedef Pointer    pointer;
  typedef Reference  reference;
  typedef node_base_ node_base;
  typedef node_<value_type> node;
  iterator_base_() : data_(0) {}
  iterator_base_(node_base *data) : data_(data) {}
  // приведение к типу node для реализации вставки элемента 
  // (допущение для упрощения)
  operator node*() { return (node*)data_; }
  iterator_base_ &operator++() {
    data_ = data_->next;
    return *this;
  }
  iterator_base_ operator++(int) {
    iterator_base_ result(data_);
    data_ = data_->next;
    return result;
  }
  iterator_base_ &operator--() {
    data_ = data_->prev;
    return *this;
  }
  iterator_base_ operator--(int) {
    iterator_base_ result(data_);
    data_ = data_->prev;
    return result;
  }
  iterator_base_ operator-(int count) {
    iterator_base_ result(data_);
    while (count--) --result;
    return result;
  }
  iterator_base_ operator+(int count) {
    iterator_base_ result(data_);
    while (count--) ++result;
    return result;
  }
  bool operator==(const iterator_base_ &other) const {
    return data_ == other.data_;
  }
  bool operator!=(const iterator_base_ &other) const {
    return data_ != other.data_;
  }
  value_type &operator*() { return   ((node*)data_)->value; }
  value_type *operator->() { return &((node*)data_)->value; }
 private:
  node_base *data_;
};
 
template <class ValueType>
class list {
 public:
  typedef ValueType value_type;
  typedef ValueType& reference;
  typedef node_<value_type> node;
  typedef node_base_ node_base;
  typedef iterator_base_<value_type> iterator;
  list() : data_(new node_base()) {}
  ~list() {
    clear();
    delete data_;
  }
  int size() const {
    int result = 0;
    for (iterator i = begin(); i != end(); ++i)
      ++result;
    return result;
  }
  bool empty() {
    return (data_->next == data_ && data_->prev == data_);
  }
  void clear() {
    while (!empty()) delete data_->next;
  }
  reference back() { return *(end() - 1); }
  reference front() { return *begin(); }
  iterator begin() const { return data_->next; }
  iterator end() const { return data_; }
  iterator insert(iterator before, const value_type &value) {
    return new node((node_base_*)before, ((node_base_*)before)->prev, value);
  }
  iterator find_first(const value_type &what) {
    iterator result = begin();
    while (result != end() && *result != what)
      ++result;
    return result;
  }
  iterator erase(iterator what) {
    iterator result = what + 1;
    delete (node*)what;
    return result;
  }
  // erases elements in range [begin, end)
  iterator erase(iterator begin, iterator end) {
    while (begin != end)
      begin = erase(begin);
    return begin;
  }
  iterator push_back(const value_type &value) {
    return insert(end(), value);
    //return new node(data_, data_->prev, value);
  }
 private:
  node_base *data_; // элемент, находящийся "перед" списком и сразу
                    // "за" списком
};
 
template <class ValueType>
std::ostream &operator<<(std::ostream &stream,
  const list<ValueType> &alist) {
  for (typename list<ValueType>::iterator i = alist.begin();
    i != alist.end(); ++i)
    stream << *i << " ";
  return stream;
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  list<int> alist;
  for (int i = 0; i < 25; ++i)
    alist.push_back(rand() % 11 - 5);
  std::cout << alist << std::endl;
  
  list<int>::iterator first = alist.begin();
  list<int>::iterator second = first + 1;
  int signSwitches = 0;
  while (second != alist.end()) {
    if (*first * *second < 0)
      ++signSwitches;
    ++first;
    ++second;
  }
  std::cout << "Sign switched " << signSwitches << " time"
    << ((signSwitches != 1) ? "s" : "" ) << "." << std::endl;
}
iWord
 Аватар для iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
09.10.2011, 23:55  [ТС]     В списке целых чисел подсчитать количество переменных знаков. Вывести между какими элементами #3
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
#include <stdio.h>
 
class DoubleLinkedList {
  typedef int ElementType;
  class ListNode {
   public:
    ListNode(int i) : item(i), prev(NULL), next(NULL) {}
    ListNode* prev;
    ListNode* next;
    ElementType item;
  };
 
  ListNode* curnode;
 
  ListNode* GetLast() {
    ListNode* lastNode = curnode;
 
    while (lastNode->next != NULL) {
      lastNode = lastNode->next;
    }
 
    return lastNode;
  }
 
 public:
  DoubleLinkedList() : curnode(NULL) {}
 
  void Add(int num) {
    ListNode* newnode = new ListNode(num);
 
    if (!curnode) { curnode = newnode; return; }
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
  }
 
  bool HasNext() { return curnode->next; }
 
  int Next() {
    int value = curnode->item;
    if (curnode->next) curnode = curnode->next;
    return value;
  }
  
 bool HasPrev() { return curnode->prev; }
 
  int Prev() {
    int value = curnode->item;
    if (curnode->prev) curnode = curnode->prev;
    return value;
  }
 
  void Reset() {
    while (curnode->prev != NULL) {
      curnode = curnode->prev;
    }
  }
};
 
int main(int argc, char** argv) {
  DoubleLinkedList list;
  list.Add(1);
  list.Add(2);
  list.Add(3);
  list.Add(0); // end element
 
  while (true) {
    printf("%d\n", list.Next());
    if (!list.HasNext()) break;
  }
 
  list.Reset();
 
  while (true) {
    printf("%d\n", list.Prev());
    if (!list.HasPrev()) break;
  }
}
Выводит постоянно одно , не знаю как брать определенный элемент и выводить его предыдущий и последующий элемент.
Yandex
Объявления
09.10.2011, 23:55     В списке целых чисел подсчитать количество переменных знаков. Вывести между какими элементами
Ответ Создать тему
Опции темы

Текущее время: 03:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru