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

Другой алгоритм(более простой) - C++

Восстановить пароль Регистрация
 
Дмитрий Але
0 / 0 / 0
Регистрация: 16.01.2011
Сообщений: 14
02.02.2011, 11:09     Другой алгоритм(более простой) #1
Призываю к помощи истинных знатоков для решения более простым способом(как я понял без массива и с помощью подпрограмм) данных задач:

1.Дан текст произвольной длины, оканчивающийся точкой с запятой. Подсчитать количество цифр в тексте.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream.h>
#include <string.h>
 
int main(){
int chislo=0;                                             //считает количество цифр
int strl;                                                    //содержит длину строки
char stroka[512];                                      //хранит введенную строку
cin.getline(stroka,sizeof(stroka),' ;');           //сохраняет введенную строку в переменную strl
strl=strlen(stroka);                                   //определяем длину строки
for (int i=0;i<strl;i++){                             //запускаем цикл и пробегаем каждый символ строки
switch(stroka[i]){                                     //если символ строки совпадает с одной из цифр, то
case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8 ':case'9': chislo++;break;    //увеличиваем chislo на единицу
default:break;                                         //если не совпало - увеличиваем i на единицу и переходим к след символу в строке
}
}                                                          //и так до последнего символа
 
cout<<"schislo= "<<chislo;                     //выводим кол-во цифр в строке
return 0;                                               //конец программы
}


2. Даны две строки длиной до 80 символов.
а) Определить, в какой строке больше цифр: в первой или во второй (вывести соответствующее сообщение).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* proga4 */
#include <iostream.h>
 
int main(){
char str1[80]="",str2[80]="";  // хранит введеные строки
int ch1=0,ch2=0;
cin.getline(str1,80,'\n');   // сохраняет введеные строки в переменную str1
cin.getline(str2,80,'\n');  );   // сохраняет введеные строки в переменную str2
for (int i=0;i<80;i++){       // запускает цикл и пробегает каждый символ строки
  switch(str1[i]){              //если  совпадает с условием,то
   case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':ch1++;break;                         //увеличиваем число на единицу
   default:break;             //переходим на другой символ
 }
}
for (int i=0;i<80;i++){
 switch(str2[i]){
   case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':ch2++;break;
   default:break;
 }
}
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
02.02.2011, 11:17     Другой алгоритм(более простой) #2
Пожалуй, единственное упрощение — это замена кейзов на функцию "isdigit".
Дмитрий Але
0 / 0 / 0
Регистрация: 16.01.2011
Сообщений: 14
02.02.2011, 11:46  [ТС]     Другой алгоритм(более простой) #3
А не обращая внимания на уже написанное можно как-то без массивов заново все сделать?
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
02.02.2011, 12:03     Другой алгоритм(более простой) #4
Цитата Сообщение от Дмитрий Але Посмотреть сообщение
А не обращая внимания на уже написанное можно как-то без массивов заново все сделать?
Через указатели: ставите указатель на начало строки и просматриваете
C++
1
while (указатель != ";")
Дмитрий Але
0 / 0 / 0
Регистрация: 16.01.2011
Сообщений: 14
02.02.2011, 12:19  [ТС]     Другой алгоритм(более простой) #5
Я бы с радостью сам сделал,но не способен на это предыдущее решение не мое...препод сказал что все сложно,можно было проще без массивов...поэтому я решил обратиться к спецам за помощью....
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
02.02.2011, 12:20     Другой алгоритм(более простой) #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
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
 
const int SIZE =80;
 
int form (char*);
 
void main()
{
    char buf[SIZE];
 
    cout<<"Vvedite stroky: ";
    cin.getline(buf, SIZE);
    int d= form (buf);
 
    cout<<"Rezultat: "<<d;
    cout<<endl<<endl;
}
int form (char *a)
{   
    char *first=a;
    int ch1=0;
    while (*first !=';')
    {
        switch(*first)
        { //если совпадает с условием,то
            case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9': ch1++;break; //увеличиваем число на единицу
            default:break; //переходим на другой символ
        }
        first++;
    }
    return ch1;
}
Дмитрий Але
0 / 0 / 0
Регистрация: 16.01.2011
Сообщений: 14
02.02.2011, 12:27  [ТС]     Другой алгоритм(более простой) #7
а как то вот так можно решить?----препод объсняла
надо if (str[i]>="0" && str[i]<="9") и т.д. как то так она сказала вторую задачу решить......
Mogul-kan
23 / 23 / 2
Регистрация: 24.04.2010
Сообщений: 220
02.02.2011, 12:28     Другой алгоритм(более простой) #8
NNN777 я посмотрел ваш код и у меня родился вопрос. вот вы передали функции
C
1
int form (char *a)
указатель на массив buf(я так понял в данном случае *а- это указатель на нулевой элемент массива buf ). Но потом зачем вы сделали во это?
C
1
char *first=a;
Дмитрий Але
0 / 0 / 0
Регистрация: 16.01.2011
Сообщений: 14
02.02.2011, 12:30  [ТС]     Другой алгоритм(более простой) #9
без case-ов ребят надо.............
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.02.2011, 12:30     Другой алгоритм(более простой) #10
Цитата Сообщение от Дмитрий Але Посмотреть сообщение
1.Дан текст произвольной длины, оканчивающийся точкой с запятой. Подсчитать количество цифр в тексте.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#inclued <iostrem.h>
int main()
{ 
 char *p;
 int count;
 char s[512]; //хранит введенную строку
 cin.getline(stroka,sizeof(s),' ;'); //сохраняет введенную строку в переменную strl
 for (p=s; *p!=0; ++p)
 {
  if ((*p>='0')&&(*p<='9'))
  {
   ++count;
  }
 }
 cout<<count;
 return 0;
}
Wanee
52 / 52 / 13
Регистрация: 02.02.2011
Сообщений: 428
02.02.2011, 12:32     Другой алгоритм(более простой) #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <fstream>
using namespace std;
 
void main()
{
    ofstream g("output.txt");
    ifstream f("input.txt");
 
    int x = 0;
    char c;
 
    do
    {
        f >> c;
        if(c > 47 && c < 58)
            x++;
    }
    while(c != 59);
 
    g << x;
}
Так будет намного проще. Считываем по символу и проверяем принадлежность символа к цифре. Как известно по стандартной таблице ASC|| цифра 0 имеет код 48. Сразу после неё идет цифра 1, которая имеет код 49 и т.д. Последняя цифра 9 имеет код 57. А если встретится символ ; который имеет код 59 то цикл прекращает работу, а результат выводится в выходной файл.
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
02.02.2011, 12:33     Другой алгоритм(более простой) #12
Цитата Сообщение от Mogul-kan Посмотреть сообщение
NNN777 Но потом зачем вы сделали во это?
C
1
char *first=a;
Ни зачем, можно это убрать и работать с указателем *a. посто этот код подвернулся из уже написанного ранее, и немного пришлось изменить его под эту задачу...
Mogul-kan
23 / 23 / 2
Регистрация: 24.04.2010
Сообщений: 220
02.02.2011, 12:52     Другой алгоритм(более простой) #13
не... мне по сути интерестно узнать какое значение тогда принимает указатель(чему он становится равным в данном случае, переменная first превращается в массив идентичный массиву buf?) *first=a;
и поясните пожалуста почему в конце вы делаете вот это
C
1
first++
-увеличиваете адрес на еденичку?
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
02.02.2011, 13:02     Другой алгоритм(более простой) #14
first не превращается в массив идентичный массиву buf, он принимает значение из а (адрес), а вот а, в свою очередь, указывает на массив buf.
first++ да, увеличиваете адрес на один (переходит к следующему элементу массива)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2011, 13:06     Другой алгоритм(более простой)
Еще ссылки по теме:

Все элементы вектора, которые встречаются более одного раза, переписать в другой вектор C++
Можно ли написать более оптимальный или простой код, используя цикл for? C++

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

Или воспользуйтесь поиском по форуму:
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
02.02.2011, 13:06     Другой алгоритм(более простой) #15
Дмитрий Але, без массивов — читать символы по одному. А как без кейзов — я уже объяснил выше.
Yandex
Объявления
02.02.2011, 13:06     Другой алгоритм(более простой)
Ответ Создать тему
Опции темы

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