Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Программа на C++. Как сделать проверку на конец строки? (https://forum.antichat.xyz/showthread.php?t=10988)

Meister 21.11.2005 18:07

Программа на C++. Как сделать проверку на конец строки?
 
Вот такая ситуация, для начала цель:
Нужна прога, в которой вводим строку из слов, после нажатия ВВода прога сообщает сколько всего символов в строке, Самое длинное и самое короткое слово. При этом надо учесть что пробелы и знаки пунктуации не будут подсчитываться, но могут использоваться.

Код:

#include<iostream.h>
#include<iomanip.h>
#include<conio.h>
#include<string.h>
using namespace std;
int main()
{
int i,longe, na4al,slov=0,array[100]={0},bukv=0,s4et=-1,max,min,x=0, prom;
char mass[100]={0};
cout<<"Input text: ";
cin.get(mass,100);
cout<<endl;
cout<<"\n Obshee kol-vo Symbolov: "<< strlen(mass) <<endl;
for (int zz=0; zz<longe-1 ;zz++)
if (ispunct(mass[zz]) || isspace(mass[zz]))
{
array[x]=bukv;
bukv=0;
x++;
}
else
bukv++;
max=array[0];
for (int z=1;z<x;z++)
if (array[z]>max)
max=array[z];
cout<<" Longest Word  "<< max;
min=array[longe];
for (int k=0;k<x;k++)
if (array[k]==0 || array[k]==1)
prom=0;
else
if (array[k]<min)
min=array[k];
cout<<" Shortest word "<< min;
getch();
return 0;
}

Я предполагаю, что нужно сделать еще одну проверку на конец строки тут: if (ispunct(mass[zz]) || isspace(mass[zz]))
Но я не знаю как, повторяю трабл в том, чтобы прога работала правильно если последный символ не является пробелом или знаком пунктуации. У меня правильно считает только если пробел или знак пунктуации. Хелп.

Deem3n® 21.11.2005 18:43

Первый вариант:
читай строку ф-цией сin.getline() (твой код был cin.get(mass,100);), в MSDN есть описание - тогда в массиве не будут символы "конец строки" тобиш '\n'

Второй вариант:
Сделай еще одну проверку на конец строки - символ '\n'

if (ispunct(mass[zz]) || isspace(mass[zz]) || iseol(mass[zz]))

Meister 21.11.2005 19:09

А вот что выдает [C++ Error] Unit1.cpp(16): E2268 Call to undefined function 'iseol' Хотя я именно это искал, но пишет, как будто ошибка в написании имени функции.

P.S Кстати разве конец строки \n? Не \0 ?

RevenAnt 21.11.2005 19:37

Код:

#include <stdio.h>
#include<conio.h>
#include<string.h>

main() {
        char mass[999]={0};
        int len=0,lenmax=0,lenmin=999,maslen,j=0,z;
        gets(mass);
        printf("\nLength: %d\n",strlen(mass));
        maslen=strlen(mass);
        strcat(mass," ");

        for (int i=0; i<maslen+1; i++) {
                if (len==1) {j=i;}

                if ((mass[i]>='a' && mass[i]<='z') || (mass[i]>='A' && mass[i]<='Z'))
                { len++; } else
                {
                        if (lenmax<len) {lenmax=len;}
                        if (lenmin>len && len!=0) {lenmin=len;}
                        len=0;
                }

        }
        printf("Longest: %d\n",lenmax);
        printf("Shortest: %d\n",lenmin==999 ? 0 : lenmin);
        getch();
}

вотсс.... просто считает ... сами слова чтобы вывести, нада следить за строкой, либо начала-конец фрагмента, либюо копировать сам фрагмент...

Meister 21.11.2005 19:53

RevenAnt, спасибо, +1 к репутации, только почему русские буквы не воспринимает? Попробовал заменить a и z, и A и Z на а и я и А и Я, не пошло.

RevenAnt 21.11.2005 20:55

ну просто :) пойдём тагда по ascii кодам =)
Код:

if ((mass[i]>=-96  && mass[i]<=-17) || (mass[i]>=-128  && mass[i]<=-97))
т.к. был использован просто char а не unsigned char, то русская расскладна у нас находиться в отрицательном диапазоне ....
Код:

for (i=-128;i<-98; i++) {printf ("%c",i);}

Deem3n® 21.11.2005 23:13

Цитата:

А вот что выдает [C++ Error] Unit1.cpp(16): E2268 Call to undefined function 'iseol' Хотя я именно это искал, но пишет, как будто ошибка в написании имени функции.
функцию iseol ты сам должен написать (как и функции isspace и ispunct)
Цитата:

Кстати разве конец строки \n? Не \0 ?
\0 - конец массива char

мда вот решение (предложение может быть любой длины):
Код:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <values.h>

void main()
{
        int maxlen=0;
        int minlen=MAXINT;
        int len=0;
        int total=0;
        char ch;

        clrscr();
        printf("Enter sentence:\n");
        while ((ch=getchar())!='\n') //читаем пока не будет конец строки
        {
                if (ch==' ' || ch==',' || ch=='.' || ch==':' || ch==';') //конец слова
                {
                        if (len>maxlen) maxlen=len;
                        if (len<minlen && len!=0) minlen=len;
                        len=0;
                }
                else
                        len++;
                total++;
        }

        printf("Total lenght: %i\n", total);
        printf("Longest: %i\n", maxlen);
        printf("Shortest: %i\n", minlen);
        getch();
}


[1Ns] 21.11.2005 23:24

Нам недавно тож такое задавали, я делал так:
Код:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
 char *s;
 int r,i,j=0,k=0,k1=0,c[50],k2=100,min,max,n,n1,m=0;
 clrscr();
 printf("Vvedite stroku\n\n  ");
 fflush(stdin);
 gets(s);
 r=strlen(s);
 for (i=0;i<r;i++)
  if (*(s+i)!=' '&&*(s+i)!='.'&&*(s+i)!=','&&*(s+i)!='-') k+=1;
  else if (k!=0) {
                  m+=1;
                  if (k<k2) {min=k;n=i-min;k2=k;}
                  if (k>k1) {max=k;n1=i-max;k1=k;}
                  c[j]=k;j+=1;
                  k=0;
                }
 if (k!=0&&k<k2) {min=k;n=i-min;}
 if (k>k1) {max=k;n1=i-max;}
 if (k!=0) {m+=1;c[j]=k;}
 for (i=0;i<m-1;i++)
  for (j=i+1;j<m;j++)
  if (c[j]<c[i]) {
                  k=c[i];
                  c[i]=c[j];
                  c[j]=k;
                  }
 j=(m-1)/2;
 printf("\n...................:::STATISTIKA:::...................\n\n * Koli4estvo slov  --- %d\n\n * Minimal'noe slovo --- ",m);
 for(i=n;i<n+min;i++) printf("%c",*(s+i));
 printf(" (simvolov - %d)\n\n",min);
 printf(" * Maximal'noe slovo --- ");
 for(i=n1;i<n1+max;i++) printf("%c",*(s+i));
 printf(" (simvolov - %d)\n\n",max);
 printf(" * Koli4estvo simvolov srednego po dline slova --- %d\n\n......................................................",c[j]);
 getch();
}



Время: 12:57