PDA

View Full Version : Nhập một xâu ký tự và một kí tự, đếm số lần xuất hiện của ký tự đó trong xâu



chel92
07-04-2011, 10:25 PM
Nguyên văn đề cho là: Nhập một xâu ký tự st và một kí tự c, đếm số lần xuất hiện của ký tự c trong xâu st

Đây là bài làm của m`, ch biết sai chỗ nào hi vọng mn chỉnh sửa giúp ^^


#include "stdio.h"
#include "conio.h"
#include "string.h"
void main()
{ char st[]="chuc";
char c;
int i,dem=0;
for (i=0;st[i]!='\0';i++)
{if (st[i]==c)
dem++;
}
printf("\nKi tu c xuat hien %d lan",dem);
getch();
}

beautifulsoul84hung
07-04-2011, 10:32 PM
Nguyên văn đề cho là: Nhập một xâu ký tự st và một kí tự c, đếm số lần xuất hiện của ký tự c trong xâu st

Đây là bài làm của m`, ch biết sai chỗ nào hi vọng mn chỉnh sửa giúp ^^


#include "stdio.h"
#include "conio.h"
#include "string.h"
void main()
{ char st[]="chuc";
char c;
int i,dem=0;
for (i=0;st[i]!='\0';i++)
{if (st[i]==c)
dem++;
}
printf("\nKi tu c xuat hien %d lan",dem);
getch();
}

bài này thì tất nhiên sai rồi bạn ơi.. c là cái j trong bài của bạn vậy?????
=> bạn nên suy nghĩ làm sao để khởi tạo cho c là kí tự nào.
theo mình thì c sẽ chạy từ a đến z. sau đó so sánh với từng st[i];
=>........................................

vitbau1412
07-04-2011, 10:36 PM
Bạn tham khảo:


#include<stdio.h>
#include<string.h>
void main()
{
char a[100];
char c;
printf("Moi nhap chuoi: ");
int n,dem=0;
gets(a);
n=strlen(a);
printf("Moi nhap ki tu: ");
scanf("%c",&c);
for (int i=0;i<n;i++)
if (a[i]==c)
dem++;
printf("Ki tu %c xuat hien %d lan",c,dem);
}

beautifulsoul84hung
07-04-2011, 10:47 PM
Nguyên văn đề cho là: Nhập một xâu ký tự st và một kí tự c, đếm số lần xuất hiện của ký tự c trong xâu st

Đây là bài làm của m`, ch biết sai chỗ nào hi vọng mn chỉnh sửa giúp ^^


#include "stdio.h"
#include "conio.h"
#include "string.h"
void main()
{ char st[]="chuc";
char c;
int i,dem=0;
for (i=0;st[i]!='\0';i++)
{if (st[i]==c)
dem++;
}
printf("\nKi tu c xuat hien %d lan",dem);
getch();
}

chết. mình nhầm. bài của mình là in ra các kí tự của chuỗi và số lần suất hiện của chúng^^!~
còn nếu nhập một ký tự từ bàn phím thì làm theo cách của vịt bầu là okY(:D

chel92
07-04-2011, 10:54 PM
bài này thì tất nhiên sai rồi bạn ơi.. c là cái j trong bài của bạn vậy?????
=> bạn nên suy nghĩ làm sao để khởi tạo cho c là kí tự nào.
theo mình thì c sẽ chạy từ a đến z. sau đó so sánh với từng st[i];
=>........................................

Mình mới học nên chắc ch hiểu rõ phần này lắm

Nếu m` khai báo thế kia thì "c" là biến chạy ah?


Bạn tham khảo:


#include<stdio.h>
#include<string.h>
void main()
{
char a[100];
char c;
printf("Moi nhap chuoi: ");
int n,dem=0;
gets(a);
n=strlen(a);
printf("Moi nhap ki tu: ");
scanf("%c",&c);
for (int i=0;i<n;i++)
if (a[i]==c)
dem++;
printf("Ki tu %c xuat hien %d lan",c,dem);
}



Tks bạn ^^

Nhưng chtr bạn viết thiếu thư viện conio.h + getch() nên vừa nhập là nó thoát ra luôn

beautifulsoul84hung
07-04-2011, 10:59 PM
khi bạn so sánh thì pải bik 2 kí tự đó là j.
bạn chỉ khai báo kiểu giá trị của c nhưng chưa cho nó giá trị là j
nếu bạn muốn xuất ra các kí tự có trong chuỗi và số lần suất hiện của chúng
thì bạn sẽ tạo một vòng for hoặc do while. và khởi tạo ban đầu cho c=a;
đến khi nào c>z; thì kết thúc.(để làm phần này bạn nên tìm hiểu phần ép kiểu dễ tính hơn^^!~)
=> in ra kí tự xuất hiện và số lần xuất hiện của nó(Y:DY)

chel92
07-04-2011, 11:01 PM
khi bạn so sánh thì pải bik 2 kí tự đó là j.
bạn chỉ khai báo kiểu giá trị của c nhưng chưa cho nó giá trị là j
nếu bạn muốn xuất ra các kí tự có trong chuỗi và số lần suất hiện của chúng
thì bạn sẽ tạo một vòng for hoặc do while. và khởi tạo ban đầu cho c=a;
đến khi nào c=z; thì kết thúc.
=> in ra kí tự xuất hiện và số lần xuất hiện của nó(Y:DY)

Oh m` hiểu r` ^^

Cảm ơn bạn nhiều http://www.360kpop.com/f/images/smilies/Tuzki26.gif

vitbau1412
07-04-2011, 11:08 PM
Nhưng chtr bạn viết thiếu thư viện conio.h + getch() nên vừa nhập là nó thoát ra luôn [/B][/COLOR]
bấm Ctrl + F5 chạy bình thường mà bạn,
còn bạn muốn dừng màn hình (khi chỉ bấm F5) thì bạn thêm conio.h w getch()

chel92
07-04-2011, 11:24 PM
bấm Ctrl + F5 chạy bình thường mà bạn,
còn bạn muốn dừng màn hình (khi chỉ bấm F5) thì bạn thêm conio.h w getch()

M` chạy chtr là Ctrl+F9

Cho m` hỏi thêm câu nữa

Q: Liệt kê các ký tự có mặt trong xâu cùng số lần xuất hiện của mỗi ký tự

ghost.love
07-04-2011, 11:29 PM
chết. mình nhầm. bài của mình là in ra các kí tự của chuỗi và số lần suất hiện của chúng^^!~
còn nếu nhập một ký tự từ bàn phím thì làm theo cách của vịt bầu là okY(:D
Code đây bạn


#include "stdio.h"
#include "conio.h"
#include "string.h"
int main()
{
int i,j,n[97];
char st[100];
fflush(stdin);
// nhap chuoi
printf("\n\t Nhap chuoi ki tu can kiem tra\n");
gets(st);
printf(" \n%s",st);
// in HOA cac ki tu
for (j=0;j<strlen(st);j++)
if (st[j]>=97 && st[j]<=122) st[j] = st[j]-32;
// xu li
for (i=0;i<97;i++) n[i]=0;
for (i=33;i<=97;i++)
{
for (j=0;j<strlen(st);j++)
if (st[j]==i) n[i]++;
}
// xuat
for (i=0;i<97;i++)
{
if (n[i]!=0)
printf("\n ky tu %c ----> %d",i,n[i]);
}
getch();
return(0);
}

chel92
07-04-2011, 11:48 PM
Code đây bạn


#include "stdio.h"
#include "conio.h"
#include "string.h"
int main()
{
int i,j,n[97];
char st[100];
fflush(stdin);
// nhap chuoi
printf("\n\t Nhap chuoi ki tu can kiem tra\n");
gets(st);
printf(" \n%s",st);
// in HOA cac ki tu
for (j=0;j<strlen(st);j++)
if (st[j]>=97 && st[j]<=122) st[j] = st[j]-32;
// xu li
for (i=0;i<97;i++) n[i]=0;
for (i=33;i<=97;i++)
{
for (j=0;j<strlen(st);j++)
if (st[j]==i) n[i]++;
}
// xuat
for (i=0;i<97;i++)
{
if (n[i]!=0)
printf("\n ky tu %c ----> %d",i,n[i]);
}
getch();
return(0);
}


Sr hơi phiền nhưng bạn giải thích bài làm của bạn từ đoạn xử lí đc k? ^^!

fflush(stdin) là gì vậy?

ghost.love
08-04-2011, 03:41 PM
Sr hơi phiền nhưng bạn giải thích bài làm của bạn từ đoạn xử lí đc k? ^^!

fflush(stdin) là gì vậy?

fllush(stdin)>>> Cái này để xóa các vùng nhớ nhập số liệu (câu lệnh nhập lấy từ đây)
//--------------------------------
ý tưởng của phần xử lý như thế này nha.
1 chọn 1 mảng để lưu tần số xuất hiện của kí tự. stt của mảng= mã asci của ký tự vd n[65] lưu tần số của kí tự A.
2 for duyệt mã asci của ký tự. nếu st[i]=j thì tăng n[j]. (với j là mã asci của ký tự đồng thời là stt của phần tử mẵng.
3. Khi xuất thì xuất tần số của ký tự có mã asci là chỉ số của mảng.
//--------------------------------------
cái này làm bằng passcal khá hay vì pascal hổ trợ n['a'..'Z'] chỉ số có thể là ký tự khi đó kích thước mảng lưu tần số nhỏ lại.
//-----------------=====
Nếu muốn tối ưu thì ở phần xử lí bạn chỉ cần khai báo mảng gồm 27 phần tử. khi tăng tần số thì n[j] bây giờ là n[j-32] chẳng hạn. khi xuất thì ngược lại

printf("kí tự %c có tần số %d",i+32,n[i]);

beautifulsoul84hung
08-04-2011, 03:54 PM
fllush(stdin)>>> Cái này để xóa các vùng nhớ nhập số liệu (câu lệnh nhập lấy từ đây)
//--------------------------------
ý tưởng của phần xử lý như thế này nha.
1 chọn 1 mảng để lưu tần số xuất hiện của kí tự. stt của mảng= mã asci của ký tự vd n[65] lưu tần số của kí tự A.
2 for duyệt mã asci của ký tự. nếu st[i]=j thì tăng n[j]. (với j là mã asci của ký tự đồng thời là stt của phần tử mẵng.
3. Khi xuất thì xuất tần số của ký tự có mã asci là chỉ số của mảng.
//--------------------------------------
cái này làm bằng passcal khá hay vì pascal hổ trợ n['a'..'Z'] chỉ số có thể là ký tự khi đó kích thước mảng lưu tần số nhỏ lại.
//-----------------=====
Nếu muốn tối ưu thì ở phần xử lí bạn chỉ cần khai báo mảng gồm 27 phần tử. khi tăng tần số thì n[j] bây giờ là n[j-32] chẳng hạn. khi xuất thì ngược lại

printf("kí tự %c có tần số %d",i+32,n[i]);

bạn có thể giải thích rõ cho mình về fflush(stdin) trong bài của bạn đc ko.....???
và giải thích khi nào thì sử dụng nó đc chứ
@chủ topic: trong c có fflush(stdin)<trong stdio.h> (ko nhầm là viết tắt của file flush: bạn tra từ điển để hiểu thêm về nghĩa của chúng.) kí tự xuống dòng trong lệnh nhập sẽ làm trôi phương thức của gets. nên ta pải thêm fflush(stdin) để tránh sự trôi dạt đó:D
còn trong c++ có cin.ignore(1); ^^!~

mdragon13
08-04-2011, 08:49 PM
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{ char st[]="chuc";
char c;
scanf ("%c",&c);;
int i,dem=0;
for (i=0;st[i]!='\0';i++)
{if (st[i]==c)
dem++;
}
printf("\nKi tu c xuat hien %d lan",dem);
getch();
}

sửa 1 cách dơn giản nè

chel92
09-04-2011, 03:19 PM
fllush(stdin)>>> Cái này để xóa các vùng nhớ nhập số liệu (câu lệnh nhập lấy từ đây)
//--------------------------------
ý tưởng của phần xử lý như thế này nha.
1 chọn 1 mảng để lưu tần số xuất hiện của kí tự. stt của mảng= mã asci của ký tự vd n[65] lưu tần số của kí tự A.
2 for duyệt mã asci của ký tự. nếu st[i]=j thì tăng n[j]. (với j là mã asci của ký tự đồng thời là stt của phần tử mẵng.
3. Khi xuất thì xuất tần số của ký tự có mã asci là chỉ số của mảng.
//--------------------------------------
cái này làm bằng passcal khá hay vì pascal hổ trợ n['a'..'Z'] chỉ số có thể là ký tự khi đó kích thước mảng lưu tần số nhỏ lại.
//-----------------=====
Nếu muốn tối ưu thì ở phần xử lí bạn chỉ cần khai báo mảng gồm 27 phần tử. khi tăng tần số thì n[j] bây giờ là n[j-32] chẳng hạn. khi xuất thì ngược lại

printf("kí tự %c có tần số %d",i+32,n[i]);


Ah sao bạn k để i chạy luôn từ 33 mà chạy từ 0 trước khi gán n[1]=0 vậy?


bạn có thể giải thích rõ cho mình về fflush(stdin) trong bài của bạn đc ko.....???
và giải thích khi nào thì sử dụng nó đc chứ
@chủ topic: trong c có fflush(stdin)<trong stdio.h> (ko nhầm là viết tắt của file flush: bạn tra từ điển để hiểu thêm về nghĩa của chúng.) kí tự xuống dòng trong lệnh nhập sẽ làm trôi phương thức của gets. nên ta pải thêm fflush(stdin) để tránh sự trôi dạt đó:D
còn trong c++ có cin.ignore(1); ^^!~

Tks bạn ^^




#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{ char st[]="chuc";
char c;
scanf ("%c",&c);;
int i,dem=0;
for (i=0;st[i]!='\0';i++)
{if (st[i]==c)
dem++;
}
printf("\nKi tu c xuat hien %d lan",dem);
getch();
}

sửa 1 cách dơn giản nè

tks, lúc đầu m` tưởng đúng nhưng hình như sai ở đoạn xuất đó bạn ^^!