Вопрос по С++

Пух

كنت بلهاء
Модератор
Строка, содержащая произвольный русский текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в этом тексте.

Код:
#include <stdio.h> 
#include <string.h> 
#include <conio.h> 
 
char cnt[256]; 
 
void main() 
{ 
  char *rus="ЁёЙЦУКЕНГШЩЗХЪЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю"; 
  int ch; 
  printf("Вводите текст, конец текста - Enter\n"); 
  while((ch=getchar())!=10)cnt[ch]++; 
  for(ch=0;ch<256;ch++) 
    if(strchr(rus,ch)&&cnt[ch])printf("%c - %d раз\n",ch,(int)cnt[ch]); 
}
кому не сложно, объясните алгоритм))
я так понимаю что вводится строка, сравнивается с алфавитом (строка rus), а как оно подсчитывает?!
 

Cris

Member
Строка, содержащая произвольный русский текст, состоит не более чем из 200 символов. Написать, какие буквы и сколько раз встречаются в этом тексте.

Код:
#include <stdio.h> 
#include <string.h> 
#include <conio.h> 
 
char cnt[256]; 
 
void main() 
{ 
  char *rus="ЁёЙЦУКЕНГШЩЗХЪЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю"; 
  int ch; 
  printf("Вводите текст, конец текста - Enter\n"); 
  while((ch=getchar())!=10)cnt[ch]++; 
  for(ch=0;ch<256;ch++) 
    if(strchr(rus,ch)&&cnt[ch])printf("%c - %d раз\n",ch,(int)cnt[ch]); 
}
кому не сложно, объясните алгоритм))
я так понимаю что вводится строка, сравнивается с алфавитом (строка rus), а как оно подсчитывает?!
ну считываем строку, пока читается и делаем массив счетчиков для каждой буквы - cnt[256] - индекс=код символа
и потом циклом проходим по массиву и смотрим если данный индекс(i) то есть символ есть в нашем алфавите(strchr) то выводим сколько раз встречается
 

Пух

كنت بلهاء
Модератор
В файле test1.txt записаны слова в строчку(в 1 строке 1 слово, но не больше 5 штук), а в файле test.txt записан текст произвольный текст. Нужно найти сколько раз встречается слова с файла тест1 в тексте с файла тест. Есть функция, которая считает кол-во вхождений строки s0 в строку s. Написал программу, только работает для 1 слова в файле тест1... Кароче, подскажите как доделать программу, чтобы считала для всех слов с файла тест1, а не только одного...
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int countword(const char s0[], const char s[]){
   int k=0;
   int i=0;
   while (s[i]){
     int x;
       for (int j=0;s0[j];j++){
	  x=0;
	  if(j>0) i++;
	    if (s0[j]==s[i]) x=1;
	      else break;
	}
    i++;
  if (x==1) k++;
  }
 return k;
}

void main() {
   FILE *f,*f1;
   char s[50000];
   char s0[50];
   int t=0;
   clrscr();
   f=fopen("test.txt","r");
   f1=fopen("test1.txt","r");
   fgets(s0,50,f1);
    while (!feof(f)){
     fgets(s,5000,f);
     t+=countword(s0,s);
     printf("%s",s);
     s[0]='\0';
   }
   printf("slovo '%s' vstre4aetsya %d raz(a)",s0,t);
   fclose(f);
   fclose(f1);
   getch();
 }
 

Cris

Member
В файле test1.txt записаны слова в строчку(в 1 строке 1 слово, но не больше 5 штук), а в файле test.txt записан текст произвольный текст. Нужно найти сколько раз встречается слова с файла тест1 в тексте с файла тест. Есть функция, которая считает кол-во вхождений строки s0 в строку s. Написал программу, только работает для 1 слова в файле тест1... Кароче, подскажите как доделать программу, чтобы считала для всех слов с файла тест1, а не только одного...
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int countword(const char s0[], const char s[]){
   int k=0;
   int i=0;
   while (s[i]){
     int x;
       for (int j=0;s0[j];j++){
	  x=0;
	  if(j>0) i++;
	    if (s0[j]==s[i]) x=1;
	      else break;
	}
    i++;
  if (x==1) k++;
  }
 return k;
}

void main() {
   FILE *f,*f1;
   char s[50000];
   char s0[50];
   int t=0;
   clrscr();
   f=fopen("test.txt","r");
   f1=fopen("test1.txt","r");
   fgets(s0,50,f1);
    while (!feof(f)){
     fgets(s,5000,f);
     t+=countword(s0,s);
     printf("%s",s);
     s[0]='\0';
   }
   printf("slovo '%s' vstre4aetsya %d raz(a)",s0,t);
   fclose(f);
   fclose(f1);
   getch();
 }
что то страшное пишеш
Код:
#include <stdio.h>
#include <string.h>
#define N 5
#define L 100
int find(char word[], char library[N][L])
{
	for(int i=0;i<N;i++)
		if(strstr((const char*)&library[i][0],(const char*)&word[0])!=NULL) return i;
	return -1;
}
int main()
{
	FILE *test1=fopen("test1.txt","r"),*test2=fopen("test2.txt","r");
	char word[L];
	char library[N][L];
	int cnt[N]={0};
	int n=0;
	int c=0;
	while(fscanf(test1,"%s\n",&word[0])!=-1)
	{
		strcpy(library[n],(const char*)&word[0]);
		n++;
	}
	fclose(test1);
	while(fscanf(test2,"%s",&word[0])!=-1)
	{
		c=find(&word[0],library);
		if(c!=-1) cnt[c]++;
	}
	fclose(test2);
	for(int i=0;i<n;i++)
	{
		printf("%s -> %d\n",library[i],cnt[i]);
	}
	return 0;
}
как работает:
считываем сначала наш словарь в массив library
массив cnt - будет считать сколько раз попалось каждое слово
дальше считываем текст до конца со второго файла
и запускаем для каждого считаного слова поиск его в словаре -find()
нашли - увеличиваем счетчик
strstr - я использовал для сравнения двух строк, его походу надо заменить надо на strcmp
если ты не знаеш то scanf("%s") - считывает набор символом до первого пробела вроде как
 

Пух

كنت بلهاء
Модератор
Спасибо)
страшное наверное потому, что с строками практически не работал, файлы не учил вообще, а задание сделать нада...
 

blackboy

New Member
Відповідь: Вопрос по С++

Имеется Windows 7 x64, нужен компилятор для С++. Борланд не работает на х64, need help!
 

Ashtaret

Филаретовый пизироq
Код:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#define N 3


void main ()
{
// описання структури
struct tovar
{
char imya[5];
int kolvo;
int cena1;
float cena2;
int srok;
int obwcena1;
int obwcena2;
}x[N];
int i;
float cenna2;
int maxs,mins,maxc,minc;
float maxc2,minc2;
clrscr();
maxs=0;
mins=0;
maxc=0;
minc=0;
maxc2=0;
minc2=0;
for (i=0;i<N; i++)
{
printf(" imya tovara:\n ");
scanf("%s",&x[i].imya);
printf("\n cena do ycenki:\n ");
scanf("%i",&x[i].cena1);
printf("\n srok hranen:\n ");
scanf("%i",&x[i].srok);
}
   fflush(stdin);

     for(i=0;i<N;i++){
   if(x[i].srok>2)
     cenna2=x[i].cena1/2;
     x[i].cena2=cenna2;

   printf("------------------\n");
   printf("imya tovara - %s\n cena do ycenki - %i\n cena posle ycenki - %7.2f \n, srok hraneniya %i\n",x[i].imya,x[i].cena1,cenna2,x[i].srok);

   }
     for(i=0;i<N;i++)
     if(maxs<x[i].srok){maxs=x[i].srok;  }
     if(mins>x[i].srok){mins=x[i].srok;  }
     		printf("maximalnui srok = %i \n",maxs);
     		printf("minimalnui srok = %i \n",mins);

                                              
      if(maxc<x[i].cena1){maxc=x[i].cena1;  }
      if(minc>x[i].cena1){minc=x[i].cena1;  }
         printf("maximalna cena do ycenki = %i \n",maxc);
     		printf("minimalna cena do ycenki = %i \n",minc);

         
      if(maxc2<cenna2){maxc2=cenna2;  }
      if(minc2>cenna2){minc2=cenna2;  }
      	printf("maximalna cena pislia ycenki = %f \n",maxc2);
     		printf("minimalna cena pislia ycenki = %f \n",minc2);


getch();
}
Торговый склад производит уценку хранящейся продукции. Если продукция хранится на складе дольше п месяцев, то она уценивается в 2 раза, а если срок хранения превысил т(т< п) месяцев, но не достиг п, то — в 1,5 раза. Ведомость уценки товаров должна содержать следующую информацию: наименование товара, количество товара, цена товара до уценки, срок хранения товара, цена товара после уценки, общая стоимость товара до уценки, общая стоимость товаров после уценки. Выяснить максимальный и минимальный сроки хранения товаров на складе; максимальную и минимальную цену товаров до уценки и после уценки.
а теперь вопрос , задачу почти сделал, только в конце непойму почему у меня ненаходит минимальный срок, минимальную ценпосле , и максимальную и минимальную цену до уценки.
всё остальное находит и работает правельно.
 
Останнє редагування:
Зверху