Câu hỏi liên quan

0 Phiếu
5 Câu trả lời
0 Phiếu
4 Câu trả lời

Một lựa chọn tốt hơn để sử dụng một chuỗi dài các báo cáo "nếu/khác nếu" c?


0 Phiếu
Đã hỏi 25/5/2016 bởi description (550 điểm)
Ban đầu tôi đã sử dụng switch/trường hợp, nhưng điều kiện đã có là một value liên tục variable sẽ phù hợp với, so với một boolean của cho dù variable là trong phạm vi. Thay vào đó, tôi có này monstrosity:
    if ( data[y] > 91 ) {
       grades[9] = grades[9] + 1;
    }
    else if ( data[y] > 88 && data[y] < 92 ) {
        grades[8] = grades[8] + 1;
    }
    else if ( data[y] > 84 && data[y] < 89 ) {
        grades[7] = grades[7] + 1;
    }
    else if ( data[y] > 81 && data[y] < 85) {
        grades[6] = grades[6] + 1;
    }
    else if ( data[y] > 79 && data[y] < 82) {
        grades[5] = grades[5] + 1;
    }
    else if ( data[y] > 74 && data[y] < 79 ) {
        grades[4] = grades[4] + 1;
    }
    else if ( data[y] > 71 && data[y] < 75 ) {
        grades[3] = grades[3] + 1;
    }
    else if ( data[y] > 68 && data[y] < 72 ) {
        grades[2] = grades[2] + 1;
    }
    else if ( data[y] > 59 && data[y] < 69 ) {
        grades[1] = grades[1] + 1;
    else {
        //data[y] < 60:
        grades[0] = grades[0] + 1;
    }
có ai biết một cách đẹp hơn để xử lý này khối mã, vì ý tưởng chuyển đổi/trường hợp của tôi không thể áp dụng? Chắc chắn có là một cách tốt hơn để làm điều này.

5 Câu trả lời

0 Phiếu
Đã trả lời 04/6/2016 bởi LbhYou (510 điểm)
được bình chọn là câu trả lời hay nhất 06/6/2016 bởi theplus
 
Câu trả lời hay nhất
Bạn có thể sử dụng một bảng tra cứu đơn giản:
const unsigned int index[] = { 1, 1, /* ... */, 2, 2, /* ... */ };
++grades[data[y] < 60 ? 0 : index[data[y]]];
Đã bình luận 06/6/2016 bởi theplus (1,440 điểm)
1) sử dụng một chuyển đổi. 2) set variable 'gradeNum' trong khối switch và sau đó làm ' lớp [gradeNum] = lớp [gradeNum] + 1;' sau khi kết thúc của khối switch .
Đã bình luận 06/6/2016 bởi Voogd (150 điểm)
Nếu hiệu suất là một vấn đề mà bạn có thể thực sự kết hợp, nói rằng, câu trả lời của ooga với một tìm kiếm nhị phân, nghĩa là bắt đầu với các ' (dữ liệu [y] > = 80)' cắt giảm không gian tìm kiếm một nửa.
0 Phiếu
Đã trả lời 04/6/2016 bởi cre_87 (1,230 điểm)
C của tôi là rusty, để được trung thực, Tuy nhiên, bạn có thể xem xét nhìn vấn đề từ một góc độ khác nhau hơn so với một điều kiện. Bạn sẽ (tôi nghĩ) có thể cơ cấu lại của bạn data do đó bạn có thể thực hiện những quyết định logic mà không có (hoặc với ít hơn nhiều) conditionals. Tôi đang nghĩ đến một cái gì đó giống như một mảng 2 chiều hoặc một bảng tra cứu. Một cái gì đó dọc theo những dòng...
Đã bình luận 04/6/2016 bởi Svtodien (360 điểm)
Một switch hoàn toàn có thể áp dụng. Hoặc một bảng. Hoặc nếu bạn đang táo bạo và tài liệu nó, bạn có thể nhóm nhiều về điều này trong một phương trình duy nhất. ' gradeno = dữ liệu [y] / 3.5-25' được đóng.
Đã bình luận 05/6/2016 bởi Gur_3839_T (150 điểm)
Chắc chắn. Mã trong RPG. Nó thực hiện những gì là, trên thực tế, tuyên bố "đến từ".
Đã bình luận 05/6/2016 bởi hashvlach (170 điểm)
FWIW... Trong ví dụ của bạn code ở trên, bạn không cần điều kiện thứ hai trong vòng mỗi nếu khác.
Đã bình luận 06/6/2016 bởi vshave (610 điểm)
Tại sao có những con số đáng kể? Bạn có thể thay đổi (ví dụ) các số một chút và chỉ cần làm một cái gì đó giống như (ví dụ) ' các lớp [(dữ liệu [y] - 50) / 5] ++'?
0 Phiếu
Đã trả lời 04/6/2016 bởi dismissBitc (180 điểm)
Sử dụng một vòng lặp. Bạn cũng sẽ cần một loạt các value data tối thiểu cho mỗi lớp. Dưới đây là một số code chưa được kiểm tra như là một ví dụ:
for (int i = 9; i >= 0; i--)
{
    if (data[y] >= minDataValueForGrade[i])
    {
        grades[i]++;
        break;
    }
}
nó là ngắn, dễ đọc, và làm cho nó rất dễ dàng để thay đổi các giá trị tương ứng cho mỗi lớp.
Đã bình luận 05/6/2016 bởi Bs_1937 (700 điểm)
@ MooingDuck bạn chắc chắn rằng điều này formular là đúng?
Đã bình luận 06/6/2016 bởi allThe (320 điểm)
Những con số là quan trọng để dự án cá nhân của tôi bởi vì tôi phải kiểm đếm sự lây lan của data trong mỗi phạm vi; họ đang chỉ quan trọng với tôi trong trường hợp cụ thể này.
+1 Phiếu
Đã trả lời 04/6/2016 bởi Gun_7198 (630 điểm)
Nếu bạn muốn tránh các serie dài của if .. else về:
int arr[] = {60, 69, 72, 75, 79, 82, 85, 89, 92};
int i = 0;
while (i < sizeof arr/ sizeof *arr && data[y] < arr[i] && i++);
grades[i]++;
0 Phiếu
Đã trả lời 04/6/2016 bởi reneeSounds (200 điểm)
Nếu bạn muốn tránh các serie dài của if .. else về:
int arr[] = {60, 69, 72, 75, 79, 82, 85, 89, 92};
int i = 0;
while (i < sizeof arr/ sizeof *arr && data[y] < arr[i] && i++);
grades[i]++;
Đã bình luận 04/6/2016 bởi Except (200 điểm)
Nếu bạn chỉ đang viết GCC bạn có thể thực sự sử dụng ' 92 trường hợp... 100:...; phá vỡ; case 88... 91:...; Break;' vv.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...