Bài tập C Đổi các ký tự đầu của các từ ra chữ Hoa [Archive] – Cộng đồng C Việt

View Full Version : Bài tập C Đổi những ký tự đầu của những từ ra chữ Hoa

drak77

Viết chưong trình đổi các ký tự đầu của các từ ra chữ Hoa còn lại là chữ thừong .Ví dụ : this is a new car —> This Is A New Car.
Mình chưa hình dung ra thuật toán để giải bài này thế nào cả.Mong các bạn giúp đỡ.

QuangHoang

– B1: Dùng con trỏ duyệt chuỗi chuyển tất cả các từ thành chữ thường
– B2: Dùng con trỏ duyệt chuỗi chuyển tất cả các kí tự != space mà trước nó là 1 space thành chữ hoa.

drak77Bài này mình chưa biết làm thế nào để biết được vị trí của mỗi từ của đầu câu để hoàn toàn có thể chuyển từ đó thành chữa hoa : (. VD : this is. Mình cho duyệt con tro từ cuối lên đến thành phần i ( is ) thì làm thế nào để biết vt của nó là thứ mấy ?. Bạn giúp mình với .
tnglinh

ok để mình thử

khai bao s kiểu chuỗi
nhập xuất chuỗi chắc bạn ok rồi chứ mình ko nói nữa
s(0)=s(0)-32
for (i=1;i<=strlen(s);i++)
if (s(i)=” “) s(i+1)=s(i+1)-32;

chỉ có vậy mong giúp đc bạn
mà bảo mọi người vào giúp bài minh nhé

thanhtranduc0706

#include
#include
#include
#define max 1001
char a[max];
int n,i;
void enter()
{
gets(a);
n=strlen(a);
}

void ChuanHoa()
{
if ((a[0]>=’a’)&&(a[0]<='z')) a[0]-=32;
for(i=1;i if ((a[i-1]==’ ‘)&&(a[i]!=’ ‘)&&(a[i]>=’a’)&&(a[i]<='z')) a[i]-=32;
for(i=1;i
if ((a[i-1]!=’ ‘)&&(a[i]!=’ ‘)&&(a[i]>=’A’)&&(a[i]<='Z')) a[i]+=32;
printf(“%c”,a[0]);
for(i=1;i {
if(a[i]==’ ‘)
{
if (a[i-1]!=’ ‘) printf(“%c”,a[i]);
}
else
printf(“%c”,a[i]);
}

}

int main()
{
enter();
ChuanHoa();
getch();
return 0;
}
tặng bạn nè

thanhtranduc0706ai có cách nào post lên mọi người cùng ghi nhận và tăng thêm kiến thức và kỹ năng nha ! ! ! ! ! ! thank
drak77

Cám ơn “tnglinh và thanhtranduc706 “nhé mình dựa trên thuật giải của bạn viết lại được cái này ngắn hơn nè :):

#include
#include
void chuanhoa();
char c[50];
int i,n,j;
void main()
{
printf(“Nhap vao chuoi :”);
gets(c);
chuanhoa();
puts(c);
}
void chuanhoa()
{
n=strlen(c);
for(j=0;j if(c[j]!=’ ‘ && c[j]>=’A’ && c[j]<='Z') c[j]+=32;
for(i=0;i if(c[i]==’ ‘ ) c[i+1]-=32;
if(c[0]>=’a’ && c[0]<='z') c[0]=c[0]-32;
}

QuangHoang

Nếu các bạn không chuẩn hóa (xóa space ở đầu, ở cuỗi, và 2 space liền nhau ở trong) thì làm như cách trên là chưa chặt chẽ. Mình đã viết rõ ràng rồi còn gì.

– B1: Dùng con trỏ duyệt chuỗi chuyển tất cả các từ thành chữ thường
– B2: Dùng con trỏ duyệt chuỗi chuyển tất cả các kí tự != space mà trước nó là 1 space thành chữ hoa.

char *pstr = str; //str là chuỗi nhận vào
while (*pstr != ‘\0’)
if (*pstr>= ‘A’ && *pstr <= 'Z') *pstr += 32;pstr = str;
while (*(pstr+1) != ‘\0’)
if (*pstr == ‘ ‘ && *(pstr+1) != ‘ ‘) *pstr -= 32;

thanhtranduc0706

Nếu các bạn không chuẩn hóa (xóa space ở đầu, ở cuỗi, và 2 space liền nhau ở trong) thì làm như cách trên là chưa chặt chẽ. Mình đã viết rõ ràng rồi còn gì.

char *pstr = str; //str là chuỗi nhận vào
while (*pstr != ‘\0’)
if (*pstr>= ‘A’ && *pstr <= 'Z') *pstr += 32;pstr = str;
while (*(pstr+1) != ‘\0’)
if (*pstr == ‘ ‘ && *(pstr+1) != ‘ ‘) *pstr -= 32;

bạn viết con trỏ thì một số mới học nhìn thấy ớn hi(:-*)

hoailenpro

code này đã chuẩn hóa có thể tham khảo nè:

#include
#include
#include
void chuanhoa( char *s)
{
while (s[0] == 32)
for(unsigned int i = 0; i < strlen(s); i++)
s[i] = s[i + 1];
while(s[strlen(s) – 1] == 32)
s[strlen(s) – 1] = 0;
for (unsigned int j = 1; j < strlen(s) -1; j++)
if(s[j] == ‘ ‘ && s[j + 1] == ‘ ‘)
{
for (unsigned int k = j; k< strlen(s); k++)
s[k] = s[k + 1];
j–;
}
strlwr(s);
s[0] = s[0] -32;
for (unsigned int k=1; k< strlen(s); k++)
if (s[k] == ‘ ‘)
s[k + 1] = s[k + 1] -32;
}
void main()
{
char s[100];
printf(“nhap chuoi vao “);
gets(s);
chuanhoa(s);
strrev(s);
strcat(s,” “);
strrev(s);

printf(“chuoi da chuan hoa \”%s\”\n”, s);
printf(“\””);
for (int i = strlen(s) -1; i >= 0; i–)
{
if(s[i] ==’ ‘)
{

for (unsigned int j = i+1; j < strlen(s); j++)
printf(“%c”, s[j]);
printf(” “);
s[i] = 0; // o ki tu dau tien khi s[0] == ‘ ‘, thi lap vo han
}

}
printf(“\”\n”);

}

thanhtranduc0706sao cái này bạn làm hình như có lỗi sao ấy mọi người thử chạy rồi cho quan điểm nha 😀
drak77Cám ơn bạn Hoang nhé mình quên không tính đến 2 space liền nhau 🙂 .
tnglinh

thêm nhập xuất làm giống mình co vài dòng thôi
cố lên nhé
minh đang làm bài mô tả thuật toán chèn bằng đồ họa trong C
khó quá ai có giúp với

drak77

Mình nghĩ thế này là Ok :D:

#include
#include
void chuanhoa();
char c[50];
int i,n,j;
void main()
{
printf(“Nhap vao chuoi :”);
gets(c);
chuanhoa();
puts(c);
}
void chuanhoa()
{
n=strlen(c);
for(j=0;j if(c[j]!=’ ‘ && c[j]>=’A’ && c[j]<='Z') c[j]+=32;
for(i=0;i if(c[i]==’ ‘ && c[i+1]!=’ ‘ ) c[i+1]-=32;
}
Còn cách làm về con trỏ mình vẫn chưa làm đựoc:(.

tnglinh

(:-)w(:-)w
vẫn thấy dài
ở phần chuẩn hóa có thể bỏ đc đi 3 dòng nữa đó
cố gắng rút gọn nhé(=D)>(=D)>

slowlove

hàm chuẩn hóa nè: bỏ ‘ ‘ở 2 đầu..và các ký tự tùy chọn trùng nhau..kí tự đặc biệt…(cho phép trong tên có số…)
nếu ko thick có số thì bỏ đk (*b<'0'|*b>‘9’) đi nhé..

char* std_chuoi(char *begin,char c) //Ham chuan hoa chuoi~
{
uint a;
char *b;
a=0;
while(*(begin+a)!=’\0′){
b=begin+a;
if((*b<'0'|*b>‘9’)&(*b<'A'|*b>‘Z’)&(*b<'a'|*b>‘z’)& *b!=’ ‘)*b=’ ‘;
a++;}
char *end=begin+strlen(begin);
while(*begin==’ ‘)begin++;
while((*end==’ ‘)|(*end==’\0’))end–;
*(++end)=’\0′;
a=0;
while(*(begin+a)!=’\0′){
b=begin+a;
while(*b==c && *(b+1)==c)memmove(b,b+1,strlen(b));
a++;}
return begin;
}
đã test rất kỹ,chạy rất chuẩn..tuy hơi dài..^^

vBulletin ® Version 4.2.2, Copyright © 2022 vBulletin Solutions, Inc. All rights reserved. Administer by Kevin Hoang

Source: https://mix166.vn
Category: Thủ Thuật

Xổ số miền Bắc