[MUSIC CHƠI] DAVID Malan: Xin chào, tất cả mọi người. Đây là supersection CS50 của. Phần giao sẽ không bắt đầu cho một tuần khác. Và vì vậy hôm nay, tôi ở đây with-- MARIA: Maria. DAVID Malan: --Để thực hãy nhìn vào vấn đề thiết lập một, quá trình của tuần đầu tiên của vật liệu, giúp bạn có được định hướng với CS50 IDE, một chút của Linux, hệ điều hành đó là chạy trên IDE, cũng như xem xét một số các quá trình chuyển đổi từ Scratch với C hàng đầu lên đến vấn đề thiết lập một. Vì vậy, không có thêm ado, trong vấn đề thiết lập một, bạn sẽ được giới thiệu với CS50 IDE, mà là lập trình dựa trên web này môi trường mà chúng tôi sử dụng để để viết chương trình. Nó được thiết kế để trông rất gợi nhớ của một máy tính điển hình hệ thống chạy một hành hệ thống gọi là Linux. Nhưng đó là trong cái gọi là điện toán đám mây, có nghĩa là tất cả mọi người trong lớp thực sự có thể có của mình tài khoản riêng và sử dụng nó, là tốt. Vì vậy, hầu hết các bạn có thể chưa bao giờ được sử dụng một môi trường Linux trước hoặc có lẽ thậm chí một môi trường dòng lệnh. Và một dòng lệnh môi trường là khác nhau. Đó là tất cả văn bản. Đó là tất cả các lệnh bàn phím. Và nó không có rê chuột, không có biểu tượng, không có cửa sổ đối thoại, không có các menu. Nó hoàn toàn là văn bản. Vì vậy, lần đầu tiên, nó loại của cảm thấy như một bước ngược về sự tinh tế. Nhưng nó kết thúc lên được rất nhiều mạnh mẽ hơn, chắc chắn, cho một nhà khoa học máy tính, cuối cùng. Vì vậy, chúng ta hãy có một cái nhìn. Ở đây tôi đang ở CS50.io, qua đó bạn có thể đăng nhập vào CS50 IDE. Và giống như trong Scratch, có ba lĩnh vực chính để màn hình này. Vì vậy, ở phía bên trái, chúng ta có những gì sẽ là trình duyệt tập tin. Và có thư mục này hàng đầu, mà là ngay bây giờ trống rỗng kể từ khi tôi đã thoát khỏi tất cả của tôi file trước khi supersection. Và đó là nơi chúng tôi sẽ lưu các tập tin C mà chúng tôi viết. Ở phía trên bên phải, chúng ta có một nơi mà tất cả các mã của chúng tôi sẽ nhận được văn bản. Và quả thực, nếu tôi bấm cộng này, này là sẽ cho tôi chọn New File. Và ở đây tôi có thể bắt đầu viết mã C hoặc, thực sự, bất kỳ số ngôn ngữ khác. Và sau đó ở phía dưới nơi nó nói jharvard @ ide50-- và bạn sẽ nói một chút gì đó different-- những gì được này được gọi là? Thiết bị đầu cuối cửa sổ. Yeah. Vì vậy, các cửa sổ terminal là cái gọi là dòng lệnh giao diện thông qua đó bạn có thể tương tác với các hệ thống điều hành cơ bản. Và bây giờ, chúng ta sẽ làm cho rất ít sử dụng this-- chỉ để biên dịch, nhìn vào thông báo lỗi mà chúng ta thấy, và chạy các chương trình của chúng tôi. Nhưng cuối cùng, chúng ta sẽ để làm được nhiều hơn, là tốt. Và thậm chí bạn có thể cài đặt phần mềm và quản lý không gian làm việc của bạn trong CS50 IDE, cũng. Nhưng thêm vào đó một thời gian khác. Vì vậy, chúng ta hãy đi trước và viết một chương trình rất đơn giản chỉ phải đi qua một ấm lên của hello.c, mà có lẽ là các chương trình đơn giản nhất chúng ta có thể viết. Tôi đã mở ra một tab mới. Tôi sẽ đi trước và nói bao gồm io.h. chuẩn Sau đó, int main (void). Và sau đó printf ("hello, world" backslash n, quote gần, ngoặc đóng, và dấu chấm phẩy. Được rồi. Vì vậy, doanh nghiệp nhận thấy cửa sổ của tôi là tiêu đề. Vì vậy, tôi rất nhanh chóng đi đi lên vào File, Save. Và điều quan trọng là Tôi gọi điều này không phải là "hello". Vì vậy, một sai lầm rất phổ biến, đặc biệt là trong vấn đề thiết lập một, là vô tình chỉ cần gọi cho bạn Chương trình "nước" hay "tham lam" hay "Mario" hoặc "tín dụng" hoặc tương tự. Nhưng bạn có thực sự muốn làm cho chắc chắn rằng bạn có phần mở rộng tập tin bởi vì đây là cách duy nhất mà trình biên dịch và cũng là trình biên tập mã biết rằng bạn đang thực sự viết code C. Vì vậy, hãy để tôi đi trước và bấm Save. Và bây giờ cũng vậy, những gì CS50 IDE đã làm cho chúng tôi là nó cũng các câu lệnh của tất cả mọi thứ. Vì vậy, nó được làm tất cả mọi thứ rất sặc sỡ. Và toàn bộ mục đích của đó không phải là chức năng. Nó chỉ là để vẽ mắt của tôi để miếng khái niệm khác nhau của chương trình này. Vì vậy, chúng ta hãy đi trước và biên dịch này. Và tôi có thể biên dịch này trong một vài cách. Và trong tuần thứ nhất, các cách trường học cũ chúng tôi đã làm đó là nghĩa đen tại lệnh line-- "vang hello.c." Và sau đó tôi nhấn Enter. Và không có gì có thể xảy ra trong cửa sổ terminal. Nhưng điều gì đã thay đổi trong IDE? Trường hợp, một lần nữa, IDE chỉ có nghĩa là Môi trường phát triển tích hợp. Đó là một cách nói phát triển tích hợp này môi trường cho phát triển phần mềm. Vì vậy, những gì đã thay đổi trong giao diện người dùng? Bạn đã thông báo những gì đó là khác nhau, Maria? MARIA: Tôi nhận thấy một cái gì đó dưới IDE50 thư mục ở đây. DAVID Malan: Yeah. Vì vậy, lên đây, không chỉ chúng ta phải "hello.c." Chúng tôi cũng có "a.out", mà là loại một tên câm cho một chương trình. Nhưng thực sự, đó là tên mặc định cho một chương trình khi bạn chỉ cần biên dịch mã của bạn và không báo cho trình biên dịch những tập tin đến đầu ra. Vì vậy, nếu tôi muốn chạy này, tôi cần cho compiler-- hay đúng hơn, tôi cần phải nói với các không gian làm việc mà tôi muốn chạy các chương trình gọi là "a.out." Vào. Và có "hello, "bây giờ" ./ "thế giới.. là thực sự quan trọng. Mặc dù thông thường chúng tôi chỉ viết tên của các lệnh, khi đó là một chương trình mà bạn đã bằng văn bản, bạn muốn nói "./" bởi vì đó nói một cách rõ ràng Linux mà bạn muốn chạy một chương trình gọi là "a.out" đó là trong này, nơi dot có nghĩa là thư mục này mà tôi hiện đang là trong, mà xảy ra được được gọi là không gian làm việc, "a.out. Bởi vì nếu tôi chỉ nói "a.out," Nhập, Tôi sẽ nhận được "a.out lệnh không tìm thấy "vì computer-- bởi vì tôi đã phát minh ra "a.out;" nó đã không đến với computer-- không biết nơi nào để tìm nó, mặc dù nó đúng dưới mũi của tôi, vậy để nói chuyện. ĐƯỢC. Vì vậy, chúng ta có thể thay đổi điều này để thể "kêu vang -o chào hello.c." Và nếu tôi nhấn Enter, chương trình gì Điều này sẽ đầu ra cho tôi? Tên của tập tin là gì? Yeah, trong trở lại. Đúng thế. "Chào bạn." Vì vậy, "hello" là có được tên của chương trình bởi vì chúng tôi đã sử dụng một cái gọi là đối số dòng lệnh, mà chỉ là một cách để thay đổi hành vi của trình biên dịch để thực sự đầu ra một tên tập tin cụ thể. Và quả thực, nếu tôi phóng to ra ngoài và nhìn lên đây, Tôi bây giờ không chỉ có "a.out" và "hello.c" nhưng cũng "hello", là tốt. Vì vậy, bây giờ tôi có thể làm "./hello," Enter. Và có "hello, thế giới." Nhưng lastly-- và điều này bây giờ sẽ được quy ước chúng tôi sử dụng trong suốt học kỳ, typically-- là bạn cũng có thể chỉ cần nói "làm hello." Và quả thực, nó nói nó lên cho đến nay vì nó đã tồn tại. Hãy để tôi đi trước và loại bỏ, với lệnh rm, cả "a.out" - và nói "loại bỏ tập tin thường xuyên a.out?" Điều đó chỉ có nghĩa là, bạn có chắc chắn rằng bạn muốn xóa nó? Tôi sẽ nói có. Và sau đó tôi sẽ loại bỏ "hello" nhưng không "hello.c." Tôi sẽ nói "vâng" một cách rõ ràng, nhưng "y" là đủ, là tốt. Và bây giờ nhận thấy nếu tôi gõ ls-- đó, thu hồi, có nghĩa là nó sẽ liệt kê tất cả các list-- của các tập tin trong thư mục của tôi. Và quả thực, nếu tôi phóng to ra và nhìn vào phía trên bên trái, nó khẳng định rằng những gì trong thư mục này, thậm chí mặc dù nó được dán nhãn là IDE50 lên đây và không gian làm việc, nó chỉ là "hello.c." Vì vậy, bây giờ xuống đây, nếu tôi đừng "làm hello," Nhập, bây giờ tôi thấy một lệnh còn nhiều nhưng một lệnh phức tạp hơn đó là đi là hữu ích trong những tuần tới. Và bây giờ tôi có thể nói "./hello." Vì vậy, hãy tham quan nhanh một số lệnh Linux khác. Vậy thì tại sao chúng ta không có một bước trở lại và thực sự nhìn vào C hơn nói chung, chuyển từ Scratch C, và sau đó kết thúc với một cái nhìn vào vấn đề đầu tiên thiết lập trong C. Tất cả các quyền. Vì vậy, tôi sẽ đi trước và chỉ cần sạch không gian làm việc của tôi với Control-L chỉ để giữ cho màn hình gọn gàng. Nhưng điều đó không có chức năng tác động khác. Nhớ lại rằng chúng ta đã nhìn thấy một vài lệnh này. Vì vậy, chúng tôi đã nhìn thấy kêu, mà thông thường bạn sẽ không phải thực hiện thủ công nữa. Thay vào đó, chúng tôi sẽ sử dụng make. Nhưng chúng ta cũng thấy ls, trong đó cho thấy một danh sách các tập tin trong thư mục của tôi. Và bây giờ tại sao là there-- có của hai tập tin bây giờ, "hello" và "hello.c." Tại sao lại có một ngôi sao hay một sao sau "hello"? Đã có ý nghĩa gì, dựa về những gì chúng ta đã thấy trong tuần đầu? Bạn nghĩ sao? Không sao ý nghĩa gì? MARIA: For-- chương trình "hello"? DAVID Malan: "Xin chào *". Yeah. Oh, yeah? Oh, thực thi. Đúng thế. Vì vậy, điều đó có nghĩa rằng "hello" được thực thi. Vì vậy, thực sự, đó là lý do tại sao Tôi có thể làm "./hello." Được rồi. Vì vậy, những gì khác tôi có thể làm gì trong đây? Vâng, nó quay ra tôi có thể cũng tạo ra các thư mục. Vì vậy, hãy để tôi đi trước và tạo ra, Ví dụ, một thư mục "pset1". Và đặc tả vấn đề đặt sẽ có bạn làm chính xác điều này, vì vậy bạn không cần phải nhớ ngày hôm nay. Nhưng "mkdir pset1" có vẻ không có ảnh hưởng. Nhưng một lần nữa, không có thông báo lỗi nói chung là một điều tốt. Vì vậy, nếu tôi gõ "ls" now-- ah, bây giờ Tôi có một tập tin thực thi được gọi là "hello", một tập tin C được gọi là "hello.c." Và sau đó gạch chéo, do đó, để nói chuyện, có nghĩa rằng đây là một thư mục. Vì vậy, thực sự, bây giờ tôi muốn mở nó. Và tôi không nhấp đúp chuột vào nó như trong một giao diện, một môi trường đồ họa. Tôi thay vì nói "cd pset1." Vào. Không có gì thú vị dường như có xảy ra ngoại trừ dấu nhắc nhỏ của tôi here-- đây là cách của Linux nhắc nhở tôi biết nơi tôi, vì vậy thư mục gì là mở. Nó chỉ nói cho em một cách rõ ràng như trái ngược với đồ họa. Và nếu tôi gõ "ls," tại sao tôi thấy khác nhắc nhở ngay lập tức, bạn có nghĩ, khi tôi danh sách các nội dung của pset1? MARIA: Bạn có thể làm không có bất cứ điều gì trong đó. DAVID Malan: Yeah. Vì vậy, sau đó chúng tôi đã không rõ ràng tạo ra bất cứ điều gì trong đó vì tôi chỉ cần tạo thư mục. Bây giờ, nếu tôi muốn tạo ra một file-- cho Ví dụ, tôi có thể tạo ra một tập tin mới. Và sau đó tôi có thể đi đến Lưu và lưu nó như là, như, "mario.c" nếu bạn đang làm phiên bản tiêu chuẩn của pset một. Và sau đó, giống như bất kỳ máy Mac hoặc PC, chỉ chọn thư mục "pset1, Save. Và bây giờ là tập rỗng. Nhưng chúng ta hãy phóng to một lần nữa cho một thứ hai. Hãy làm ls đây. Bây giờ chúng ta thấy "mario.c". Vì vậy, có một số lệnh khác là giá trị lưu giữ trong tâm trí hơn time-- rõ ràng, hoặc Control-L là những gì tôi đã được đánh; mkdir chúng tôi đã nhìn thấy; rm, chúng tôi đã nhìn thấy, là tốt, mà là để loại bỏ hoặc xóa một tập tin. Hãy coi chừng bạn có thể also-- và nếu bạn nhìn ở hướng dẫn trực tuyến, bạn sẽ rm -rf là một cách rất phổ biến để nói xóa một thư mục đó có công cụ trong đó. Chỉ cần được siêu, siêu cẩn thận. -rf nghĩa đệ quy xóa bất cứ điều gì nó là bạn đang cố gắng để xóa và bắt buộc xóa nó. Vì vậy, phương tiện đệ quy nếu nó là một thư mục với một thư mục với một thư mục với một thư mục, xóa tất cả chúng. Và bắt buộc có nghĩa là thậm chí không hỏi tôi có hay không, tôi chắc chắn? Vì vậy, nó là một cách thật nguy hiểm xóa rất nhiều thứ một cách nhanh chóng. Nhưng beware-- quá thường xuyên làm một dũng cảm sinh viên vô tình xóa, nói, pset một ví dụ. MARIA: Và nếu họ chỉ làm -r, họ đang đi để yêu cầu họ về mọi tập tin duy nhất. DAVID Malan: nào là vừa gây phiền nhiễu. MARIA: Yeah. DAVID Malan: Vì vậy, đó là lý do tại sao rất nhiều người trong chúng ta, tự bao gồm, đang trong thói quen sử dụng -rf. Nhưng nó là nguy hiểm. Vì vậy, người mua hãy cẩn thận. Và sau đó là mv loại thú vị được đặt tên. Vì vậy, đây là lệnh di chuyển, mà cảm thấy một chút lạ bởi vì bạn thực sự có thể sử dụng nó để di chuyển các tập tin từ nơi này đến nơi khác. Ví dụ, giả sử rằng tôi sai lầm. Giả sử rằng tôi tạo ra một tập tin mới cho pset. Và tôi đã lưu nó như là "greedy.c." Nhưng giả sử tôi vô tình lưu lại trong IDE50-- như vậy trong không gian làm việc của tôi tự và không có trong pset1. Bạn có thể thấy nhiều ở đầu bên trái. Có "greedy.c." Và có một số giải pháp. Vì vậy, một, tôi có thể sử dụng cách sử dụng siêu của chỉ cần kéo và thả nó. Và đó sẽ thực sự khắc phục vấn đề này. Nhưng hôm nay, chúng tôi đang cố gắng nhìn vào những cách phức tạp hơn nhưng mạnh mẽ để làm điều này. Vì vậy, hãy để tôi đi "ls" trong pset1. Và tôi chỉ nhìn thấy "mario.c." Hãy để tôi đi trước và làm "cd ..". Vì vậy, CD nữa là thay đổi thư mục. ".." Có nghĩa là gì, mặc dù? Lần cuối cùng tôi nói "cd pset1 "đi vào pset1. Vì vậy, khi tôi nói "cd ..", những gì tôi làm? Ngược. Yeah. Vì vậy, nó sẽ được gọi là mẹ. Tới một mức độ lên, như thoát ra khỏi một thư mục. Vì vậy, Enter. Và quả thật, hãy nhìn những gì nó đã làm. Nó làm tôi cảm động chỉ vào không gian làm việc thay vì của thành pset1, mà là trong không gian làm việc. Và bây giờ nếu tôi gõ "ls", có một bó toàn bộ công cụ. Trong đó là "greedy.c". Vì vậy, bây giờ để tôi sử dụng mv để theo nghĩa đen di chuyển "greedy.c" vào pset1. Và vì vậy rất nhiều các lệnh Linux làm việc chính xác như thế này. Họ không có đối số hoặc họ mất một tranh luận hay họ mất hai dòng lệnh lập luận và vv. Và trong trường hợp này, đó là nghĩa là làm những gì nó nói, mặc dù succinctly-- di chuyển greedy.c vào pset1. Vào. Không có gì có thể xảy ra. Nhưng nếu tôi làm một ls nữa, tham lam đã biến mất. Và nếu tôi làm "cd pset1", Enter, và sau đó ls nữa, bây giờ nó ở đúng nơi. Là một sang một bên, nếu cho một số reason-- đặc biệt nếu bạn có liên tục kết nối mạng hoặc bạn đang đi bộ xung quanh khuôn viên trường với nắp máy tính xách tay của bạn đóng cửa và sau đó mở nó lên một lần nữa và không gian làm việc của bạn có vẻ hơi không đồng bộ, không có việc lớn. Chỉ cần tải lại trình duyệt của bạn cửa sổ, và nó phải resync để các bên tay trái trình duyệt tập tin sẽ chính xác như các cửa sổ terminal. Không phải lo lắng. Khi nghi ngờ, tải lại trang, vì vậy miễn là bạn đã lưu các tập tin đã. ĐƯỢC. Vì vậy, mv cũng có thể được sử dụng để đổi tên tập tin. Và chúng ta hãy nhìn vào lệnh này chính thức ở đây. Vì vậy suppose-- và đây là siêu phổ biến, quá, quá sớm. Một số sinh viên đôi khi tạo ra một tập tin gọi là, chúng ta hãy say-- nhau là gì? Cũng giống như "WATER.C." Vì vậy, tôi sẽ chỉ la lên, cho không có lý do, trong tất cả các mũ. Nhưng đây không phải là tên đúng cho tập tin nếu chỉ vì vấn đề của chúng tôi thiết đặc điểm kỹ thuật đã không cho bạn để lưu các tập tin như là tất cả các mũ "WATER.C." Thay vào đó, chúng tôi mong đợi "water.c" trong chữ thường. Và, trên thực tế, đây là vấn đề bởi vì check50, một chương trình bạn đang đi để đáp ứng trong vấn đề thiết lập một tự động kiểm tra tính đúng đắn của mã của bạn sẽ hét vào mặt bạn nếu nó không thể tìm "water.c" trong tất cả các chữ thường. Vì vậy, tôi cần phải sửa lỗi này. Vì vậy, nhiều cách khác nhau để làm được điều này, người đầu tiên trong số đó sẽ là vào Control-click hoặc nhấp chuột phải tên tập tin và chỉ cần thay đổi Rename. Hoàn toàn tốt để làm điều đó. Nhưng một lần nữa, ngày hôm nay, chúng ta hãy làm cho nó một chút fancier. Hãy sử dụng mv thay đổi "WATER.C" để "water.c." Vì vậy, bạn cũng có thể sử dụng các đối số đầu tiên để đổi tên nó vào số thứ hai nếu đối số thứ hai không, là trong Thực tế, một thư mục hoặc một thư mục tên. Được rồi. Và cuối cùng, một chút trick-- vì vậy tôi đang ở thư mục không gian làm việc của tôi tại thời điểm này. Nếu tôi muốn nhận được vào pset một, Tôi chắc chắn có thể gõ "cd pset1." Nhưng nó quá tẻ nhạt để gõ "pset1" hoặc còn các tên file hoặc thư mục tên còn. Vì vậy, rất thường xuyên trong Linux, những gì bạn có thể làm là bắt đầu gõ "PSE" và chỉ cảm thấy buồn chán, nhấn Tab, và để cho hình máy tính nó ra cho bạn. Siêu hữu ích để có được thành thói quen đó. Trở ngại duy nhất là nếu bạn có nhiều tập tin hoặc thư mục bắt đầu với chữ "p" hoặc "ps", bạn có thể có để đánh thêm một số trước Máy tính sẽ biết phải làm gì. MARIA: Chúng tôi thích các phím tắt. DAVID Malan: Điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian. Và cũng có thể, như chúng tôi đã nói trong bài giảng, bạn có thể di chuyển lên trong lịch sử, lên và xuống, để tìm thấy gần đây thực hiện lệnh, là tốt. Được rồi. Vì vậy, bây giờ, chúng ta hãy quay trở lại sự chú ý của chúng tôi cho một chương trình đơn giản, hello thế giới. Vì vậy, chúng tôi đã biên soạn này chính xác. Và bây giờ tại sao chúng ta không đi xem các kiểu dữ liệu và sau đó chuyển tiếp từ một số khối Scratch tương ứng với C. MARIA: Awesome. Vì vậy, bây giờ mà bạn đã bắt đầu viết chương trình trong C, chúng ta sẽ bắt đầu nói chuyện về các kiểu dữ liệu và các biến. Vì vậy, một số loại dữ liệu mà bạn sẽ muốn biết bắt đầu từ bây giờ là những người có đánh dấu màu xanh. Vì vậy, chúng tôi có int đầu tiên, đó là viết tắt cho số nguyên. Và giữ nguyên, như bạn có thể có guessed-- số 1, 2, 3, và bất kỳ số nguyên khác mà bạn có thể nghĩ đến. DAVID Malan: Và cũng tiêu cực. MARIA: Và cũng có những người tiêu cực, vâng. Và 0. Sau đó, chúng tôi có phao nổi, mà đang nổi số điểm. Vì vậy, đó là tất cả các số thực có điểm thập phân. Vì vậy, 5.0, 5.2, và thậm chí nhiều hơn chữ số sau dấu thập phân, là tốt, và cũng có những tiêu cực. Sau đó, chúng tôi có char mà là một nhân vật. Vì vậy, tôi nghĩ rằng chúng tôi đã nói chuyện về này trong bài giảng hôm nay. Nhưng chúng ta có những lá thư, cho example-- A, B, C-- có thể được lưu trữ như là một char. Nhưng sau đó chúng tôi có rất nhiều biểu tượng mà có thể được lưu trữ như là một char. Và những người được lưu trữ như ASCII. Và sau đó chúng tôi có bool, đó là Boolean. Và những người đánh giá là True hay False hoặc 1 và 0, tương ứng. DAVID Malan: Và nhớ lại rằng bool đến từ các thư viện CS50. Vì vậy, nó không được xây dựng vào C, nhưng nó là siêu hữu ích để có khái niệm đúng và sai. Và ngay cả khi bạn có thể think-- thực tế thú vị. Một bool kỹ thuật cần bao nhiêu bit, thực sự, để đại diện cho thật so với False? Bao nhiêu bit làm bạn nghĩ bạn sẽ cần, tối đa? Vâng, chỉ cần một. Vì vậy, nó chỉ ra rằng C không thể cung cấp cho bạn chỉ là một chút. Các đơn vị nhỏ nhất của biện pháp bạn có thể nhận được là tám. Vì vậy, nó là một chút lãng phí chúng bạn sử dụng toàn bộ một byte, hoặc tám bit, đại diện Đúng hay Sai. Nhưng đó chỉ là cách nó thực hiện trong C bởi các thư viện CS50. MARIA: Và sau đó những người mà chúng tôi sẽ không nói về một cách rộng rãi đúng now-- đôi, đó là cho phao lớn hơn. Lâu dài và ngắn cũng là cho các số nguyên. DAVID Malan: Thật vậy. Trong ấn bản của hacker của pset một, chúng tôi thực sự sử dụng lâu dài. Nhưng đối với phiên bản tiêu chuẩn, nó không phải là cần thiết. MARIA: Cool. ĐƯỢC. Vì vậy, bạn nên operators-- có lẽ quen thuộc với hầu hết trong số này. Ngoài ra, +; trừ, -. Cho phép nhân, chúng ta có *. Vì vậy, không phải là X mà chúng ta thường sử dụng. Chia, chúng tôi có các dấu gạch chéo ngược. Và modulo nhà điều hành mới nhất của chúng tôi chúng ta sẽ nói về ngay bây giờ. Đó là một nhà điều hành cho phép chúng ta lấy phần còn lại của một bộ phận. Vì vậy, nếu chúng ta có 4% 2, 4 chia 2 là 2 với phần còn lại của 0. Vì vậy, 4% 2 là 0. 4% 3 là 1. 4% 5 là 4, như bạn có thể đoán. Và nhớ khi sử dụng tất cả các khai thác sử dụng các quy tắc PEMDAS. DAVID Malan: Vì vậy, để được rõ ràng, nếu bạn làm 4% 2, tại sao là 0, chính xác? MARIA: Bởi vì 4 chia 2 là 2 với phần còn lại của 0. Vì vậy, theo modulo cho chúng ta mà còn là trái ngược với kết quả của phép chia. DAVID Malan: Và quả thực, những gì chúng ta sẽ tìm thấy điều này hữu ích cho là trong một số vấn đề đó là không nhất thiết phải một, nếu bạn muốn có gây hạn chế cho chính mình để một loạt các con số như 0 thông qua một cái gì đó, bạn có thể sử dụng modulo để bọc xung quanh sớm hơn như 2 tỷ hoặc giá trị 4 tỷ USD mà chúng tôi đã nói đến trong bài giảng. MARIA: Yeah. Và ngay cả trong "tham lam", chúng tôi có thể. DAVID Malan: Có, trong vấn đề thiết lập một, là tốt. MARIA: Yeah, tốt đẹp. DAVID Malan: Tốt gợi ý. MARIA: Xin lỗi. Boolean expressions-- vậy cho các toán tử logic, chúng ta sẽ nói về tất cả các bạn thấy ở đây. Vì vậy, ngay bây giờ, chúng ta có hai dấu bằng liệt kê cho bằng. Vì vậy, những người đang có để so sánh. Cho đến nay, chúng tôi đã chỉ nhìn thấy một dấu bằng. Đó là khi chúng ta gán một giá trị cho một biến. Vì vậy, nếu chúng ta đã nhìn thấy int n = 5, sau đó chúng tôi đã phân công 5 với n biến. Nhưng nếu chúng ta muốn sử dụng == cho so sánh, chúng ta có thể kiểm tra nếu n == 5. Và nếu n == 5, thì đó là sự thật. Vì vậy, các nhà khai thác Boolean cho phép chúng ta, về cơ bản, để đánh giá Boolean biểu thức là True hoặc False. Vì vậy, không equals-- chúng tôi có các dấu chấm than và bằng. Vì vậy, chúng ta cũng có thể kiểm tra nếu n không bằng 5-- vậy n! = 5. Ít hơn, nhỏ hơn hoặc bằng, lớn hơn, lớn hơn hoặc bằng, và sau đó chúng tôi có hợp lý AND và OR. Và những cho phép chúng tôi để đánh giá nhiều biểu thức Boolean với nhau về cơ bản đến với nhau như toàn bộ một biểu thức Boolean. Vì vậy, nếu chúng ta muốn tìm một số, nói, đó là lớn hơn 5 nhưng ít hơn 15 cùng một lúc, chúng ta sẽ sử dụng hợp lý và điều hành để xem nếu n là lớn hơn 5 && n ít hơn 15. DAVID Malan: Và ở đây, quá, nó thực sự dễ dàng sớm để vô tình chỉ sử dụng một ký hiệu đơn hoặc một thanh đứng đơn. Và hy vọng rằng các trình biên dịch sẽ hét lên với bạn bởi vì họ thực sự có một ý nghĩa rất khác nhau. Đối với những người tò mò, họ được sử dụng cho các hoạt động trên bit, hoạt động trên các bit riêng lẻ. Nhưng bạn làm muốn cặp của chúng ở đây. Và siêu quan trọng là Người đầu tiên, dấu bằng, đó là các nhà điều hành bình đẳng như trái ngược với toán tử gán. MARIA: Và các thanh dọc là nằm giữa Delete và Return. DAVID Malan: Yes. Trên một bàn phím Mỹ điển hình. MARIA: Yep. Vì vậy, chúng ta hãy nhảy ngay vào câu điều kiện. Trong Scratch, bạn đã đã nhìn thấy, có lẽ, nếu báo cáo cho phép bạn kiểm tra xem một cái gì đó là sự thật, sau đó làm cái gì khác. Vì vậy, bạn có thể muốn để kiểm tra xem sprite của bạn là chạm vào một số sprite khác hoặc biên giới của màn hình của bạn. Và sau đó bạn có thể muốn kết thúc trò chơi hoặc làm điều gì đó khác. Vì vậy, cú pháp cho rằng là "if (điều kiện)." Vì vậy, nếu sprite của bạn là chạm vào một cái gì đó, sau đó là bên trong các dấu ngoặc nhọn. Sau đó, chúng tôi có lệnh if-else. Khác cho phép chúng ta làm điều gì đó nếu điều kiện là chúng tôi kiểm tra trong đầu là không đúng sự thật. Vì vậy, nếu các sprite là chạm vào biên giới làm được điều này, người nào khác làm cái gì khác. Vì vậy, nếu không làm được cái gì khác. Sau đó, chúng ta có một ví dụ ngắn cho việc này. Vì vậy, nếu (military_time <12), chúng tôi muốn printf "Chào buổi sáng!" Khác chúng ta sẽ printf "Chào buổi tối!" Ví dụ cơ bản. DAVID Malan: Tốt. MARIA: Cool. Vì vậy, bây giờ chúng tôi có các câu lệnh switch. Chuyển báo cáo trong can chung cho phép chúng ta làm được rất nhiều điều tương tự rằng chúng ta chỉ nói chuyện về với câu lệnh if. Ví dụ, ngay bây giờ chúng ta có Hình thức chung của lệnh switch cho phép chúng ta chụp một biến gọi là n và so sánh nó với rất nhiều giá trị khác nhau, mà ở đây chúng tôi đã gọi là constant1, constant2. Chúng ta có thể có nhiều hơn nữa. Và những người được gọi là trường hợp. Vì vậy, nếu chúng ta có một chuyển đổi statement-- và tác phẩm này chỉ cho integers-- chúng ta có một biến trong trường hợp này đó là n. Nếu n biến là bằng constant1, chúng tôi sẽ thực hiện một số đoạn mã hoặc một cái gì đó mà chúng ta muốn làm. Và sau đó chúng tôi sẽ phá vỡ. Vì vậy, giờ nghỉ có nghĩa là câu lệnh switch sẽ ngừng thực hiện nếu n bằng constant1, và sau đó chương trình của bạn sẽ tiếp tục. Nó sẽ thoát ra khỏi chuyển đổi và tuyên bố nó sẽ thấy tiếp tục làm cái gì khác. Tuy nhiên, nếu n không bằng constant1, sau đó trường hợp cho constant2 sẽ được kiểm tra. Vì vậy, nếu n bằng constant2, mà khác đoạn mã sẽ được thực thi. Và sau đó nó sẽ phá vỡ nếu đó là bằng với nó. Và sau đó chúng ta có thể có also-- không nhất thiết, though-- một trường hợp mặc định, mà sẽ xảy ra nếu n không bằng trong các trường hợp mà bạn đã liệt kê. Và trong trường hợp mặc định, chúng tôi cũng không cần nghỉ ngơi cần thiết vì câu lệnh switch sẽ biết mà nó cần phải kết thúc sau khi mặc định trường hợp nếu đó là trường hợp. DAVID Malan: Nhưng phong cách, chúng tôi luôn luôn đặt nó ở đó. MARIA: Yeah. DAVID Malan: Yeah. Vì vậy, đặc biệt là khi bắt đầu, đặc biệt là nếu trong số những người kém thoải mái, tôi sẽ cá nhân chỉ khuyên bạn nên gắn bó với IFS và IFS-elses và if-else-if-elses và vv nếu chỉ bởi vì họ là một chút đơn giản hơn. Đây là một tối ưu hóa tốt đẹp, hoặc đôi khi ngay cả về mặt thẩm mỹ nó làm cho mã dễ đọc hơn. Và trong thực tế, có lẽ, giữa học kỳ chúng ta sẽ thấy một vấn đề thiết lập nơi mà nó chỉ có vẻ tốt hơn và dễ dàng hơn để đọc cho con người bằng cách sử dụng một câu lệnh switch. Nhưng đừng lo lắng về bám vào này quá sớm. MARIA: Yeah. Nếu bạn có rất nhiều nếu báo cáo, nó chỉ có thể không được rất có thể đọc được. Nó có thể không được rất nhanh để bạn có thể đi qua nó. Vì vậy, có thể chuyển đổi báo cáo rất hữu ích, là tốt. Và cũng có thể, không remember-- không quên đặt các vi phạm trong đó. DAVID Malan: Không nhớ này. MARIA: Bởi vì sau đó bạn có thể rơi thông qua từ một trường hợp khác. Vì vậy, chúng ta hãy nói rằng trường hợp constant1 không có lệnh break trong nó. Sau đó, chúng ta có thể rơi qua trường hợp bên constant2. Và chúng tôi không muốn làm điều đó nếu chúng tôi đã đạt đến trường hợp constant1 và đó là bằng n. Vì vậy, ví dụ, nếu chúng ta có một biến n có chứa một số lớp, và chúng tôi muốn xem những gì mà lớp is-- nếu n bằng 50, chúng ta sẽ in "là CS50 Giới thiệu về Khoa học Máy tính I. " Sau đó chúng ta sẽ phá vỡ. Và đó là nó. Tuy nhiên, nếu n bằng đến 51, chúng ta sẽ in "CS51 là Giới thiệu để máy tính Khoa học II. " Sau đó, một lần nữa, chúng ta sẽ phá vỡ. Tuy nhiên, nếu sau đó chúng tôi đặt 124, 61, bất kỳ số khác mà bạn có thể nghĩ đến, hoặc chương trình không phải là đi để nhận ra điều đó. Vì vậy, nó sẽ nói, "Xin lỗi, tôi không quen thuộc với lớp đó. " Và nó sẽ phá vỡ. DAVID Malan: Vì vậy, bạn thực sự có thể nhìn thấy nếu, nếu người nào khác, khác ý tưởng ở đây. Đó là cú pháp chỉ khác nhau cho thể hiện ý tưởng cùng chính xác. MARIA: Chính xác. Bây giờ chúng ta phải khai thác tam phân của chúng tôi. Vì vậy, các nhà khai thác tam phân có ba parts-- một điều kiện, một cái gì đó để làm gì nếu điều kiện đó là sự thật, và sau đó một cái gì đó để làm nếu điều kiện là sai. Vì vậy, bạn thấy, về cơ bản, cú pháp đó ở đây. Chúng tôi có các dấu hỏi, và sau đó the-- những gì chúng ta gọi này? DAVID Malan: Các đại tràng. MARIA: Colon. Cảm ơn bạn. Lấy làm tiếc. Vì vậy, chúng ta hãy nhìn vào ví dụ của chúng tôi để xem nếu chúng ta có thể làm cho tinh thần của this-- class_num == 50. Vì vậy, ở đây chúng ta thấy toán tử của chúng tôi == mà so sánh sự biến class_num đến 50. Vì vậy, các cửa hàng class_num một số nguyên. Và nếu số nguyên bằng 50, sau đó chúng tôi đi để lưu trữ "David Malan" bên trong các giáo sư chuỗi. Nếu số lượng lớp không bằng 50, "không phải David Malan" là có được các giáo sư. DAVID Malan: Cảm ơn bạn. Và do đó, điều này dường như tương đương với những gì, bạn sẽ nói, ở cái nhìn đầu tiên? MARIA: Để tôi nó có vẻ if-else như báo cáo. DAVID Malan: Yeah. Và trên thực tế, đây là loại của một khá lót, vậy để nói chuyện, để thực hiện chính xác logic của if-else nhưng làm tất cả mọi thứ trong một bước. MARIA: Chính xác. Yeah. Vì vậy, nếu báo cáo khác có thể- mất rất nhiều không gian. Họ có thể là quá dài cho một cái gì đó đơn giản như này. Vì vậy, đây có thể rất gọn gàng và rất đẹp. Vì vậy, bây giờ chúng ta đang đi vào nhìn thực hiện một cái gì đó một lần nữa và một lần nữa, để kiểm tra cho một điều kiện nhiều lần và sau đó tiếp tục làm một cái gì đó trong khi điều kiện đó là sự thật. Vì vậy, điều này mang lại cho chúng tôi độc đáo vào vòng trong khi. Ở bên trái, chúng ta có vòng lặp trong khi đầu của chúng tôi. Vì vậy, trong khi một cái gì đó là sự thật, làm điều gì đó một lần nữa và một lần nữa. Vì vậy, hãy chắc chắn để nhận thấy rằng chúng tôi điều kiện ở đây được xác nhận ở đầu trang. Trong khi với loop-- thứ hai của chúng tôi, chúng tôi gọi rằng một do-while loop-- chúng tôi làm điều gì đó, sau đó chúng tôi kiểm tra một điều kiện. Và nếu điều kiện tiếp tục là sự thật, chúng tôi quay trở lại và làm điều nữa. Vì vậy, sự khác biệt chính là nơi điều kiện được kiểm tra. Và các mã có thể không bao giờ có thực thi nếu điều kiện không phải là đúng với các vòng lặp while. Trong khi với các do-while vòng lặp, chúng ta có mã mà luôn luôn được thực hiện ít nhất một lần. Và sau đó trong khi điều kiện tiếp tục là sự thật, chúng ta có thể quay trở lại và lặp lại bên trong. Vậy tại sao bạn nghĩ rằng chúng ta sẽ sử dụng một do-while lặp trên một vòng lặp trong khi? Bên phải. Vì vậy, nếu chúng ta muốn nhắc nhở người sử dụng cho một số loại đầu vào, nếu chúng ta muốn hỏi họ để nhập tên của họ, chúng tôi muốn ít nhất là yêu cầu họ một lần. Và nếu họ nhập tên đó, chúng tôi không sẽ yêu cầu họ một lần nữa bởi vì chúng tôi đã biết nó. Nhưng nếu họ không nhập Tên của họ, hoặc nếu họ nhập một cái gì đó rõ ràng không phải là một tên, chúng tôi vẫn muốn tiếp tục yêu cầu họ về tên của chúng. DAVID Malan: Và trong bài giảng của chúng tôi đã có một như thế này với các chiều hướng tích cực int Ví dụ, nếu không có gì để kiểm tra lúc đầu bởi vì bạn có thậm chí không nhận một int. Vì vậy, chúng tôi muốn làm this-- nhận được một int từ user-- sau đó kiểm tra xem nó, có lẽ, một lần nữa và một lần nữa và một lần nữa. MARIA: Chính xác. Đối với loops-- OK. Đối với các vòng lặp có thể cho phép chúng ta làm hầu như chính xác những điều tương tự, là tốt. Nó thực sự là một điều chính xác. Vì vậy, không có gì mà bạn có thể làm với cho vòng rằng bạn sẽ không thể để làm với các vòng trong khi. Nhưng đối với các vòng lặp có thể có vẻ một chút chút phức tạp hơn cú pháp bởi vì họ có ba bộ phận bên trong những gì là trước khi chỉ điều kiện với các vòng trong khi. Vì vậy, phần đầu tiên mà bạn biển, trái nhất, chúng tôi có "int lùn = 0." Vì vậy, đây là nơi mà chúng ta khởi tạo biến của chúng tôi. Sau đó, chúng ta có một dấu chấm phẩy và "người lùn <7." Vì vậy, đây là nơi ra điều kiện thực tế. Vì vậy, đó là những gì chúng ta sẽ có đặt chỉ trong khi loop-- "trong khi người lùn <7." Ở đây, mà đi trong giữa cho chúng tôi loop. Vì vậy, "dwaves <7." Và sau đó phần cuối cùng của chúng tôi là "người lùn ++" đó là nơi mà chúng tôi cập nhật biến của chúng tôi. Vì vậy, điều quan trọng để nhận ra được rằng điều này sẽ đi qua này cho vòng lặp bảy lần và thực hiện bảy lần. Vì vậy, chúng tôi có bảy người lùn, và tất cả chúng sẽ nói, "Tôi ở đây để giúp bạn, Bạch Tuyết " bởi vì họ đã sẵn sàng để giúp đỡ Bạch Tuyết. Với các vòng lặp while, chúng tôi đã có thể làm việc khởi tạo và cập nhật không phải bên trong tình trạng này, một lần nữa, nhưng trước hoặc bên trong vòng lặp while để đảm bảo rằng we-- vì chúng ta luôn cần những bộ phận. Vì vậy, để đảm bảo rằng chúng tôi có họ, chúng tôi sẽ vẫn đã thêm họ trên, chỉ cần không phải bên trong dấu ngoặc đơn. DAVID Malan: Và như vậy có vẻ like-- trong bài giảng, ví dụ, Tôi gần như luôn luôn sử dụng, như thế, tôi và n và các biến khá nhàm chán. Dường như bạn có thể sử dụng nhiều hơn khéo léo đặt tên biến, quá. MARIA: Yeah, nó thực sự rất đẹp sử dụng các biến mô tả nhiều hơn một chút vì đặc biệt là nếu một người nào khác là đọc code-- của bạn có thể bạn đang học lớp hoặc nếu bạn đang cộng tác với ai đó-- bạn muốn chắc chắn rằng họ hiểu những gì bạn đang làm. ĐƯỢC. Vì vậy, đây là một cái gì đó rất funky-- cho vòng lặp bên trong một vòng lặp for. Tôi không biết nếu chúng tôi đã nhìn thấy điều này trước khi. Chắc là không. Nhưng chúng tôi thực sự có thể có this-- vì vậy thay vì vòng vòng. Vì vậy, không ai muốn có thể đi bộ tôi qua những gì đang xảy ra ở đây? DAVID Malan: Tôi sẽ lấy một đâm. MARIA: Cool. DAVID Malan: OK. Vì vậy, spoiler-- chúng ta muốn in những thứ đó là ở góc phải bên dưới chỗ đó. MARIA: Đúng vậy. Yeah, yeah. DAVID Malan: Vì vậy, chúng tôi đã chỉ đặt mà đầu ra mẫu đó. Vì vậy, tôi có thể suy ra từ vòng lặp trên cùng mà bạn iterating trên các hàng vòng ngoài cùng, vậy để nói chuyện. Và bạn đang iterating trên cột với các vòng lặp trong cùng. Và trực giác, điều này nên hy vọng làm cho tinh thần bởi vì theo tính chất của mỗi chương trình chúng tôi đã nhìn thấy trước, printf, đó là chức năng, chúng tôi đang sử dụng, cuối cùng, có khả năng in các công cụ ra về cơ bản theo từng dòng. Giống như, một khi bạn đã xuất ra một dòng mới, có không tăng gấp đôi lại và in ấn một cái gì đó cao hơn trong màn hình, ít nhất không sử dụng printf như thế này. Và như vậy trong vấn đề đó, nó làm cho cảm giác rằng các vòng ngoài cùng nên đề cập đến các hàng bởi vì đối với từng đưa hàng, bạn sẽ muốn in ra XXXXX, và sau đó chuyển sang dòng kế tiếp, XXXXX. Vì vậy, hàng đến trước. Và sau đó trong mỗi hàng, bạn in các cột. Nếu bạn đã cố gắng để làm điều đó ngược lại, nó có lẽ sẽ không đi ra như bạn có ý định. MARIA: Yeah. Chúng tôi chỉ có thể không quay trở lại các dòng trước đó với printf. DAVID Malan: Và điều thú vị mỗi trò chuyện hôm nay về phạm vi, thực sự, là hàng là một int đó là tuyên bố trong vòng lặp trên cùng. Nhưng nhận thấy rằng nó vẫn là bên trong, có thể nói, các dấu ngoặc nhọn mà ngay lập tức làm theo, mặc dù nó không phải kỹ thuật trong những dấu ngoặc nhọn. Vì vậy, hàng nằm trong phạm vi cho toàn bộ các đoạn mã, cả bên trong bên ngoài cho vòng lặp và bên trong của các bên trong vòng lặp for. Nhưng ngược lại, ở đâu là cột trong phạm vi? Cột biến? Yeah, chỉ trong vòng lặp bên trong. Và đó là OK, vì chúng ta không truy cập nó bên ngoài dấu ngoặc nhọn của nó. Tất cả chúng tôi làm là in ra một mới dòng ở cuối rất có. Vì vậy mà trong thực tế là OK. Vì vậy, điều này có tác, có vẻ như, làm ba hàng và bốn cột. MARIA: Đúng vậy. Vì vậy, đầu tiên chúng tôi đi qua hàng đầu tiên của chúng tôi. Và chỉ trong hàng đầu tiên của chúng tôi, chúng tôi làm việc bốn cột bên trong hàng đầu tiên. Vì vậy, chúng tôi in ra bốn của X. Và sau đó chúng ta có thể thoát khỏi vòng lặp for, kể từ chúng tôi đã in ra bốn của X. Và chúng tôi in một dòng mới. Và sau đó chúng tôi đi qua cùng một quá trình cho hai hàng hơn để thực hiện tổng cộng ba. DAVID Malan: Và nó đáng chú ý đó là chỉ là một tạo tác của font, thực tế rằng sản lượng mẫu dường như cao hơn rất nhiều, như thể có nhiều hơn hàng hơn cột. Nhưng đó chỉ là vì X là cao hơn nó là rộng. Đó là tất cả những gì xảy ra ở đó, cộng với những khoảng trắng giữa các dòng. MARIA: Đúng vậy. Mát. DAVID Malan: Tất cả các quyền. Vì vậy, một cái nhìn nhanh chóng vào vấn đề thiết lập một, có bất kỳ câu hỏi, và sau đó hoãn? Được rồi. Vì vậy, trong vấn đề thiết lập một trong, có ba thách thức chính, cuối cùng. Nhưng trước tiên, bạn sẽ tìm thấy rằng vấn đề đặt đặc điểm kỹ thuật, như với nhiều người psets vào mùa thu này, sẽ hướng dẫn bạn thông qua một vài bài tập khởi động, chỉ cho bạn ra một vài tài nguyên mà bạn có thể hoặc có thể không đã thấy rồi. Ví dụ, CS50 có một bộ quần short, đó là những đoạn video ngắn, không giống như này, nhưng điều đó là specific-- rất chủ đề có lẽ khoảng năm phút, 10 phút trong chiều dài trên các vòng hoặc về điều kiện hoặc trên các thuật toán hoặc sau này hơn chủ đề nâng cao, là tốt. Và chúng ta thường nhúng những thành vấn đề bộ để sinh viên có một nguồn lực mà để xem xét liệu có thể có đã đưa ra trong bài giảng hay phần. Nhưng cách này đó là tập trung hơn và nhiều hơn nữa trong tầm tay của họ. Chúng tôi cũng có xu hướng để nhúng vào vấn đề đặt điều được gọi là walkthrough. Vì vậy, gần như tất cả các ví dụ tôi làm trong bài giảng, trên sân khấu ở đây, chúng tôi cũng đã bắn vào máy ảnh trong tiến chậm hơn một nhiều hơn, một hướng thân mật hơn bởi tôi trên máy tính xách tay của tôi về code đó, từng dòng vì vậy mà trong lớp, chúng ta thường sẽ thấy đọc lướt qua một cái gì đó hoặc ai đó sẽ xen vào với một trả lời cho một câu hỏi. Nhưng nó không nhất thiết phải chìm ở cho mọi người trong khán giả. Vì vậy, bạn sẽ tìm thấy mã walkthroughs cho hầu hết các ví dụ rằng chúng ta làm ở đây trong bài giảng để bạn có thể đi bộ qua nó ở tốc độ của riêng của bạn và tua lại hoặc nhanh chóng chuyển tiếp hoặc bỏ qua hoàn toàn, nếu bạn muốn. Thường có một vài câu hỏi ấm-up yêu cầu bạn sắp xếp của củng cố tài liệu này và chắc chắn rằng bạn đang thoải mái trước bạn tiến hành với phần còn lại của pset. Và sau đó, tất nhiên, có các pset chính nó. Và một trong những điều chúng tôi rất cố tình làm trong CS50 là hầu hết không thú hay lý trí không thú bước cơ khí bạn có thể phải làm hầu như luôn luôn rất tốt tài liệu. Trong suốt nhiệm kỳ, chúng tôi sẽ bắt đầu đặt câu hỏi tu từ hơn như nhớ làm thế nào để làm điều này hay không? Nhưng nói chung, bạn sẽ tìm thấy rằng các bài tập giúp bạn thông qua các cơ chế của một cái gì đó để những thách thức về trí tuệ thú vị được cuối cùng để cho các bạn học sinh. Với mà nói, Zamyla, người mà chúng tôi giữ đề cập ngày hôm nay trong bài giảng, là một trong những nhân viên lâu năm của chúng tôi thành viên cũng là người nắm giữ walkthroughs về các vấn đề cụ thể như pset mario và tham lam, mặc dù không phải tưới nước trong năm nay. Và đó là trong những walkthroughs rằng cô thường xuyên cung cấp một số mẹo và thủ thuật cho cách thức tiến hành, không bao giờ nói với bạn chính xác phải làm gì, nhưng rather-- như một điều kiện, nếu bạn will-- đem lại cho bạn ít nhất một vài ý tưởng để nó vào bạn, cuối cùng, quyết định làm thế nào để tiếp cận họ. MARIA: Phân loại các giống như một cấp cao hiểu biết về logic của những gì chúng tôi đang yêu cầu bạn phải làm. DAVID Malan: Chính xác. Và, trên thực tế, Zamyla của walkthrough có nghĩa là để trả lời thường xuyên hỏi câu hỏi về nơi làm tôi bắt đầu, đặc biệt là khi các thông số kỹ thuật dài là một ít khó khăn cho tất cả các văn bản và hình ảnh mà họ có trong chúng. Vì vậy water.c, bạn sẽ tìm thấy sau khi bạn đã hoàn thành nó, thực sự là tương đối đơn giản. Hoàn toàn là một bó của bạn sẽ đập đầu của bạn chống lại các bức tường cố gắng để tìm ra lý do tại sao nó không phải biên dịch hoặc lý do tại sao nó không chạy một cách chính xác. Nhưng một khi bạn đã hoàn tất với nó và một khi bạn đã đã dành một số thời gian vật lộn với bất kỳ các lỗi mà bạn có thể có, bạn sẽ thấy rằng nó là một chương trình rất ngắn. Nó có thể được thực hiện chỉ trong một vài dòng mã, hầu hết trong số đó chúng tôi đã nhìn thấy ở đây trong bài giảng đã có, nếu bạn lắp ráp các khối xây dựng ngay. Và như chúng tôi đề nghị ở đây, nó sẽ hỏi bạn xác định có bao nhiêu phút một người nào đó đang tắm trong khuôn viên trường. Chúng tôi xác định trong các vấn đề thiết lập tốc độ của dòng chảy của nước trong, giống như, một buồng tắm vòi sen với dòng chảy thấp đầu, giống như các clip Seinfeld chúng ta thấy ngày hôm qua hay ngược lại chúng. Và sau đó bạn chỉ cần có để làm một chút về toán học, really-- số học sử dụng C để nói chúng ta có bao nhiêu, khoảng, chai nước là tương đương nếu chúng tôi lấy vòi hoa sen n phút. Bây giờ, trong mario.c, điều này sẽ là một chương trình dài hơn một chút. Nó vẫn không có được điều này từ lâu. Chỉ cần một vài dòng dài hơn water.c. Nhưng nó sẽ là cơ hội để tái tạo các trường học cũ Mario kim tự tháp từ Super Mario Brothers hoặc một số ngày tiếp theo. Nó sẽ không nhìn như đẹp hơn hoặc như nhiều màu sắc như ai ở đó. Chúng tôi sẽ chỉ sử dụng hashtags chút như chúng tôi có ở đây trên màn hình sử dụng văn bản ASCII. Nhưng nó sẽ gần bằng ý tưởng tương tự. Và nó sẽ là một tập thể dục mà ở cái nhìn đầu tiên có vẻ khá simple-- chỉ in một kim tự tháp đơn giản. Nhưng có một vài đặc điểm đây mà là thú vị. Chú ý rằng các cạnh ngoài cùng bên phải của kim tự tháp thực sự có chiều rộng hai. Vì vậy, có hai bằng cột chiều cao, mà làm cho nó đòi hỏi một chút chút suy nghĩ để làm cho chắc chắn bạn sẽ có được đó chính xác, như trái ngược với chỉ một góc hoàn hảo dòng. Vì vậy, đó là một chút của một trường hợp góc nhưng phù hợp với trò chơi thực tế. Và nó cũng không rõ ràng lúc đầu nhìn như thế nào để in các khoảng trắng. Vì vậy, khi tôi nhìn vào mẫu đầu ra here-- và nó cũng có trong spec-- nó loại trông giống như một hình chữ nhật, nhưng một đường chéo của hình chữ nhật đã được cắt nhỏ ra, và nó chỉ là không gian màu trắng, vậy để nói chuyện. Và do đó, một hỏi thường gặp Câu hỏi ở đây là luôn luôn, tốt, làm thế nào để di chuyển các hashtags qua bên phải? Hoặc làm thế nào để tôi in các chỗ trống? Và nó thực sự dễ dàng hơn so với hầu hết học sinh suy nghĩ. Bên phải? Bạn có thể gần nó trực quan bằng cách chỉ nhấn thanh không gian một lần hoặc hai lần hoặc ba lần. Và do đó, mặc dù với printf chúng tôi gần như luôn luôn in ra một chuỗi hoặc một int hoặc một từ như "hello, thế giới "hay một loạt các từ ngữ, bạn cũng có thể chỉ cần in quote, không gian, unquote. Và đó sẽ thực sự cung cấp bạn một không gian trắng đó. Vì vậy, giữ cho rằng trong tâm trí và không overthink này. Bạn thực sự phải quyết định từng hàng của hàng, không giống như ví dụ của bạn một thời điểm trước đây, bao nhiêu người cột này phải là không gian màu trắng và bao nhiêu người trong số họ phải được hashtags. Nó sẽ mất một chút thời gian, nhưng nó cuối cùng là một câu đố logic của các loại. MARIA: Yeah. Nhưng logic đi từng hàng sẽ là rất hữu ích ở đây. DAVID Malan: Yeah. Tôi nghĩ rằng các mẫu mã bạn gave-- thậm chí mặc dù nó không phải là một chương trình hoàn chỉnh. Bạn vẫn cần int và chính hiệu và #include stdio.h, rất nhiều các công cụ từ bài giảng. Nhưng các khối xây dựng dường như là có. Và rồi cuối cùng là một cái gì đó nhiều hơn một chút thuật toán. Vì vậy, nó chỉ ra rằng bất cứ lúc nào bạn đi vào CVS hoặc bất kỳ cửa hàng tiện lợi và ai đó đưa cho bạn tại hóa đơn thu ngân hoặc tiền xu khi thay đổi, nó quay ra rằng họ, con người, dù có hoặc không có biết hay không, được thể sử dụng những gì được gọi là một thuật toán tham lam, theo đó, nếu bạn đang còn nợ, nói, $ 21 trong sự thay đổi vì một số lý do bạn mua một cái gì đó rất rẻ tiền với một hóa đơn rất lớn tại CVS, nó sẽ thực sự gây phiền nhiễu nếu thu ngân đưa cho bạn 21 đĩa đơn hay tồi tệ hơn nào, một toàn bộ rất nhiều tiền xu. Thay vào đó, những gì một người là hợp lý có lẽ sẽ làm là họ đang đi để lấy một $ 20 và sau đó là một $ 1 hóa đơn, và tay bạn chỉ là hai hóa đơn trong trường hợp đó. MARIA: Vì vậy, họ đang tìm cách giảm thiểu sự thay đổi mà họ cung cấp lại cho bạn. DAVID Malan: Chính xác. Và cùng thỏa thuận với tiền xu, là tốt. Nếu bạn đang nợ, nói, $ 0.50, hy vọng bạn không muốn 50 đồng xu. Thay vào đó bạn muốn hai quý, ví dụ. Bây giờ, điều này giả định mà thủ quỹ có đủ của tất cả các tôn giáo đó anh hoặc cô ấy có thể muốn cung cấp cho bạn. Nhưng chúng tôi cho phép bạn giả càng nhiều trong các vấn đề. Và mục tiêu cuối cùng, là để thực hiện trong mã C một thuật toán tham lam. Vì vậy, người dùng được phép gõ vào bao nhiêu thay đổi anh ta hoặc cô ấy đang còn nợ với USD và xu, một số loại điểm nổi giá trị có thể. Và sau đó bạn phải làm toán và tìm ra thuật toán, tốt, bao nhiêu đồng tiền tôi có thể cung cấp bạn tối thiểu để cung cấp cho bạn chính xác rằng số lượng thay đổi. Nhưng có sẽ là một vài phần khó hiểu ở đây, phải không? Giống như có cả vấn đề không rõ ràng. MARIA: Chính xác. Vì vậy, điểm nổi giá trị có tính thiếu chính xác. Chúng ta đã nói về điều này trong bài giảng hôm nay? DAVID Malan: Chúng tôi đã làm việc lần cuối cùng trong bài giảng. Chúng tôi nói về sự thiếu chính xác. Và bạn không muốn để lừa người sử dụng bao nhiêu sự thay đổi người đó được nợ. Và như vậy các hương, trong các vấn đề thiết lập đặc điểm kỹ thuật, đưa ra một số suy nghĩ, cuối cùng, như để làm thế nào bạn có thể giảm thiểu những sự thiếu chính xác lỗi, có khả năng. Nó có thể tránh được, chắc chắn, cho các yếu tố đầu vào, chúng tôi đang nói về. Và, trên thực tế, pennies-- có lẽ chúng ta sẽ hoãn đến Zamyla, Tôi nghĩ rằng, đối với các thủ đoạn đó. Vì vậy, cuối cùng, bạn sẽ tìm thấy một sự tiến triển của các vấn đề trong tuần này, người đầu tiên trong số đó là khá nhỏ, sau đó trung bình, lớn hơn sau đó một chút. Nhưng tất cả chúng sử dụng các tòa nhà khối so với tuần vừa qua, từ supersection này, vấn đề thiết lập đặc điểm kỹ thuật đặt bạn vào vô số tài nguyên. Nhưng vẫn còn, nếu ở tất cả đấu tranh, đặc biệt là trong số những người ít thoải mái không có nền trước, đến giờ văn phòng vào thứ hai, thứ ba và Thứ tư và thứ năm. Tới CS50 Thảo luận thông qua website của khóa học, thông qua đó bạn có thể trò chuyện với đội ngũ nhân viên và các bạn cùng lớp. Nhưng cuối cùng, tôi nghĩ rằng Lời khuyên tốt nhất là chỉ cần bắt đầu sớm. Nó không phải là loại của lớp đó bạn nên được bắt đầu vào ngày thứ Tư psets ban đêm, hoặc tệ hơn đêm thứ năm. MARIA: lời khuyên tốt nhất của tôi là đã bắt đầu vào ngày thứ Hai. DAVID Malan: Thứ Hai. Vì vậy, nếu bạn không bắt đầu already-- không. Nhưng thậm chí nếu không thứ hai, sau đó thứ ba. Càng sớm càng tốt. Và đó là lý do các Tất nhiên có rất nhiều ngày cuối là để cung cấp cho bạn một chút của một áp lực tâm lý để bắt đầu sớm hơn, nhưng vẫn để cho điều trượt khi mọi thứ mất nhiều thời gian hơn bạn mong đợi. MARIA: Và bạn muốn sử dụng giờ làm việc nhiều như bạn có thể, quá. DAVID Malan: Bất kỳ câu hỏi? Được rồi. Vâng, tại sao chúng ta không hoãn lại ở đây?