Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 24 kết quả

Đề tài: Tách số ra khỏi chuỗi và tính tổng

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    18

    Mặc định Tách số ra khỏi chuỗi và tính tổng

    Bây giờ mình muốn nhập vào một chuỗi . Nhiêm vụ là phải tách các kí tự số ra khỏi chuỗi và tính tổng.
    VD: chuỗi nhập vào là: bhgjn655557777hgjhdgh68297
    thì kết quả in ra là: 6 5 7 8 2 9
    và tổng là 6+5+7+8+2+9
    Cảm ơn các bạn!

  2. #2
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Bác sài mã ascii để tìm số
    - -số có mã ascii từ 48 đến 57 tương ứng từ 0 đến 9 --> bác sử dụng if (kí tự >=48 && kí tự <=57) chuổi số ra <thêm vào> (kí tự)
    - - Gán kí tự kết thúc vào chuổi mã 0
    - - Bắt đầu lấy tổng =0
    cho vào for và tính Tổng+= từng phần tử của chuổi cộng lại (chuyển về số là kí tự - 48)
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  3. #3
    Ngày gia nhập
    07 2011
    Bài viết
    18

    Trích dẫn Nguyên bản được gửi bởi azurelonely Xem bài viết
    Bác sài mã ascii để tìm số
    - -số có mã ascii từ 48 đến 57 tương ứng từ 0 đến 9 --> bác sử dụng if (kí tự >=48 && kí tự <=57) chuổi số ra <thêm vào> (kí tự)
    - - Gán kí tự kết thúc vào chuổi mã 0
    - - Bắt đầu lấy tổng =0
    cho vào for và tính Tổng+= từng phần tử của chuổi cộng lại (chuyển về số là kí tự - 48)
    Mình cũng đã dùng mã ASCII nhưng mà chưa biết làm thế nào để mỗi số chỉ xuất hiện 1 lần.

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    38

    C++ Code:
    1. #include<iostream>
    2. #include<string>
    3.  
    4.  
    5.  
    6. using namespace std;
    7.  
    8.  
    9. /*
    10. */
    11.  
    12. void LocSo (string buff, bool *arraynr)
    13. {
    14.      int k;
    15.      for (int i=0;i<buff.length();i++)
    16.      {
    17.          k=(int)buff[i]-48;                         //chuyen ki tu char sang int
    18.          if(k>=0 && k<=10) arraynr[k]=true;  
    19.      }
    20. }
    21.  
    22.  
    23.  
    24. int TinhTong (bool *arraynr)
    25. {
    26.      int tong=0;
    27.      for (int i=0;i<10;i++)
    28.      {
    29.          if(arraynr[i]==true) tong+=i;
    30.      }
    31.      return tong;
    32. }
    33.  
    34. /*
    35. */
    36.  
    37.  
    38.  
    39. int main ()
    40. {
    41.      bool buff_1[10];                            // so tu 1-9
    42.      string buff_2;
    43.      cout<<"Nhap input string:"<<endl;
    44.      getline(cin,buff_2);
    45.      LocSo(buff_2,buff_1);
    46.      cout<<TinhTong(buff_1)<<endl;
    47. }
    Bạn thao khảo bài mình xem.

  5. #5
    Ngày gia nhập
    04 2010
    Bài viết
    1,535

    Giải thuật: bài này có hai phần

    Phần 1: đọc chuỗi từ đầu đến cuối, gặp ký tự >= '0' và <= '9' thì biết đó là ký tự số

    Phần 2: in và cộng các kt số, nhưng mỗi kt chỉ được làm 1 lần
    Vì số chỉ có từ 0 đến 9 nên ta tạo một mảng 10 pt, mỗi phần tử cho biết kt tương ứng có được tính hay chưa.
    Gặp Ký tự số nào đã tính thì bỏ qua, chưa thì in ra, cộng vào tổng và đánh dấu đã sử lý.

    C Code:
    1. // giả sử ta đã có char *chuoi
    2.  
    3. int kts[10] = { 0 };
    4.  
    5. char kt;
    6. int tongkt = 0;
    7. int i = -1; // khởi đầu bằng số dưới 0 vì ta sẽ dùng thuật toán tăng tiền tố
    8. while (kt = chuoi[++i]) // duyệt từ đâu đến cuối chuỗi
    9. {
    10.    if (kt >= '0' && kt <= '9') // đây là kkt số
    11.    {
    12.       kt -= '0'; // lấy trị số của kt
    13.       if (!kts[kt]) // ký tự này chưa sử lý
    14.       {
    15.          printf("%d ", (int)kt); // in ra, chú ý phần ép kiểu về int
    16.          tongkt += kt; // tính tổng
    17.          kts[kt] = 1; // đánh dấu đã sử lý
    18.       }
    19.    }
    20. }
    21. printf("\nTổng số ký tự số là: %d\n", tongkt);

  6. #6
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Mặc định Tách số ra khỏi chuỗi và tính tổng

    Trích dẫn Nguyên bản được gửi bởi shiftac Xem bài viết
    Mình cũng đã dùng mã ASCII nhưng mà chưa biết làm thế nào để mỗi số chỉ xuất hiện 1 lần.
    Gữi bác cái này...bác test thử
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. short int Con(const int arr[],short unsigned int p,int N)
    4. {
    5.      for (short unsigned int i=0;i<p;i++) if (arr[i]==N) return 0;
    6.      return 1;
    7. }
    8. short int GetArrOfNum(int arr[],const char str[])
    9. {
    10.      short unsigned int n=0;
    11.      for (short unsigned int i=0;str[i];i++)
    12.           if (str[i]>=48 && str[i]<=57 && Con(arr,n,str[i]-48)) arr[n++]=str[i]-48;
    13.      return n;
    14. }
    15. int main(void)
    16. {
    17.      char s[20]="asd45qw591";
    18.      int a[20],n;
    19.      n=GetArrOfNum(a,s);
    20.      for(short unsigned int i=0;i<n;i++) printf("%d",a[i]);
    21.      getch();
    22.      return 0;
    23. }
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  7. #7
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Giải thuật: bài này có hai phần

    Phần 1: đọc chuỗi từ đầu đến cuối, gặp ký tự >= '0' và <= '9' thì biết đó là ký tự số

    Phần 2: in và cộng các kt số, nhưng mỗi kt chỉ được làm 1 lần
    Vì số chỉ có từ 0 đến 9 nên ta tạo một mảng 10 pt, mỗi phần tử cho biết kt tương ứng có được tính hay chưa.
    Gặp Ký tự số nào đã tính thì bỏ qua, chưa thì in ra, cộng vào tổng và đánh dấu đã sử lý.

    C Code:
    1. // giả sử ta đã có char *chuoi
    2.  
    3. int kts[10] = { 0 };
    4.  
    5. char kt;
    6. int tongkt = 0;
    7. int i = -1; // khởi đầu bằng số dưới 0 vì ta sẽ dùng thuật toán tăng tiền tố
    8. while (kt = chuoi[++i]) // duyệt từ đâu đến cuối chuỗi
    9. {
    10.    if (kt >= '0' && kt <= '9') // đây là kkt số
    11.    {
    12.       kt -= '0'; // lấy trị số của kt
    13.       if (!kts[kt]) // ký tự này chưa sử lý
    14.       {
    15.          printf("%d ", (int)kt); // in ra, chú ý phần ép kiểu về int
    16.          tongkt += kt; // tính tổng
    17.          kts[kt] = 1; // đánh dấu đã sử lý
    18.       }
    19.    }
    20. }
    21. printf("\nTổng số ký tự số là: %d\n", tongkt);
    thuật toán của bác hay thật...tớ phải nghĩ lâu thật lâu mới hiểu
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

  8. #8
    Ngày gia nhập
    07 2011
    Bài viết
    1

    Mặc định Review

    Em thấy sử dụng hàm này nhanh và gọn hơn:

    Code:
    void t1(char st[]){
         int i,l,tg1=0;
         l=strlen(st);
         for(i=0;i<=l;i++){
                           if(st[i]>='0' && st[i]<='9'){
                           tg1=tg1+(st[i]-48);
                           printf("\t %c",st[i]);
                                                        }
                           }
         printf("\n Tong cac so trong chuoi: %d",tg1);
         }
    Đã được chỉnh sửa lần cuối bởi mettadaica : 21-07-2011 lúc 10:28 PM.

  9. #9
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Trích dẫn Nguyên bản được gửi bởi mettadaica Xem bài viết
    Em thấy sử dụng hàm này nhanh và gọn hơn:

    Code:
    void t1(char st[]){
         int i,l,tg1=0;
         l=strlen(st);
         for(i=0;i<=l;i++){
                           if(st[i]>='0' && st[i]<='9'){
                           tg1=tg1+(st[i]-48);
                           printf("\t %c",st[i]);
                                                        }
                           }
         printf("\n Tong cac so trong chuoi: %d",tg1);
         }
    nhanh, gọn, không đọc kỹ đề, sai.

  10. #10
    Ngày gia nhập
    12 2010
    Nơi ở
    Cần thơ
    Bài viết
    273

    Trích dẫn Nguyên bản được gửi bởi mettadaica Xem bài viết
    Em thấy sử dụng hàm này nhanh và gọn hơn:

    Code:
    void t1(char st[]){
         int i,l,tg1=0;
         l=strlen(st);
         for(i=0;i<=l;i++){
                           if(st[i]>='0' && st[i]<='9'){
                           tg1=tg1+(st[i]-48);
                           printf("\t %c",st[i]);
                                                        }
                           }
         printf("\n Tong cac so trong chuoi: %d",tg1);
         }
    ^^ bác quên lọc số trùng rồi
    Ai bất tài, tôi nhìn hoài chẳng thấy,
    Đi khắp phòng tôi lấy 1 tấm gương,
    Khẽ đặt lên một góc phía bức tường,
    Nhìn vào đó, tôi tận tường kẻ đó.

Các đề tài tương tự

  1. Bài tập C++ Cách để so sánh 2 chuỗi kí tự giữa chuỗi nhập từ phím và chuỗi từ file xem có giống nhau không?
    Gửi bởi davilson18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 09-06-2012, 09:47 AM
  2. Lập trình C Thay thế chuỗi s1 trong chuỗi s bằng chuỗi s
    Gửi bởi duytue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-09-2011, 04:16 PM
  3. thay thế chuỗi con thứ i trong chuỗi mẹ bằng 1 chuỗi khác
    Gửi bởi nhat1811 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 06-08-2011, 08:25 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. xem một từ trong chuỗi là một chuỗi con, sắp xếp các chuỗi con theo thứ tự tăng dần
    Gửi bởi qpkdct1101 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-01-2011, 08:22 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn