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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2012, 21:12   #1
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию Проблема с написанием программы. Си.

Код:
#include "stdafx.h"
#include <stdio.h>

int any(char s1[],char s2[]);

int any(char s1[],char s2[])
{
	int k=1,i=0,j=0,p;
	while ((k>0) && (s1[i]!='\0'))
	{
		while ((s2[j]!='\0') && (k>0))
		{
			if (s1[i]==s2[j])
			{
				k=0;
			}
		}
		++i;
	}
	if (k==0)
		return (i-1);
	else
		return -1;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char s1[1000],s2[1000],c;
	int i=0,j=0;
	while ((c=getchar())!='\n')
		s1[i++]=c;
	s1[i]='\0';
	while ((c=getchar())!='\n')
		s2[j++]=c;
	s2[j]='\0';
	printf("%d\n",any(s1,s2));
	getchar();
	return 0;
}
Только начал учить си и столкнулся с небольшой проблемой.
Задача заключается в следующем:
Нужно вывести позицию в строке s1, элемент которой впервые совпадает с любым элементом строки s2. Если такой позиции нет, то вывести -1.

Например: abcdefgh
bsufew
Ответ: 2
Мой код впринципе компилируется нормально, но ничего не выводит.
То есть, данные вводятся, а результата нет.
Прошу помочь с избавлением от этой неприятности и если нужно переписать код на правильный лад. Заранее спасибо.
Chelovekpredel вне форума Ответить с цитированием
Старый 09.06.2012, 21:37   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Упростим?:
Код:
	char *s="abcdefgh";
	char *d="sufew";
	int i=0;bool b=false;
	for(;!b && s[i];i++)for(int k=0;!b && d[k];k++)b=s[i]==d[k];
	i=(b)?i:-1;
	printf("%d",i);getchar();
Ась?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2012, 22:03   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
for(;!b && s[i];i++)for(int k=0;!b && d[k];k++)b=s[i]==d[k];
Какая жуткая конструкция...

По-моему, вот так будет чуть яснее:
Код:
#include <stdio.h>

int main()
{
	char* str1 = "Hello";
	char* str2 = "Wild";
	int   pos = -1;
	int   i = 0;

	while(*str1 && *str2)  //Проверка на конец строки
	{
		if(*str1++ == *str2++) //Проверка на идентичность + автоматическое итерирование
		{
			pos = i + 1;
			break;
		}
		i++;
	}

	printf("%d",pos);
	return 0;
}
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 09.06.2012 в 22:07.
MooNDeaR вне форума Ответить с цитированием
Старый 09.06.2012, 22:33   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Какая жуткая конструкция...
Зато работает
Цитата:
По-моему, вот так будет чуть яснее:
Автору не это нужно. Ему подавай аналог регулярки - найти первое вхождение любого символа из списка (списком является вторая строка)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2012, 23:00   #5
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Ему подавай аналог регулярки - найти первое вхождение любого символа из списка (списком является вторая строка)
Да действительно, что-то криво задание читаю.

Вообще ваша конструкция правильная и даже хорошо работающая. Только вот, по-моему, уж очень вульгарно двойной цикл одной строкой писать.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 09.06.2012, 23:03   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

to Chelovekpredel

1) При создании проекта ставьте галочку "Пустой проект"

2) Реализация функции после main. Перед main прототип.

3) getchar() не нужен. При запуске нажимайте Ctrl+F5 (или тоже самое - "Отладка" -> "Запуск без отладки"). Либо
ставьте точку останова.

4) В Меню: "Проект" -> "Свойства" -> слева "Общие" -> "Набор знаков" -> выбрать "Использовать многобайтовую кодировку"

5) Главный файл называем (для с программ) main.c (так будет запускаться сишный компилятор)

6) Константы через define (или const если компилятор поддерживает)

7) Ваш код ошибочный. Программа попадает в бесконечный цикл (вложенный while). Вы всего-то
забыли инкрементировать j.

Код:
    while ((k>0) && (s1[i]!='\0'))
    {
        while ((s2[j]!='\0') && (k>0))
        {
            if (s1[i]==s2[j])
            {
                k=0;
            }
            j++;
        }
        ++i;
    }

Последний раз редактировалось 8Observer8; 09.06.2012 в 23:05.
8Observer8 вне форума Ответить с цитированием
Старый 10.06.2012, 00:03   #7
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию

Спасибо огромное. Всего-то забыл инкрементировать)
Chelovekpredel вне форума Ответить с цитированием
Старый 10.06.2012, 00:08   #8
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию

Хотя нет. Теперь всегда -1 выводит.
Код:
// номер позиции.строки.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <stdio.h>

int any(char s1[],char s2[]);

int any(char s1[],char s2[])
{
	int k=1,i=0,j=0,p;
	while ((k>0) && (s1[i]!='\0'))
	{
		while ((s2[j]!='\0') && (k>0))
		{
			if (s1[i]==s2[j])
			{
				k=0;
			}
			++j;
		}
		++i;
	}
	if (k==0)
		return (i-1);
	else
		return -1;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char s1[1000],s2[1000],c;
	int i=0,j=0;
	while ((c=getchar())!='\n')
		s1[i++]=c;
	s1[i]='\0';
	while ((c=getchar())!='\n')
		s2[j++]=c;
	s2[j]='\0';
	printf("%d\n",any(s1,s2));
	getchar();
	return 0;
}
Chelovekpredel вне форума Ответить с цитированием
Старый 10.06.2012, 09:10   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Цитата:
Сообщение от Chelovekpredel Посмотреть сообщение
Хотя нет. Теперь всегда -1 выводит.
Я вчера торопился и не заметил. А вообще говоря и вам минус, так как вы не умеете пользоваться отладчиком (ставить точки останова и выполнять пошагам). Пока не научитесь им пользоваться - будете постоянно спотыкаться.

По вашему коду: видите, в внутреннем while предусмотрен только один проход по строке (j только увеличивается).Нужно j сбрасывать, когда мы прошли по второй строке:

Код:
        while ((s2[j]!='\0') && (k>0))
        {
            if (s1[i]==s2[j])
            {
                k=0;
            }
            j++;
        }
        j = 0;
        ++i;
8Observer8 вне форума Ответить с цитированием
Старый 10.06.2012, 09:27   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
уж очень вульгарно двойной цикл одной строкой писать.
Ай лайк ит
Что поделать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с написанием программы.. super3994 Общие вопросы C/C++ 1 16.11.2011 22:36
Проблема с написанием программы PashkaRus Помощь студентам 3 07.06.2011 11:44
Проблема с написанием программы в Паскале alexchromets Помощь студентам 0 27.02.2011 16:48
проблема с написанием многомодульной программы серг Общие вопросы C/C++ 16 18.03.2010 22:11