Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2009, 22:41   #1
maxlav
 
Регистрация: 03.05.2009
Сообщений: 6
По умолчанию С++. Сравнение строк

Дана задача: для двух заданных строк символов вывести без повторений набор символов-цифр, не вошедших в обе последовательности, т.е. строка состоит из букв и цифр, необходимо вывести только цифры, которые встретились в двух строках.
Сразу же нарисовались вопросы:
1. Как организовать сравнение только чисел в строках?
2. Как, затем, "записать" эти числа?

Язык программирования C.
maxlav вне форума Ответить с цитированием
Старый 22.06.2009, 22:56   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от maxlav
1. Как организовать сравнение только чисел в строках?
Символы-цифры имеют коды в диапазоне 48-57. Поэтому просто нужно проверять:
Код:
if(str[i]>=48 && str[i]<=57) ...действия, если символ - цифра
Для каждого символа-цифры первой строки проходите по второй строке и ищете такой же. Если нашли, то переходим к следующему символу. Если нет, то проходим по уже сформированной строке (которую нужно сформировать) и ищем этот символ в ней. Если там его нет, добавляем его.

После этого сортируем конечную строку и выводим.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.06.2009, 00:00   #3
maxlav
 
Регистрация: 03.05.2009
Сообщений: 6
По умолчанию

Б-Б-Б-бред получается, ладно, утро вечера мудренее - завтра начну сначала.
maxlav вне форума Ответить с цитированием
Старый 23.06.2009, 00:29   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вообще, на самом деле, не очень ясное условие.
Цитата:
для двух заданных строк символов вывести без повторений набор символов-цифр, не вошедших в обе последовательности
я так понял, что нужно вывести все цифры, которые не встречаются в заданных строках.

Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
char str1[100],str2[100];
int len=0;
int i,j,flag;

printf("string 1: \n");
gets(str1);
printf("string 2: \n");
gets(str2);

for(i=48; i<=57; i++)
 {
  flag = 1;
  for(j=0; j<strlen(str1); j++)
   if(str1[j]==i)
    { flag = 0; break; }
  for(j=0; j<strlen(str2); j++)
   if(str2[j]==i)
    { flag = 0; break; }
  if(flag==1) putc((char)i,stdout);
 }

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.06.2009, 20:52   #5
maxlav
 
Регистрация: 03.05.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Sazary
я так понял, что нужно вывести все цифры, которые не встречаются в заданных строках.
Не совсем, необходимо вывести цифры, которые имеются только в одной строке, и отсутствуют в другой, т.е.:

Пример:
Строка 1: А g D y u d s 1 6 4 9
Строка 2: h u t rs l s 2 9 6 9 7
Цифры, не вошедшие в обе последовательности: 1 4 2 7

Последний раз редактировалось maxlav; 23.06.2009 в 21:16.
maxlav вне форума Ответить с цитированием
Старый 23.06.2009, 22:00   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Тогда нужно делать так, как я описал во втором посте.
В следующий раз пишите сами.
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

void fun(char *str1, char *str2, char *res, int& len)
{
 int i,j;
 for(i=0; i<strlen(str1); i++)
 if(str1[i]>=48 && str1[i]<=57)
  {
   int flag = 1;
   for(j=0; j<strlen(str2); j++)
    if(str1[i]==str2[j])
     { flag = 0;
       break;
      }
   if(flag==0) continue;
   flag = 1;
   for(j=0; j<len; j++)
    if(str1[i]==res[j])
     {
      flag = 0;
      break;
     }
   if(flag==0) continue;
   res[len++] = str1[i];
  }
}

void sort(char *str, int start, int end)
{
int i=start, j=end, d = str[(start+end)/2];
do
 {
  while(str[i]<d) ++i;
  while(str[j]>d) --j;
  if(i<=j)
   {
    if(i<j)
     { char tmp=str[i]; str[i]=str[j]; str[j] = tmp; }
    ++i;
    --j;
   }

 } while(i<=j);
 if(i<end) sort(str,i,end);
 if(j>start) sort(str,start,j);
}

int main()
{
char str1[100],str2[100],res[100];
int len=0;
int i,j,flag;

printf("string 1: \n");
gets(str1);
printf("string 2: \n");
gets(str2);
strcpy(res,"");

fun(str1,str2,res,len);
fun(str2,str1,res,len);
res[len] = 0;
sort(res,0,len-1);

printf("result string: \n%s\n",res);

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 24.06.2009, 13:03   #7
maxlav
 
Регистрация: 03.05.2009
Сообщений: 6
По умолчанию

Sazary, я 90% из этого кода впервые увидел (C изучаю на базовом уровне), но кое-что разобрать все же смог, вот что получилось:
Код:
#include <stdio.h>
#include <string.h>
#define L 100
    int main (void){
    char s1[L], s2[L], res[L];
    int a, i, j, flag, len=0;
    puts("string 1:");
    gets(s1);
    puts("string 2:");
    gets(s2);
    for(i=0; i<strlen(s1); i++)
	if(s1[i]>=48 && s1[i]<=57){
	    flag=1;
	    for(j=0; j<strlen(s2); j++)
		if(s1[i]==s2[j]){
		    flag=0; break;
		}
		if (flag==0) continue;
		    flag=1;
		    for(j=0; j<len; j++)
			if(s1[i]==res[j]){
			    flag=0; break;
			}
			if(flag==0) continue;
			    res[len++]=s1[i];
	}
	for(j=0; j<strlen(s2); j++)
	if(s2[j]>=48 && s2[j]<=57){
	    flag=1;
	    for(i=0; i<strlen(s1); i++)
		if(s2[j]==s1[i]){
		    flag=0; break;
		}
		if (flag==0) continue;
		    flag=1;
		    for(i=0; i<len; i++)
			if(s2[j]==res[i]){
			    flag=0; break;
			}
			if(flag==0) continue;
			    res[len++]=s2[j];
	}
    printf("result string: \n%s\n", res);	    
    return 0;
}
Работает, но не совсем корректно, сказываются мои скромные познания.
maxlav вне форума Ответить с цитированием
Старый 24.06.2009, 18:36   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

maxlav, а код, который я написал, вас не устраивает?
Цитата:
я 90% из этого кода впервые увидел (C изучаю на базовом уровне)
Очень интересно. А что вам там незнакомо?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 25.06.2009, 04:33   #9
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Символы-цифры имеют коды в диапазоне 48-57. Поэтому просто нужно проверять:
Код:
if(str[i]>=48 && str[i]<=57) ...действия, если символ - цифра
А почему бы не использовать isdigit() из ctype.h?(хотя это несущественно)

Кстати, вот что написал я:
Код:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char str1[100], str2[100], d1[10], d2[10];
int i;
int main(){
   gets(str1);
   gets(str2);
   for(i = 0; i < strlen(str1); i++)
	  if(isdigit(str1[i])) d1[str1[i] - '0'] = 1;
   for(i = 0; i < strlen(str2); i++)
	  if(isdigit(str2[i])) d2[str2[i] - '0'] = 1;
   for (i = 0; i < 10; i++)
	  if(d1[i] ^ d2[i]) printf("%d ", i);
   return 0;
}

Последний раз редактировалось megachuhancer; 25.06.2009 в 04:54.
megachuhancer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк, ввод пароля (assembler) You_must_help Помощь студентам 7 19.04.2009 23:53
Сравнение строк Elm0 Паскаль, Turbo Pascal, PascalABC.NET 2 02.06.2008 09:31
нужна помощь, сравнение строк в Си 3.1 feranic Помощь студентам 5 24.04.2008 17:57
Excel max 256 строк VS user надо 300 строк Exo Microsoft Office Excel 3 10.01.2008 17:14
Сравнение строк HOMER Общие вопросы Delphi 7 04.01.2008 05:53