Xin ý tưởng bài C này

Viết chương trình cho phép nhập vào một xâu ký tự và một số nguyên n, in ra màn
hình xâu ký tự trên nhiều dòng với mỗi dòng không có nhiều hơn n ký tự, tuy nhiên
việc ngắt dòng chỉ được thực hiện ở vị trí dấu trống (không được ngắt giữa một từ).
 

VSupport

Ngây thơ trong tối
Bạn for i = 0 tới n
sau đó kiểm tra lần lượt nếu s = ' ' thì print("\n");
Ngược lại thì print s

Cứ vậy tới hết chuỗi thì sẽ tác được các từ xuống từng dòng :troll2:
 
nếu cứ cho i chạy từ 0 đến n thì cứ sau mỗi vòng lặp lại in ra s[0] -> s[n] mà b.
bài toán có nhiều hơn n kí tự thì sao in đc s[n+1], s[n+2],....
 

quanltv

Sư phụ của ADMIN
Bạn for i = 0 tới n
sau đó kiểm tra lần lượt nếu s = ' ' thì print("\n");
Ngược lại thì print s

Cứ vậy tới hết chuỗi thì sẽ tác được các từ xuống từng dòng


Lời giải khá chuẩn chỉ tại cái đề bài cũng hơi dở: Ngắt các từ không có nhiều hơn n kí tự, mà chỉ được ngắt tại các kí tự trắng. n nhỏ mà từ lại dài thì treo máy là cái chắc:troll2:
 

VSupport

Ngây thơ trong tối
nếu cứ cho i chạy từ 0 đến n thì cứ sau mỗi vòng lặp lại in ra s[0] -> s[n] mà b.
bài toán có nhiều hơn n kí tự thì sao in đc s[n+1], s[n+2],....
Đọc nhầm đề, nhưng bạn xem lại đề đúng ko vậy thấy nó hơi bị mâu thuẫn :rage3:
việc ngắt dòng chỉ được thực hiện ở vị trí dấu trống (không được ngắt giữa một từ).

Lỡ cái từ đó nó dài hơn n ký tự rồi vẫn không được ngắt dòng rồi sao mà mỗi dòng ít hơn n ký tự được
 
ví dụ như này nhé b, mk có đoạn xâu: "anh anh nghieng" mình nhập n=6 thì in ra là:
anh
anh
nghieng
nếu mk nhập n=9 thì in ra là:
anh anh
nghieng
 

VSupport

Ngây thơ trong tối
ví dụ như này nhé b, mk có đoạn xâu: "anh anh nghieng" mình nhập n=6 thì in ra là:
anh
anh
nghieng
nếu mk nhập n=9 thì in ra là:
anh anh
nghieng
Nếu bạn nhập n bằng 2 thì in ra kiểu gì không được in ra lớn hơn n ký tự và không được xuống dòng giữa chữ? :forever-alone:
 
bạn đọc bài này sẽ dễ hiểu hơn bài trên.
"Viết chương trình cho phép nhập vào một xâu ký và m ột số nguyên n, in ra màn hình
xâu ký tự vào trên nhiều dòng với mỗi dòng không có nhiều hơn n ký tự."
tuy nhiên bài trên hoàn chỉnh hơn.
 

taplamhacker

♥ Thanh Trâm ♥
nhập s
nhập n
dem=strlen(s)
for 0 > dem
in s
if(s=' ' || i%n==0)
in \n

:man:
sai thôi bỏ qua đêm khuya nhát test quá @@!
 
cũng sai thật :))
cái vấn đề là khi n rơi vào giữa của 1 từ thì ta không thể cắt đôi từ đó để xuống dòng đc.
 

VSupport

Ngây thơ trong tối
cũng sai thật :))
cái vấn đề là khi n rơi vào giữa của 1 từ thì ta không thể cắt đôi từ đó để xuống dòng đc.
Đúng là bài này cũng hơi bị phức tạp. Bạn thử tách từng từ vào mảng a[] chẳng hạn, sau đó chạy dòng lặp while(t<n) trong đó t là biến đếm để lần lượt kiểm tra đã chạy hết cải chiều dài mảng đó chưa.

Trong dòng lặp while đó tiếp tục có 1 dòng lặp while khác kiểm tra việc + a[t].leght() + a[t+].leght(), đặt biến st=s; s = s + a[t], nếu vẫn nhỏ hơn n thì t++ break cái vòng lặp while để cộng tiếp tục cho tới khi nào nó lớn hơn thì cout cái st ra. sau đó t-- để trở lại phần tử trước của mảng đó rồi lại kiểm tra :ucche:
 

taplamhacker

♥ Thanh Trâm ♥
chuỗi dấu cách xuống dòng hoặc 1 dòng có n+1 ký tự
[AH]
Mã:
#include<stdio.h>#include<string.h>
int main()
{
    char s[999];
    printf("nhap chuoi\n");
    fflush(stdin);
    gets(s);
    int j = strlen(s);
    int n;
    printf("\n nhap n \n");
    printf("\n so ky tu tren 1 dong = n+1 \n");
    scanf("%d",&n);
    int dem=0;


        for ( int i = 0 ; i < j ; i ++)
        {    
            printf("%c",s[i]);
            dem++;
            if(s[i]==' ')
                {
                    printf("\n");
                    dem=0;
                }
            if ( dem==n)
            {    
                printf("\n");
                dem=0;
            }
        }
    
}
[/AH]
code 1 dòng có k quá n + 1 ký tự
[AH]
Mã:
#include<stdio.h>#include<string.h>
int main()
{
    char s[999];
    printf("nhap chuoi\n");
    fflush(stdin);
    gets(s);
    int j = strlen(s);
    int n;
    printf("\n nhap n \n");
    printf("\n so ky tu tren 1 dong = n+1 \n");
    scanf("%d",&n);
    int dem=0;


        for ( int i = 0 ; i < j ; i ++)
        {    
            printf("%c",s[i]);
            dem++;
        
            if ( dem==n)
            {    
                printf("\n");
                dem=0;
            }
        }
    
}
[/AH]
 

VSupport

Ngây thơ trong tối
Em còn chưa check cái trường hợp n nhập vào nhỏ hơn chiều dài của từ

ví dụ: Dien dan cong nghe vfo.vn

Mà em nhập số 3 thì nó sẽ báo lỗi.

Và trường hợp em nhập số 10 thì nó phải ra là
Dien dan
cong nghe
vfo.vn

Chứ ko phải tách từng khoảng trắng thì dễ rồi :sexy_girl:
 

taplamhacker

♥ Thanh Trâm ♥
:conan: sau 1 hồi vắt óc :v
[AH]
Mã:
#include<stdio.h>#include<string.h>
#include<stdlib.h>
void output(char s[] ,int n,int j)
{
	int dem=0;
	int tmp=-1;
	for (int i = 0 ; i < j ; i ++)
		{
			dem++;
			if ( s[i] == ' ' && dem<=n)
				{
					if(tmp >= 0)
						s[tmp] = ' ';
				//	printf("\n tmp = %d",tmp);
					s[i]='\n';
					tmp = i;
				}
			if (dem > n)
				{
					dem=0;
					tmp=-1;
				}
		}
		puts(s);
}
int main()
{
	char s[999];
	printf("nhap chuoi\n");
	fflush(stdin);
	gets(s);
	int j = strlen(s);
	int n;
	printf("\n nhap n \n");
	printf("\n so ky tu tren 1 dong = n+1 \n");
	scanf("%d",&n);
	int dem=0;
	for ( int i= 0 ; i < j ; i ++)
	{
		if (s[i]==' ')
			dem++;		
		if( i > n-1 && dem==0 )
			{
				printf("loi ");
				exit(0);							
			}
	}
	output(s,n,j);
	
}
[/AH]
 

VSupport

Ngây thơ trong tối
Hình như vẫn còn sai, nói sơ ý tưởng của em xem Cong Anh
 

taplamhacker

♥ Thanh Trâm ♥
Hình như vẫn còn sai, nói sơ ý tưởng của em xem Cong Anh
đầu tiên là kiểm tra n
cho vòng lặp tới n nếu k có dấu cách thì báo lỗi và thoát
nếu n đúng
khởi tạo tmp = -1
dem =0;
cho vòng lặp
cứ i tăng thì biến đếm tăng
nếu có s nào đó là dấu cách và dem <= n
thì dấu cách sẽ là dấu xuống dòng
và lưu biết i vào tmp ( nhớ vị trí có dấu cách)
sao đó xem dem > n chưa nếu lớn hơn thì xong 1 dòng đưa tmp + dem về giá trị bang đầu

còn cái
Mã:
 if(tmp >= 0)
						s[tmp] = ' ';
để xem nếu mà dem<=n và s là dấu cách
thì dấu xuống dòng TRƯỚC ĐÓ sẽ dc đổi lại là dấu cách
 

Thống kê

Chủ đề
102,309
Bài viết
469,956
Thành viên
340,421
Thành viên mới nhất
arissaseah51
Top