Thắc mắc bài tập chuỗi: tìm từ dài nhất

mình làm bài tìm từ dài nhất này chia thành 2 trường hợp là xét từ đầu tiên rùi sau đó mới xét các phía sau . trường hợp xét chữ đầu tiên thì đúng còn trường hợp kia thì nếu mún in ra kết quả phải thêm dấu cách sau từ đó thì mới in ra kết quả .

#include "stdafx.h"
#include<iostream>
#include<conio.h>
#include<math.h>
#include<string.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	char s[20];
	int len;
	do
	{
		cout << " nhap chuoi ki tu : ";
		cin.getline(s, 50);
		cout << " chuoi vua nhap ";
		cout << "*" << s << "*" << endl;
		// tìm từ dài nhất
		len = strlen(s);
		int a[100];
		int na = 0;
		if (s[0] != NULL && s[0] != 32) // xét độ dài từ đầu tiên 
		{
			int dem = 1;
			for (int i = 1; i < len; i++)
			{
				if (s[i] != 32)
				{
					dem++;
				}
				else
					break;
			}
			a[na++] = dem;
		}
		for (int i = 1; i < len; i++) // xét độ dài những từ tiếp theo
		{
			if (s[i] != 32)
			{
				int dem = 1;
				for (int j = i + 1; j < len; j++)
				{
					if (s[j] != 32)
					{
						dem++;
					}
					else break;
				}
				a[na++] = dem;
			}
		}
		int max = a[0]; // tìm số từ dài nhất là bao nhiêu
		for (int i = 1; i < na; i++)
		{
			if (max < a[i])
			{
				max = a[i];
			}
		}
		if (s[0] != NULL &&s[0] != 32) // xét từ đầu tiên có thoã không 
		{
			int dem = 1;
			int min;
			for (int i = 1; i < len; i++)
			{
				if (s[i] != 32)
				{
					dem++;
				}
				else
				{
					min = i ;
					break;
				}
			}
			if (dem == max)
			{
				for (int j = 0; j <= min; j++)
					cout << s[j];
				cout << endl;
			}
		}
		for (int i = 1; i < len; i++) // xét những từ phía sau có thoả không 
		{
			int min;
			int dem = 0;
			if (s[i] != 32)
			{
				dem++;
				for (int j = i + 1; j < len; j++)
				{
					if (s[j] != 32)
						dem++;
					else
					{
						min = j;
						break;
					}
				}
			}
			if (dem == max)
			{
				for (int z = i; z < min-1; z++)
					cout << s[z];
				cout << endl;
			}
		}
	} while (_getch() != 27);
	return 0;
}

Một cách khác ngắn hơn:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[100];	// input
    char b[30];		// temporary
    char c[30];		// result
    int j = 0, maxlength = 0;

    gets(a); // input

    for(int i = 0; i <= strlen(a); i++){
        if(a[i] != 32 && a[i] != '\0'){
	    b[j++] = a[i];
	}else{
            b[j] = '\0';
            if(strlen(b) > maxlength){
                strcpy(c, b);		// b -> c
                maxlength = strlen(b);	// update maxLength
            }
            j = 0;
        }
    }
    puts(c); // output - result
    return 0;
}
3 Likes

Tks nhiều . Mà bạn có cách nào sửa giúp bài trên của mình được không , mình không hiểu tại sao phải thêm dấu cách sau từ dài nhất mới in ra được

#include <iostream>
#include <string.h>
#include <vector>

int main() {
        vector<string> v;
        string s;
        gets(s);
        s+=' ';
        string t;
        int maxx=-999999;
        for(int i =0; i<s.size(); i++ {
              if(s[i]!=' '){
                    t+=s[i];
              } else { 
                     v.push_back(t);
                     maxx= max(t.size(),maxx);
                     t="";
              }
        
        }
        for(int i =0;i<v.size();i++){
              if(v[i].size()==maxx) cout << v[i] << endl;
        }

}

//// thì bạn thêm ’ ’ vào cuối chuỗi của bạn :3

Ban oi cho minh hoi tai sao dong cuoi cung lại j=0 ; vay

Mục đích của J=0 là Reset J về để tính lại chuỗi b.

a[i] != 32 là sao ạ, 32 là gì mà khi mình thay số khác thì khi run chương trình bị sai.

32 là mã ASCII của space đó chị

2 Likes

Trong chương trình mình chỉ không hiểu mỗi chỗ đó, cảm ơn bạn đã giải đáp cho mình. :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?