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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2012, 20:18   #1
interfeys
Пользователь
 
Регистрация: 31.12.2010
Сообщений: 29
Сообщение

Я ученик 11 класса, готовлюсь к Егэ
В этой теме по-возможности собираюсь не реже раза в неделю (в общем то графика не будет, но задач 50 до июня думаю выложу) выкладывать решение задания С4 по информатике на языке С (которое уже корректно работает или не работает по неизвестной мне причине).
От вас мне требуется конструктивная критика по поводу эффективности алгоритма, и иногда уточнить некоторые тонкости.
Думаю, чтобы не загрязнять форум буду выкладывать в одной теме, те, кому интересно следит.
*Именно этот пост не содержит практически никакой смысловой нагрузки, просто интересно мнение пользователей

И почти сразу первое уточнение

Код HTML:
Предположим на вход поступают данные:
<Имя> <Фамилия> <Номер>

char str1[20];
char str2[10];
int Num;

Корректно ли ?
scanf("%s %s %d", str1, str2, &Num);
Код HTML:
А вот так никогда не делать?
char[10] str1;

Последний раз редактировалось Stilet; 18.11.2012 в 18:20.
interfeys вне форума Ответить с цитированием
Старый 17.11.2012, 22:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Корректно ли ?
Если не учитывать синтаксических ошибок и необходимости ввода через пробел то да.
Цитата:
А вот так никогда не делать?
Возможно какие-то из Си компилеров и понимают такую инструкцию, я не встречал такого.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.11.2012, 17:51   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Если не учитывать синтаксических ошибок и необходимости ввода через пробел то да.
Зависит от понимания "корректного". Это небезопасный код; чтение таким образом пользовательских данных допустимо только при абсолютном доверии к пользователю.
Abstraction вне форума Ответить с цитированием
Старый 18.11.2012, 18:21   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чтение таким образом пользовательских данных допустимо только при абсолютном доверии к пользователю.
Я же не отрицаю этого )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2012, 19:46   #5
interfeys
Пользователь
 
Регистрация: 31.12.2010
Сообщений: 29
По умолчанию Поляков. "Решение". C4-2

Вообще не стоило выкладывать это, но я не могу разобраться в символах
возможно, следовало использовать gets(); но то, что тут не оговоренно кол-во символов, намекает, что это делается по-другому
Литературу, естественно, прочитал, у меня есть представление того, что я хочу сделать (а может и нет)

На вход программы подается текст на английском языке, заканчивающийся точкой (другие символы “.” в тексте отсутствуют). Требуется написать программу, которая будет определять и выводить на экран английскую букву, встречающуюся в этом тексте чаще всего, и количество там таких букв. Строчные и прописные буквы при этом считаются не различимыми. Если искомых букв несколько, то программа должна выводить на экран первую из них по алфавиту. Например, пусть файл содержит следующую запись:
It is not a simple task. Yes!
Чаще всего здесь встречаются буквы I, S и T (слово Yes в подсчете не учитывается, так как расположено после точки). Следовательно, в данном случае программа должна вывести два символа, разделенных пробелом: I 3

Код:
#include<stdio.h>
#include<conio.h>
int main(void)
{
   int arr[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
   int ard[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   //2 практически необязательных массива
   char c;
   int a,a2,z,z2;
   while((c=getchar())!='.') //Видимо не та функция
   {
      char a = 'a'; 
      char a2 = 'A'; //Это я пытался очень сильно упростить
      char z = 'z'; 
      char z2 = 'Z';        
      if((c=getchar())>a&&(c=getchar())<z)
         ard[c-a]++;
      //По идее, код символа-код буквы "а", должен соответствовать 
     //ячейке в массиве
    //Допустим, если я ввожу a(код 65), то 65-65=0, а это соответствует
   // Тому самому адресу в массиве
  // Который увеличиться на 1
      if((c=getchar())>a2&&(c=getchar())<z2) //Для заглавных букв аналогично
         ard[c-a2]++;
   }
   int max=0;
   int boo=0;
   for(int i=0;i<26;i++)  //Находим самую частую букву
   {
      if(ard[i]>max)
      {
         ard[i]=max;
         boo=i;
      }
   }
   printf("%c %d",arr[boo],max);  //выводим
}

Последний раз редактировалось interfeys; 20.11.2012 в 11:09.
interfeys вне форума Ответить с цитированием
Старый 19.11.2012, 20:28   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы делал так:
Код:
	char s[225]="It is not a simple task. Yes!";
	int a['z'-'a'];for(int i=0;i<'z'-'a';i++)a[i]=0;
	int max=0;
	for(int i=0;s[i] && s[i]!='.';i++){
		char c=towlower(s[i]);
		if(c>='a' && c<='z') a[c-'a']++;
		max=(a[c-'a']>a[max-'a'])?c:max;
		
	}
	//for(int i=0;i<'z'-'a';i++) 		if(a[i]) printf("%c - %d\n",'a'+i,a[i]);
	printf("%c - %d\n",max,a[max-'a']);
	getchar();
	return 0;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2012, 21:39   #7
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

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

int main(void)
{
	/*Строку взял для примера, по сути надо её считать*/
	char str[30] = "It is not a simple task. Yes";
	
	/*Будем сюда подсчитывать кол-во использованных символов*/
	int ABC[128] = {0};

	/*Сразу найдем длину строки*/
	int len = strlen(str);

	/*Проходим по всей строке и заодно ищем максимальное кол-во вхождений*/
	int max = 0;
	for(int i = 0; i < len; ++i)
	{
		/*Преобразуем символ в верхний регистр*/
		char temp = toupper(str[i]);

		/*Если обнаружили точку*/
		if(temp == '.') break;
		
		/*Дословно: если temp это буква, тогда:
		  прибавляем к ABC[temp] единицу, и проверяем
		  больше ли ABC[temp], чем предыдущее значение
		  max? Если да, тогда max = ABC[temp], если
		  нет, тогда ничего не меняем*/
		if(isalpha(temp))
			max = ++ABC[temp] > max ? ABC[temp] : max;
	}

	/*Находим первую в алфавите букву с максимальным кол-во вхождений*/
	for(int i = 65; i < 90; ++i)
		if(ABC[i] == max)
		{
			printf("%c - %d\n",i,ABC[i]);	
			break;
		}

	return 0;
}
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 19.11.2012, 21:41   #8
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Я бы делал так:
Код:
int a['z'-'a'];for(int i=0;i<'z'-'a';i++)a[i]=0;
А зачем лишний цикл писать (да и еще и в одну строчку с объявлением, жуть одним словом), если можно:
Код:
int a['z'-'a'] = {0}
И на будущее ТС:
Код:
int ard[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
эквивалентно:
Код:
int ard[26]={0};
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

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

Цитата:
если можно:
Можно. Только вот я слышал обратное, что такая инструкция это присвоение только первому элементу нулевое значение, поэтому уже как бы в догадках.
Моя VS тебя поддерживает, но чем си не шутит?

Вообще конечно лучше чтоб спецы по си выступили в пользу этого или отвергли...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2012, 08:08   #10
interfeys
Пользователь
 
Регистрация: 31.12.2010
Сообщений: 29
По умолчанию Поляков.Решение.С4-2

Учел замечания, вот этот код, компилится и правильно работает
//2 массива, это минус, возможно
//Получилось компактно
//Насчет эффективности, не знаю

Код:
#include<stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
   char s[255];
   int abc[128]={0}; //Благодарю MooNDeaR
   gets(s);
   int g=0;
   int max=0;
   for(int i=0;s[i]!='.';i++)
   { 
         g=toupper(s[i]);
         if(isalpha(g))
            abc[g]++;
         if(abc[g]>max)
            max=abc[g];
   }
   for(int y=0;y<128;y++)
   {
      if(abc[y]>=max)
      {
         putchar(y);
         printf(" %d\n", max); break;
      }
   }
}

Последний раз редактировалось interfeys; 20.11.2012 в 11:06.
interfeys вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подготовка к егэ - C1, с2, с4 VaMpIR1111 Помощь студентам 2 12.04.2011 19:51
ЕГЭ часть В Xcopy Помощь студентам 8 24.02.2010 21:00
ЕГЭ (Логика) Xcopy Помощь студентам 6 07.02.2010 18:59
ЕГЭ Xcopy Помощь студентам 6 05.02.2010 14:44