Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Xin góp ý code hợp lý hơn - hàm - C program.

  1. #1
    Ngày gia nhập
    03 2021
    Bài viết
    9

    Talking Xin góp ý code hợp lý hơn - hàm - C program.

    Có đôi dòng code hôm nay lọ mọ chút thời gian code ra được. Anh em có thể giúp mình sửa được ko? Đối với người đã kiếm ra tiền bằng nghề gõ phím thì anh em thấy mình nên sửa như nào? Mong ngóng ai thấy sai cứ chửi mình nhiệt lên. Tiếng anh mình hơi kém nên ko rõ đặt tên hàm có chính xác ko nữa. Ae nào rảnh, sửa đc giúp mình cái gì hay cái đó. ĐA TẠ
    Code:
    #include <stdio.h>
    #include <stdbool.h>
    #include <math.h>
    #include <stdlib.h>
    
    const int max_a=100;
    
    void input(int a[], int n){ /* Hàm nhập mảng 1 chiều */
    	for(int i=0;i<n;i++){
    		printf("a[%d] = ", i);
    		scanf(" %d", &a[i]);
    	}
    }
    
    void output(int a[], int n){ /* Hàm xuất mảng 1 chiều */
    	for(int i=0;i<n;i++)
    		printf("\n\ta[%d] = %d", i, a[i]);
    }
    
    void swap(int *a, int *b){ /* Hàm đổi vị trí a[j] , a[j+1]của mảng 1 chiều */
    	int temp=*a; *a=*b; *b=temp; /* Đoạn này đã đc @MHoang hỗ trợ */
    }
    
    void bubblesort(int a[], int n){ /* Sắp xết tăng dần theo bubble */
    	int i,j;
    	bool test=false;
    	for(i=0;i<n-1;i++){
    		for(j=0;j<n-i-1;j++)
    			if(a[j]>a[j+1]){
    				swap(a[j],a[j+1]);
    				test=true;
    			}
    		if(test==false) return;
    	}
    }
    
    bool odd_check(int x){ /* check số lẻ */
    	if(x%2==0) return false;
    	return true;
    }
    
    int odd_sum_avg_at_even_pos(int a[], int n){ /*tính tổng số lẻ ở vị trí chẵn, đoạn này mình biết cách làm bằng while nhưng thích for hơn, ko hiểu sao có cảm tình với for */
    	int sum=0;
    	for(int i=0;i<n;){
    		if(odd_check(a[i])==true) sum+=a[i]; i+=2;
    	}
    	return sum;
    }
    
    int max_find(int a[], int n){  /* tìm giá trị lớn nhất trong mảng 1 chiều */
    	int max=a[0];
    	for(int i=1;i<n;i++){
    		if(a[i]>max) max=a[i];
    	}
    	return max;
    }
    
    int min_find(int a[], int n){  /* tìm giá trị nhỏ nhất trong mảng 1 chiều */
    	int min=a[0];
    	for(int i=1;i<n;i++)
    		if(a[i]<min) min=a[i];
    	return min;
    }
    
    void min_pos_find(int a[], int n){ /* tìm vị trí của các số nhỏ nhất */
    	int min=min_find(a,n);
    	printf("\n\n\tMang a[n] co min = %d tai vi tri :", min);
    	for(int i=0;i<n;i++)
    		if(a[i]==min) printf("\ta[%d]", i);
    }
    
    bool square_num_check(int x){ /* Kiểm tra số chính phuơng */
    	int temp = sqrt(x);
    	return temp * temp == x; /* Đoạn này đã đc @Khoaph hỗ trợ */
    }
    
    int square_num_count(int a[], int n){ /* Đếm số lượng số chính phương */
    	int count=0;
    	for(int i=0;i<n;i++){
    		if(square_num_check(a[i])==true) count++;
    	}
    	return count;
    }
    
    bool prime_num_check(int x){ /* Kiểm tra số nguyên tố */
    	if(x<2) return false;
    	int count=0;
    	for(int i=2;i<=sqrt(x);i++) /* Đoạn này đã đc @Khoaph hỗ trợ */
    		if(x%i==0) count++;
    	if(count==1) return true;
    		else return false;
    }
    
    void output_prime_num(int a[], int n){ /* Xuất số nguyên tố trong mảng */
    	printf("\nCac so nguyen to co trong mang la: ");
    	int count=0;
    	for(int i=0;i<n;i++){
    		if(prime_num_check(a[i])==true){
    			printf("%d     ", a[i]); count++;
    		}
    	}
    	if(count==0) printf("Khong co so nguyen to");
    }
    
    void delete_negative(int a[], int &n){ /* Xóa các số âm khỏi mảng */
    	for(int i=0;i<n;i++){
    		if(a[i]<0){
    			for(int j=i;j<n-1;j++){
    				a[j]=a[j+1];
    			}
    			n--; i--;
    		}
    	}
    }
    
    void replace_negative(int a[], int n){ /* Thay thế số âm = 0 tại mảng */
    	for(int i=0;i<n;i++)
    		if(a[i]<0) a[i]=0;
    }
    
    int main(){
    	int a[max_a], n, x;
    	printf("Hay nhap so phan tu mang n = ");
    	scanf(" %d", &n);
    	input(a,n);
    	do{
    	system("cls");
    	printf("Hay chon cong viec: ");
    	printf("\n1. Tinh trung binh cong cac so le o vi tri chan");
    	printf("\n2. Tim so lon nhat trong mang vua nhap");
    	printf("\n3. Tim vi tri cac so nho nhat trong mang");
    	printf("\n4. Dem cac so chinh phuong trong mang");
    	printf("\n5. Hien thi cac so nguyen to co trong mang len man hinh");
    	printf("\n6. Thay the cac gia tri am trong mang = 0");
    	printf("\n7. Xoa cac phan tu am trong mang");
    	printf("\n8. Sap xep mang theo thu tu tang dan\n");
    	scanf(" %d", &x);
    	}while(x<1 || x>8);
    	switch(x){
    		case 1: system("cls"); printf("Trung binh cong cac so le o vi tri chan = %d", odd_sum_avg_at_even_pos(a,n));
    				break;
    		case 2: system("cls"); printf("So lon nhat trong mang vua nhap = %d", max_find(a,n)); break;
    		case 3: system("cls"); min_pos_find(a,n); break;
    		case 4: system("cls"); printf("Dem cac so chinh phuong trong mang = %d", square_num_count(a,n)); break;
    		case 5: system("cls"); output_prime_num(a,n); break;
    		case 6: system("cls"); replace_negative(a,n); output(a,n); break;
    		case 7: system("cls"); delete_negative(a,n); output(a,n); break;
    		default: bubblesort(a,n); output(a,n);
    	}
    	return 0;
    }
    Đã được chỉnh sửa lần cuối bởi XeOmDoiNghe : 12-08-2021 lúc 09:34 PM.

  2. #2
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    611

    Chưa đọc hết code, nhưng thấy chỗ này cần sửa để tối ưu hơn
    C Code:
    1. bool prime_num_check(int x){ /* Kiểm tra số nguyên tố */
    2.     if(x<2) return false;
    3.     for(int i=2;i<=sqrt(x);i++)
    4.         if(x%i==0) return false;
    5.     return true;
    6. }

  3. #3
    Ngày gia nhập
    03 2021
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Chưa đọc hết code, nhưng thấy chỗ này cần sửa để tối ưu hơn
    C Code:
    1. bool prime_num_check(int x){ /* Kiểm tra số nguyên tố */
    2.     if(x<2) return false;
    3.     for(int i=2;i<=sqrt(x);i++)
    4.         if(x%i==0) return false;
    5.     return true;
    6. }
    cảm ơn bác nhắc nhé, viết dài quá quên mất đoạn này

  4. #4
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    611

    C Code:
    1. bool square_num_check(int x){ /* Kiểm tra số chính phuơng */
    2.     float temp = sqrt(x);
    3.     if(temp==(int)temp) return true;
    4.     return false;
    5. }
    Code trên không ổn
    C Code:
    1. #include <limits.h>
    2. #include <stdio.h>
    3. #include <math.h>
    4. bool square_num_check(int x){ /* Kiểm tra số chính phuơng */
    5.     float temp = sqrt(x);
    6.     if(temp==(int)temp) return true;
    7.     return false;
    8. }
    9. int main(int argc, char *argv[])
    10. {
    11.     int imax = INT_MAX;
    12.     int num = sqrt(imax);
    13.     int u = num * num;
    14.     if (square_num_check(u + 1)) {
    15.         printf("%ld la so chinh phuong\n", u + 1);
    16.     }
    17.     else {
    18.         printf("%ld khong la so chinh phuong\n", u + 1);
    19.     }
    20.     if (square_num_check(u - 1)) {
    21.         printf("%ld la so chinh phuong \n", u - 1);
    22.     }
    23.     else {
    24.         printf("%ld khong la so chinh phuong\n", u - 1);
    25.     }
    26. }
    27. /*kết quả là
    28. 2147395601 la so chinh phuong
    29. 2147395599 la so chinh phuong
    30.  
    31. [Program finished]
    32. */
    Nên sửa lại là
    C Code:
    1. bool square_num_check(int x){ /* Kiểm tra số chính phuơng */
    2.     int temp = sqrt(x);
    3.         return temp * temp == x;
    4. }

  5. #5
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    997

    Về cú pháp, đây không hoàn toàn là mã C như tiêu đề của bạn, điển hình là hàm swap.

    Các phần khác chưa xem kỹ.


    ...

  6. #6
    Ngày gia nhập
    03 2021
    Bài viết
    9

    Mặc định Xin góp ý code hợp lý hơn - hàm - C program.

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    C Code:
    1. bool square_num_check(int x){ /* Kiểm tra số chính phuơng */
    2.     float temp = sqrt(x);
    3.     if(temp==(int)temp) return true;
    4.     return false;
    5. }
    Code trên không ổn
    C Code:
    1. #include <limits.h>
    2. #include <stdio.h>
    3. #include <math.h>
    4. bool square_num_check(int x){ /* Kiểm tra số chính phuơng */
    5.     float temp = sqrt(x);
    6.     if(temp==(int)temp) return true;
    7.     return false;
    8. }
    9. int main(int argc, char *argv[])
    10. {
    11.     int imax = INT_MAX;
    12.     int num = sqrt(imax);
    13.     int u = num * num;
    14.     if (square_num_check(u + 1)) {
    15.         printf("%ld la so chinh phuong\n", u + 1);
    16.     }
    17.     else {
    18.         printf("%ld khong la so chinh phuong\n", u + 1);
    19.     }
    20.     if (square_num_check(u - 1)) {
    21.         printf("%ld la so chinh phuong \n", u - 1);
    22.     }
    23.     else {
    24.         printf("%ld khong la so chinh phuong\n", u - 1);
    25.     }
    26. }
    27. /*kết quả là
    28. 2147395601 la so chinh phuong
    29. 2147395599 la so chinh phuong
    30.  
    31. [Program finished]
    32. */
    Nên sửa lại là
    C Code:
    1. bool square_num_check(int x){ /* Kiểm tra số chính phuơng */
    2.     int temp = sqrt(x);
    3.         return temp * temp == x;
    4. }
    bạn phân tích giúp đoạn code test này đc ko ? phần bạn sửa thì em hiểu rồi. Nhưng tại sao bác lại nghĩ ra cái phép thử kia, nó dựa trên cái gì ý để sau này em k lặp lại.

    - - - Nội dung đã được cập nhật ngày 12-08-2021 lúc 08:18 PM - - -

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Về cú pháp, đây không hoàn toàn là mã C như tiêu đề của bạn, điển hình là hàm swap.

    Các phần khác chưa xem kỹ.


    ...
    bác cho hỏi thế ở C thì thường làm ntn với. Với cả cái swap em xài thì nó thường dùng ở ngôn ngữ nào hơn

  7. #7
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    997

    Nếu theo C, tôi sẽ viết :

    C Code:
    1. void swap(int * a, int * b){ /* Hàm đổi vị trí a[j] , a[j+1]của mảng 1 chiều */
    2.     int temp=*a; *a=*b; *b=temp;
    3. // Nếu chuẩn chỉ hơn
    4. // *a = (*a) ^ (*b);
    5. // *b = (*a) ^ (*b);
    6. // *a = (*a) ^ (*b);
    7. }

  8. #8
    Ngày gia nhập
    03 2021
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Nếu theo C, tôi sẽ viết :

    C Code:
    1. void swap(int * a, int * b){ /* Hàm đổi vị trí a[j] , a[j+1]của mảng 1 chiều */
    2.     int temp=*a; *a=*b; *b=temp;
    3. // Nếu chuẩn chỉ hơn
    4. // *a = (*a) ^ (*b);
    5. // *b = (*a) ^ (*b);
    6. // *a = (*a) ^ (*b);
    7. }
    đã hiểu bác, vậy cái & (tham chiếu) đó là hay xài trên C++ đúng k bác ? Vừa ngồi google xong
    À mà bác có thể giải thích giúp phần dưới đc ko :( chưa học tới con trỏ bác ạ

  9. #9
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    611

    Chú ý biến u = num * num là số chính phương nên u - 1 và u + 1 không thể là số chính phương, và code của bạn đã cho kết quả sai cho trường hợp u được tính như trên
    Ta biết kiểu float trong máy tính không thể thể hiện được hết tất cả các số thực, và khi hàm sqrt được tính, nếu kết quả không thể biểu diễn bằng float nó sẽ làm tròn đến số float gần nhất
    Trong code test của mình sqrt(u - 1) và sqrt(u + 1) đã được làm tròn float đến sqrt(u) bằng num
    Còn tại sao mình chọn imax, num, u như trên là vì mình muốn có u chính phương thật lớn, code của bạn sai với số lớn, vì khi u càng lớn thì hiệu sqrt(u) - sqrt(u - 1) càng nhỏ nên khả năng làm tròn float càng lớn. Code test đã chạy đúng như mình nghĩ

  10. #10
    Ngày gia nhập
    03 2021
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Chú ý biến u = num * num là số chính phương nên u - 1 và u + 1 không thể là số chính phương, và code của bạn đã cho kết quả sai cho trường hợp u được tính như trên
    Ta biết kiểu float trong máy tính không thể thể hiện được hết tất cả các số thực, và khi hàm sqrt được tính, nếu kết quả không thể biểu diễn bằng float nó sẽ làm tròn đến số float gần nhất
    Trong code test của mình sqrt(u - 1) và sqrt(u + 1) đã được làm tròn float đến sqrt(u) bằng num
    Còn tại sao mình chọn imax, num, u như trên là vì mình muốn có u chính phương thật lớn, code của bạn sai với số lớn, vì khi u càng lớn thì hiệu sqrt(u) - sqrt(u - 1) càng nhỏ nên khả năng làm tròn float càng lớn. Code test đã chạy đúng như mình nghĩ
    đã thông, thks bác. Rút ra bài học:

    cái gì để tính gọn đc thì tính gọn khi ko cần chính xác kết quả thì để nguyên biểu thức để tránh sai số khi số nhỏ. Cần so sánh thì ưu tiên cái nào so sánh dễ, ở đây của bác là ép về int so sánh gọn hơn hẳn so với float.
    Liệu có thể pm bác hỏi về 1 câu trong bài này đc ko ?
    Đã được chỉnh sửa lần cuối bởi XeOmDoiNghe : 13-08-2021 lúc 04:23 PM.

Tags của đề tài này

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