JavaRush /Blog Java /Random-VI /Harvard CS50: Bài tập Tuần 1 (Bài 3 và 4)
Masha
Mức độ

Harvard CS50: Bài tập Tuần 1 (Bài 3 và 4)

Xuất bản trong nhóm
Harvard CS50: Bài tập tuần 1 (Bài 3 và 4) - 1Các bạn ơi, các bạn có thể thu thập những thông tin lý thuyết cơ bản từ các ghi chú của buổi hội thảo . Ở đó, ngoài những kiến ​​​​thức cơ bản về C, nó còn cho biết cách kết nối với IDE CS50 đám mây đặc biệt (điều này phải được thực hiện để chạy và kiểm tra các tác vụ) đồng thời mô tả các cấu trúc ngôn ngữ và lệnh cơ bản cần thiết của Linux. Nếu tài liệu trình bày trong bài giảng và ghi chú về C là không đủ đối với bạn, hãy chuyển sang các nguồn khác. Ví dụ, những người được liệt kê ở cuối bài viết này. Trong chủ đề “ Tài liệu bổ sung
  • Mục tiêu tuần đầu tiên
  • IDE CS50
  • Cập nhật dòng lệnh và bàn làm việc
  • Làm việc trong IDE
  • Chào c!
  • Lỗi?
  • Kiểm tra xác nhận: kiểm tra check50
  • Khái niệm cơ bản về C: So sánh với Scratch
  • Các kiểu dữ liệu cơ bản trong C
  • Thư viện C
  • Xin chào C lần nữa: phân tích cú pháp của các chương trình đơn giản nhất
  • Tìm hiểu thêm một chút về I/O trong C
Tài liệu trong chủ đề này:
  • Nhập dữ liệu được xác thực: các chức năng đặc biệt của thư viện cs50.h
  • Nhiệm vụ 1. Tính toán thông minh lượng nước tiêu thụ
  • Nhiệm vụ 2. Mario ở cùng chúng tôi!
  • Nhiệm vụ 3. Đã đến lúc thay đổi
  • Cách xác thực mã của bạn và nhận điểm
  • Tài nguyên mã
  • văn học bổ sung

Nhập dữ liệu được xác thực: các chức năng đặc biệt của thư viện cs50.h

Để làm cho khóa học này thuận tiện hơn, chúng tôi đã phát triển một thư viện CS50 đặc biệt, đặc biệt có các chức năng rất hữu ích để xử lý dữ liệu do người dùng nhập.
  • GetString()đọc chuỗi do người dùng nhập vào;

  • GetInt()đọc chuỗi do người dùng nhập và kiểm tra xem nó có chứa số nguyên hay không;

  • GetFloat()đọc chuỗi do người dùng nhập và kiểm tra xem nó có chứa số dấu phẩy động hay không;

  • GetLongLong()đọc chuỗi được người dùng nhập vào và kiểm tra xem nó có chứa số thực dài hay không.

Nhiệm vụ 1. Tính toán thông minh lượng nước tiêu thụ

Harvard CS50: Bài tập tuần 1 (Bài 3 và 4) - 2Điều này rất hợp lý: bạn tắm càng lâu thì càng tốn nhiều nước cho quá trình này. Chúng ta hãy tìm ra bao nhiêu? Ngay cả khi vòi sen của bạn hầu như không mở, vẫn có khoảng 6 lít nước chảy ra khỏi vòi mỗi phút. Và đây là 12 chai nước mà bạn mang theo bên mình để uống. Thông thường một người tắm trong khoảng 10 phút, tổng cộng để rửa bạn cần 120 chai nửa lít. Khá nhiều! Tạo một tệp water.ctrong ~/workspace/pset1. Chương trình sẽ đếm xem có bao nhiêu chai nước được sử dụng để tắm tùy theo thời gian. Đó là:
  1. Chương trình hỏi người dùng số phút tắm
  2. Người dùng nhập số nguyên dương
  3. Chương trình hiển thị số chai người dùng đã sử dụng.
username:~/workspace/pset1 $ ./water
minutes: 10
bottles: 120
Để đơn giản, lần này chúng ta sẽ giả sử người dùng luôn nhập đúng số phút, tức là chúng ta không kiểm tra xem số được nhập có phải là số dương và số nguyên hay không. Sau này chúng ta sẽ học cách viết séc, nhưng bây giờ thế là đủ. Để kiểm tra xem chương trình có chạy chính xác hay không bằng cách sử dụng, check50,bạn cần nhập dòng sau vào terminal:
check50 2015.fall.pset1.water water.c
Và nếu bạn muốn xem chương trình waterdo nhân viên khóa học viết hoạt động như thế nào, hãy chạy lệnh sau:
~cs50/pset1/water

Nhiệm vụ 2. Mario ở cùng chúng tôi!

Harvard CS50: Bài tập tuần 1 (Bài 3 và 4) - 3Bạn có biết thợ sửa ống nước nổi tiếng nhất thế giới không? Với sự giúp đỡ của Nintendo, anh chàng hư cấu có bộ ria mép và hơi bụ bẫm đội chiếc mũ đỏ đã trở thành anh hùng trong lòng nhiều thế hệ game thủ. Nếu bạn không biết chúng ta đang nói về ai thì đây là đường dẫn đến trò chơi kinh điển năm 1985 : tin tôi đi, nó vẫn hay và đáng để thử! Bạn cũng có thể tìm thấy phiên bản Super Mario cổ điển dành cho điện thoại thông minh hoặc trình giả lập ngoại tuyến. Chúng tôi cần tất cả những thứ này để phát triển chung, thật không may, đây vẫn chưa phải là một nhiệm vụ;). Và nhiệm vụ là thế này. Khi kết thúc cấp độ Mario đầu tiên, mọi người chơi đều thấy nửa kim tự tháp này: Tạo một tệp mario.ctrong tệp ~/workspace/pset1. Chương trình của chúng tôi sẽ vẽ một nửa kim tự tháp tương tự như hình bạn nhìn thấy, nhưng trực tiếp trong bảng điều khiển, không có đồ họa: mỗi khối sẽ bao gồm một biểu tượng băm (#). Ngay cả khi bạn chưa tìm ra cách thực hiện, hãy tin tôi: việc đó rất dễ dàng. Để làm cho bài toán trở nên thú vị hơn, chúng ta hãy thêm vào đó khả năng đặt chiều cao của nửa kim tự tháp bằng cách sử dụng số nguyên không âm từ 0 đến 23. Chiều cao của kim tự tháp trong hình được coi là ở vị trí cao nhất, tức là bằng 8. Nếu người dùng nhập sai số, bạn cần yêu cầu họ nhập lại một lần. Sau đó tạo (sử dụng printf một kim tự tháp). Cẩn thận căn chỉnh góc dưới bên trái của nửa kim tự tháp với cạnh trái của cửa sổ terminal, như trong ví dụ bên dưới. Phần văn bản được gạch chân là nội dung người dùng tự nhập vào.
username:~/workspace/pset1 $ ./mario

height: 8
       ##
      ###
     ####
    #####
   ######
  #######
 ########
#########
Lưu ý rằng hai cột ngoài cùng bên phải có cùng chiều cao. Việc tạo ra các đường ống, đám mây và bản thân Mario vẫn chưa đáng =). Ít nhất là cho nhiệm vụ này. Nếu người dùng nhập dữ liệu không chính xác (không nhập số hoặc nhập số nhỏ hơn một hoặc lớn hơn 23), chương trình sẽ yêu cầu người dùng nhập lại dữ liệu, như trong ví dụ bên dưới, trong đó văn bản được gạch chân là gì người dùng nhập từ bàn phím. Để đọc chuỗi đã nhập, hãy sử dụng GetInt. Nó có thể giúp kiểm tra đầu vào không chính xác, nhưng không phải trong mọi trường hợp.
username:~/workspace/pset1 $ ./mario
Height: -2
Height: -1
Height: foo
Retry: bar
Retry: 1
##
Để biên dịch chương trình, nhập dòng trong terminal:
make mario
hoặc một phiên bản minh bạch hơn nhưng dài hơn:
clang -o mario mario.c -lcs50
Sau đó chạy chương trình để thực hiện:
./mario
Nếu bạn muốn kiểm tra xem chương trình có chạy đúng hay không, hãy chạy check50:
check50 2015.fall.pset1.mario mario.c
Và nếu bạn muốn chơi với phiên bản mario của trợ lý khóa học, hãy nhập dòng sau:
~cs50/pset1/mario

Nhiệm vụ 3. Đã đến lúc thay đổi

Harvard CS50: Bài tập tuần 1 (Bài 3 và 4) - 4Ở vĩ độ của chúng tôi, chúng tôi chưa thấy điều này, nhưng có vẻ như ở Hoa Kỳ, có một món đồ chơi như vậy, như trong ảnh: các hình trụ được thiết kế cho các đồng xu có đường kính (và mệnh giá) khác nhau, chúng được giải phóng bằng cơ chế lò xo , và bản thân thiết bị có thể được gắn vào thắt lưng của nhân viên thu ngân trẻ em. Tuy nhiên, điều gì sẽ xảy ra nếu ai đó trả cho nhân viên thu ngân một hóa đơn lớn? Hãy tưởng tượng xem việc đếm tiền lẻ sẽ gặp bao nhiêu rắc rối. Để giảm thiểu số lượng xu được phát hành, bạn có thể sử dụng cái gọi là thuật toán “tham lam”. Họ, theo định nghĩa của Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST), luôn tìm ra giải pháp tối ưu ở mỗi bước giải quyết một vấn đề, cho rằng giải pháp cuối cùng (có được từ tổng thể các bước đó) cũng sẽ tối ưu. Nó có nghĩa là gì? Hãy tưởng tượng rằng một nhân viên thu ngân nợ một khách hàng 41 xu tiền lẻ và anh ta có những cuộn tiền xu trên thắt lưng để đổi các mệnh giá 25, 10, 5 và 1 xu. Một nhân viên thu ngân được hướng dẫn bởi thuật toán “tham lam” sẽ ngay lập tức muốn đưa ra số tiền tối đa ngay từ bước đầu tiên. Tại thời điểm này, giải pháp tối ưu hoặc tốt nhất sẽ là đưa ra 25 xu. 41-25 = 16,16 xu còn lại để thanh toán. Rõ ràng, 25 pence là quá nhiều nên còn lại 10. 16-10 = 6. Bây giờ chúng ta phát 5 pence theo nguyên tắc tương tự, rồi 1. Như vậy, người mua sẽ chỉ nhận được 4 đồng xu có mệnh giá 25, 10 , 5 và 1 xu. Hóa ra, các hướng dẫn phát hành tiền từng bước “tham lam” là tối ưu không chỉ cho trường hợp này mà còn cho các mệnh giá tiền tệ của Hoa Kỳ (và cả Liên minh Châu Âu). Nghĩa là, nếu nhân viên thu ngân có đủ tiền của bất kỳ mệnh giá nào, thuật toán sẽ hoạt động tốt nhất, tức là nó sẽ phát hành số lượng xu tối thiểu trong tất cả các trường hợp có thể xảy ra. Vậy số xu tối thiểu chúng ta cần để đổi lại là bao nhiêu? Đây là nhiệm vụ thứ ba của chúng tôi. Tạo một tập tin greedy.ctrong thư mục của bạn ~/workspace/pset1. Cho trước: tiền xu có mệnh giá 25, 10, 5, 1 xu Chương trình nên:
  1. Hỏi người dùng số tiền lẻ cần đưa ra
  2. Tính số xu tối thiểu mà bạn có thể làm được việc này
Ghi chú:Chúng ta sẽ sử dụng một hàm GetFloattừ thư viện CS50 cho đầu vào và printftừ thư viện I/O tiêu chuẩn cho đầu ra. Ngoài ra, chương trình phải kiểm tra tính chính xác của đầu vào. Chúng tôi đã yêu cầu bạn sử dụng GetFloat, để cho phép người dùng nhập giá trị bằng đô la và xu, cách nhau bằng dấu chấm. Ví dụ: nếu chúng tôi nợ 9,75 USD thì người dùng phải nhập 9,75 chứ không phải 9,75 USD hoặc 975. Bạn phải đảm bảo rằng người dùng nhập một số có ý nghĩa. GetFloatGiả sử không âm; bản thân hàm này sẽ không giúp ích được gì cho việc này . Nếu người dùng nhập sai, bạn cần yêu cầu họ lặp lại và chỉ chạy chương trình với dữ liệu chính xác. Hãy cẩn thận với sự thiếu chính xác vốn có của các số dấu phẩy động. Ví dụ: 0,01 không thể được biểu diễn trực tiếp dưới dạng float. Hãy thử sử dụng đầu ra được định dạng, ví dụ: với 50 chữ số thập phân, sử dụng mã bên dưới:
float f = 0.01;
printf("%.50f\n", f);
Nhân tiện, trước khi đếm bất cứ thứ gì, sẽ hợp lý nếu chuyển toàn bộ số tiền thành xu (đồng thời chuyển từ floatsang int), điều này sẽ giúp tránh được nhiều sai sót và khó khăn. Để đảm bảo rằng trình phân tích mã tự động của chúng tôi có thể kiểm tra chính xác vấn đề của bạn, hãy đảm bảo rằng dòng cuối cùng trong kết quả chương trình của bạn không chứa bất kỳ thông tin nào khác ngoài số xu tối thiểu: một số nguyên có ký tự \n sau nó (những người nghiên cứu JavaRush nhận thức rõ chúng ta đang nói về điều gì ở đây =)). Dưới đây là một ví dụ về kết quả của chương trình của bạn sẽ như thế nào.
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
0.41
4
Với bản chất của số dấu phẩy động, bạn có thể bỏ qua số 0 và nhập số đó vào dạng .41. Tất nhiên, người dùng muốn kiểm tra chương trình để biết khả năng nhập đầy đủ dữ liệu không chính xác sẽ thấy một cái gì đó như:
username:~/workspace/pset1 $ ./greedy
O hai! How much change is owed?
-0.41
How much change is owed?
-0.41
How much change is owed?
foo
Retry: 0.41
4
Dựa trên những yêu cầu này và ví dụ bạn đã thấy ở trên, mã của bạn rất có thể sẽ chứa một loại vòng lặp nào đó. Nếu trong khi kiểm tra ứng dụng, bạn nhận thấy vòng lặp không dừng, bạn có thể làm gián đoạn quá trình thực thi chương trình bằng tổ hợp ctrl-c (đôi khi nhiều lần). Bạn đã biết cách biên dịch và chạy một chương trình. Nếu bạn muốn kiểm tra xem chương trình của mình có hoạt động chính xác hay không bằng cách sử dụng tiện ích check50, hãy nhập dòng sau vào terminal:
check50 2015.fall.pset1.greedy greedy.c
Và nếu bạn muốn chơi với chương trình này do trợ lý khóa học thực hiện, hãy viết lệnh sau:
~cs50/pset1/greedy

Cách xác thực mã của bạn và nhận điểm

  1. lựa chọn 1

    Nếu điều quan trọng là bạn phải kiểm tra tính chính xác của mã và không nhận được điểm cuối cùng, bạn có thể kiểm tra và sửa nó bằng lệnh.

    check50 2015.fall.pset1.name name.c

    được nhập vào dòng terminal của CS50 IDE? nametên file nhiệm vụ của bạn ở đâu

  2. Lựa chọn 2

    Nếu bạn muốn đạt điểm (về cơ bản giống như chạy check50, nhưng ghi nhớ kết quả và điền một số biểu mẫu bằng tiếng Anh, hãy làm theo các bước sau:

    • Bước 1 trên 2

      1. Khi các ứng dụng đã sẵn sàng, hãy đăng nhập vào CS50 IDE.
      2. Ở góc trên bên trái của IDE CS50, trong trình duyệt tệp của nó, không phải cửa sổ terminal, nhấp chuột trái hoặc nhấp chuột phải vào tệp hello.c của bạn (tệp nằm trong thư mục pset1) và nhấp vào Tải xuống. Bạn sẽ thấy rằng trình duyệt đã tải hello.c.
      3. Lặp lại cho nước.c.
      4. Lặp lại cho mario.c.
      5. Lặp lại cho tham lam.c.
      6. Trong một tab hoặc cửa sổ riêng, đăng nhập vào CS50 Submit .
      7. Nhấp vào Gửi ở góc dưới bên trái của cửa sổ.
      8. Trong Bộ vấn đề 1 trong cửa sổ xuất hiện, nhấp vào Tải lên bài nộp mới.
      9. Trong cửa sổ xuất hiện, nhấp vào Thêm tệp…. Một cửa sổ có tên Open Files sẽ xuất hiện.
      10. Điều hướng đến vị trí tải xuống hello.c. Nó thường nằm trong thư mục Tải xuống hoặc trong thư mục được gán cho bạn theo mặc định để tải xuống. Khi bạn tìm thấy hello.c, hãy nhấp vào nó một lần để đánh dấu, sau đó nhấp vào Mở.
      11. Nhấp vào Thêm tệp... lần nữa và cửa sổ Mở tệp sẽ xuất hiện lại.
      12. Bây giờ hãy tìm file Water.c theo cách tương tự. Nhấp vào nó, sau đó nhấp vào Mở (hoặc “Mở”).
      13. Bây giờ hãy tìm mario.c. Và cũng bấm và mở theo cách tương tự.
      14. Mọi thứ đều giống với tệp tham lam.c.
      15. Nhấp vào Bắt đầu tải lên để bắt đầu tải tệp của bạn lên máy chủ CS50.
      16. Trên màn hình hiện ra, bạn sẽ thấy cửa sổ có nhãn No File Selected. Nếu bạn di chuyển con trỏ chuột sang bên trái màn hình, bạn sẽ thấy danh sách các tệp bạn đã tải xuống. Bấm vào từng cái để xác nhận nội dung của từng cái. (Không cần nhấn vào các nút hoặc biểu tượng khác). Nếu bạn chắc chắn rằng bạn đã sẵn sàng gửi tệp để xác minh, hãy coi như bạn đã hoàn tất! Nếu bạn muốn tự mình kiểm tra lại mã hoặc sửa chữa bất cứ điều gì, hãy quay lại CS50 Submit và lặp lại các bước này. Bạn có thể gửi lại bao nhiêu lần tùy thích; Chỉ bài nộp gần đây nhất sẽ được đánh giá.
  3. Bước 2 trên 2 (không cần đánh giá, nếu vậy =))

    Bây giờ hãy truy cập https://www.edx.org/course/cs50s-introduction-computer-science-harvardx-cs50x nơi bạn sẽ tìm thấy các biểu mẫu đặc biệt. Trong đó, bạn cần trả lời một số câu hỏi lý thuyết, sau đó nhấp vào Gửi bên dưới chúng.

Các câu hỏi có dấu hoa thị là bắt buộc:
  • Được rồi, đáng lẽ phải thấy điều này sắp xảy ra! Chỉ trong vài câu, thư viện là gì? * (Mô tả ngắn gọn thư viện là gì)
  • Chỉ trong một vài câu, vai trò của nó #include <cs50.h> khi bạn viết nó trên chương trình nào đó là gì? *(vai trò của dòng #include <cs50.h> xuất hiện ở đầu một số chương trình là gì?)
  • Bạn cho biết mình đã dành bao nhiêu giờ cho Bộ bài tập 0: Scratch?
  • Bạn cho biết mình đã dành bao nhiêu giờ cho Bộ bài tập 1: C?
  • Ý kiến ​​của bạn về CS50x cho đến nay là gì? *(Ý kiến ​​của bạn về CS50 lúc này, hãy chọn thích hoặc không thích)
  • Bạn đã yêu cầu sự giúp đỡ từ các bạn cùng lớp hoặc nhân viên qua Nhóm Facebook của CS50 tại http://www.facebook.com/groups/cs50 chưa? *(bạn đã nhờ các sinh viên hoặc trợ lý khác giúp đỡ trong nhóm facebook chưa)
  • Bạn đã yêu cầu trợ giúp từ các bạn cùng lớp hoặc nhân viên thông qua Subreddit của CS50 tại http://www.reddit.com/r/cs50 *(bạn đã yêu cầu trợ giúp từ các sinh viên hoặc trợ lý khác qua Subreddit)
  • Bạn đã yêu cầu trợ giúp từ bạn cùng lớp hoặc nhân viên qua Twitter bằng cách sử dụng @cs50 hoặc #cs50 chưa? *(bạn đã nhờ các sinh viên hoặc TA khác trợ giúp trên Twitter bằng cách sử dụng @cs50 hoặc #cs50 chưa).
Các bạn ơi, nếu bạn có bất kỳ câu hỏi nào, hãy viết chúng trong phần bình luận bên dưới hướng dẫn này. Nếu bạn chưa đạt đến JavaRush cấp 5 để nhận được lời mời cung cấp thông tin, chúng tôi khuyên bạn nên làm như vậy. Nó miễn phí, thú vị và không khó lắm.

Tài nguyên mã:

  1. Bài giảng thứ ba

    http://cdn.cs50.net/2015/fall/lectures/1/w/src1w.zip

  2. Bài giảng thứ tư

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f.zip

    http://cdn.cs50.net/2015/fall/lectures/1/f/src1f/

văn học bổ sung

http://cpp.com.ru/kr_cbook - Phiên bản tiếng Nga của cuốn sách cổ điển về C của các tác giả ngôn ngữ này - Brian Kernighan và Dennis Ritchie. Được biết đến rộng rãi trong giới hạn hẹp với cái tên K&R. Tuy nhiên, bản dịch này không phải là bản dịch mới nhất. Đọc ba chương đầu tiên. Sẽ có nhiều tài liệu hơn bạn cần một chút, nhưng đủ để giải quyết vấn đề. https://computer.howstuffworks.com/c.htm là tài nguyên được các tác giả của CS50 khuyên dùng. Bằng tiếng Anh. Trang 1-7, 9 và 10.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION