-
Notifications
You must be signed in to change notification settings - Fork 62
/
11.html
211 lines (202 loc) · 13.7 KB
/
11.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
<link href='stylesheets/fonts.css' rel='stylesheet' type='text/css'>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="twitter:creator" content="@lzsthw">
<title>Learn C The Hard Way</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href='stylesheets/pure.css' rel='stylesheet'>
<link href='stylesheets/pygments.css' rel='stylesheet'>
<link href='stylesheets/main.css' rel='stylesheet'>
<link href='stylesheets/nav.css' rel='stylesheet'>
<style>
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.11: http://docutils.sourceforge.net/" />
<title>Exercise 11: While-Loop And Boolean Expressions</title>
</head>
<body id='wrapper'>
<div class='master-logo-wrapper clearfix'>
<a href='index.html'>
<div class='master-logo-sprite'></div>
</a>
<span class='edition-3'><img src='images/beta-edition-cloud.png' /></span>
</div><!-- /.master-logo-wrapper -->
<div style='clear: both;'>
<div id="main">
<div class='chapters-wrapper'>
<nav id='chapters'>
<div class='masthead-title'></div>
<ul class='masthead'>
<li>
<a href='/book/'>
<div class='nav-tcontents'>
<img src='images/nav-contents.png' /></br>
main
</div>
</a>
</li>
<li>
<a href='' id='prev_link'>
<div class='nav-previous'>
<img src='images/nav-previous.png' /></br>
previous
</div>
</a>
</li>
<li>
<a href='' id='next_link'>
<div class='nav-next'>
<img src='images/nav-next.png' /></br>
next
</div>
</a>
</li>
<li><!-- AMBULANCE ICON -->
<a href='help.html' id=''>
<div class='ambulance'>
<img src='images/help-ambulance.png' /></br>
help
</div>
</a>
</li>
<li id="follow">
<a href="https://twitter.com/lzsthw" class="twitter-follow-button" data-show-count="false" data-show-screen-name="false" data-dnt="true">Follow @lzsthw</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
</li>
</ul><!-- /.masthead -->
<!--<img src='images/fa-bullhorn.png' />-->
</nav><!-- /.chapters -->
</div><!-- /.chapters-wrapper -->
<!--- RST STARTS -->
<h1 class="title">Exercise 11: While-Loop And Boolean Expressions</h1>
<p>You've had your first taste of how C does loops, but the boolean
expression <tt class="docutils literal">i < argc</tt> might have not been clear to you. Let me
explain something about it before we see how a <tt class="docutils literal"><span class="pre">while-loop</span></tt>
works.</p>
<p>In C, there's not really a "boolean" type, and instead any integer
that's 0 is "false" and otherwise it's "true". In the last exercise
the expression <tt class="docutils literal">i < argc</tt> actually resulted in 1 or 0, not
an explicit <tt class="docutils literal">True</tt> or <tt class="docutils literal">False</tt> like in Python. This is
another example of C being closer to how a computer works, because
to a computer truth values are just integers.</p>
<p>Now you'll take and implement the same program from the last exercise
but use a <tt class="docutils literal"><span class="pre">while-loop</span></tt> instead. This will let you compare the
two so you can see how one is related to another.</p>
<div class="highlight"><pre><a name="code--ex11.c-pyg.html-1"></a><span class="cp">#include <stdio.h></span>
<a name="code--ex11.c-pyg.html-2"></a>
<a name="code--ex11.c-pyg.html-3"></a><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
<a name="code--ex11.c-pyg.html-4"></a><span class="p">{</span>
<a name="code--ex11.c-pyg.html-5"></a> <span class="c1">// go through each string in argv</span>
<a name="code--ex11.c-pyg.html-6"></a>
<a name="code--ex11.c-pyg.html-7"></a> <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<a name="code--ex11.c-pyg.html-8"></a> <span class="k">while</span><span class="p">(</span><span class="n">i</span> <span class="o"><</span> <span class="n">argc</span><span class="p">)</span> <span class="p">{</span>
<a name="code--ex11.c-pyg.html-9"></a> <span class="n">printf</span><span class="p">(</span><span class="s">"arg %d: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<a name="code--ex11.c-pyg.html-10"></a> <span class="n">i</span><span class="o">++</span><span class="p">;</span>
<a name="code--ex11.c-pyg.html-11"></a> <span class="p">}</span>
<a name="code--ex11.c-pyg.html-12"></a>
<a name="code--ex11.c-pyg.html-13"></a> <span class="c1">// let's make our own array of strings</span>
<a name="code--ex11.c-pyg.html-14"></a> <span class="kt">char</span> <span class="o">*</span><span class="n">states</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
<a name="code--ex11.c-pyg.html-15"></a> <span class="s">"California"</span><span class="p">,</span> <span class="s">"Oregon"</span><span class="p">,</span>
<a name="code--ex11.c-pyg.html-16"></a> <span class="s">"Washington"</span><span class="p">,</span> <span class="s">"Texas"</span>
<a name="code--ex11.c-pyg.html-17"></a> <span class="p">};</span>
<a name="code--ex11.c-pyg.html-18"></a>
<a name="code--ex11.c-pyg.html-19"></a> <span class="kt">int</span> <span class="n">num_states</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
<a name="code--ex11.c-pyg.html-20"></a> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// watch for this</span>
<a name="code--ex11.c-pyg.html-21"></a> <span class="k">while</span><span class="p">(</span><span class="n">i</span> <span class="o"><</span> <span class="n">num_states</span><span class="p">)</span> <span class="p">{</span>
<a name="code--ex11.c-pyg.html-22"></a> <span class="n">printf</span><span class="p">(</span><span class="s">"state %d: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">states</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<a name="code--ex11.c-pyg.html-23"></a> <span class="n">i</span><span class="o">++</span><span class="p">;</span>
<a name="code--ex11.c-pyg.html-24"></a> <span class="p">}</span>
<a name="code--ex11.c-pyg.html-25"></a>
<a name="code--ex11.c-pyg.html-26"></a> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<a name="code--ex11.c-pyg.html-27"></a><span class="p">}</span>
</pre></div><p>You can see from this that a <tt class="docutils literal"><span class="pre">while-loop</span></tt> is simpler:</p>
<pre class="literal-block">
while(TEST) {
CODE;
}
</pre>
<p>It simply runs the <tt class="docutils literal">CODE</tt> as long as <tt class="docutils literal">TEST</tt> is true (1).
This means that to replicate how the <tt class="docutils literal"><span class="pre">for-loop</span></tt> works we need to
do our own initializing and incrementing of <tt class="docutils literal">i</tt>.</p>
<div class="section" id="what-you-should-see">
<h1>What You Should See</h1>
<p>The output is basically the same, so I just did it a little different
so you can see another way it runs.</p>
<div class="highlight"><pre><a name="code--ex11.sh-session-pyg.html-1"></a><span class="gp">$</span> make ex11
<a name="code--ex11.sh-session-pyg.html-2"></a><span class="go">cc -Wall -g ex11.c -o ex11</span>
<a name="code--ex11.sh-session-pyg.html-3"></a><span class="gp">$</span> ./ex11
<a name="code--ex11.sh-session-pyg.html-4"></a><span class="go">arg 0: ./ex11</span>
<a name="code--ex11.sh-session-pyg.html-5"></a><span class="go">state 0: California</span>
<a name="code--ex11.sh-session-pyg.html-6"></a><span class="go">state 1: Oregon</span>
<a name="code--ex11.sh-session-pyg.html-7"></a><span class="go">state 2: Washington</span>
<a name="code--ex11.sh-session-pyg.html-8"></a><span class="go">state 3: Texas</span>
<a name="code--ex11.sh-session-pyg.html-9"></a><span class="gp">$</span>
<a name="code--ex11.sh-session-pyg.html-10"></a><span class="gp">$</span> ./ex11 <span class="nb">test </span>it
<a name="code--ex11.sh-session-pyg.html-11"></a><span class="go">arg 0: ./ex11</span>
<a name="code--ex11.sh-session-pyg.html-12"></a><span class="go">arg 1: test</span>
<a name="code--ex11.sh-session-pyg.html-13"></a><span class="go">arg 2: it</span>
<a name="code--ex11.sh-session-pyg.html-14"></a><span class="go">state 0: California</span>
<a name="code--ex11.sh-session-pyg.html-15"></a><span class="go">state 1: Oregon</span>
<a name="code--ex11.sh-session-pyg.html-16"></a><span class="go">state 2: Washington</span>
<a name="code--ex11.sh-session-pyg.html-17"></a><span class="go">state 3: Texas</span>
<a name="code--ex11.sh-session-pyg.html-18"></a><span class="gp">$</span>
</pre></div></div>
<div class="section" id="how-to-break-it">
<h1>How To Break It</h1>
<p>In your own code you should favor <tt class="docutils literal"><span class="pre">for-loop</span></tt> constructs over
<tt class="docutils literal"><span class="pre">while-loop</span></tt> because a <tt class="docutils literal"><span class="pre">for-loop</span></tt> is harder to break. Here's a few
common ways:</p>
<ul class="simple">
<li>Forget to initialize the first <tt class="docutils literal">int i;</tt> so have it
loop wrong.</li>
<li>Forget to initialize the second loop's <tt class="docutils literal">i</tt> so that it
retains the value from the end of the first loop. Now your
second loop might or might not run.</li>
<li>Forget to do a <tt class="docutils literal">i++</tt> increment at the end of the loop
and you get a "forever loop", one of the dreaded problems
of the first decade or two of programming.</li>
</ul>
</div>
<div class="section" id="extra-credit">
<h1>Extra Credit</h1>
<ul class="simple">
<li>Make these loops count backward by using <tt class="docutils literal"><span class="pre">i--</span></tt> to start
at <tt class="docutils literal">argc</tt> and count down to 0. You may have to do some
math to make the array indexes work right.</li>
<li>Use a while loop to <em>copy</em> the values from <tt class="docutils literal">argv</tt>
into <tt class="docutils literal">states</tt>.</li>
<li>Make this copy loop never fail such that if there's too many
<tt class="docutils literal">argv</tt> elements it won't put them all into <tt class="docutils literal">states</tt>.</li>
<li>Research if you've really copied these strings. The answer may
surprise and confuse you though.</li>
</ul>
</div>
<!-- RST ENDS -->
</div><!-- /#main -->
<div class='ad-deck gold' id="footer">
<ul class='retailers clearfix'>
<li>
<a href='http://learnpythonthehardway.org/'>
<div class='retailer-name'>Interested In Python?</div>
<div class='book-type'>Python is also a great language.</div>
<div class='book-price'>Learn Python The Hard Way</div>
</a>
</li>
<li>
<a href='http://learnrubythehardway.org/book/'>
<div class='retailer-name'>Interested In Ruby?</div>
<div class='book-type'>Ruby is also a great language.</div>
<div class='book-price'>Learn Ruby The Hard Way</div>
</a>
</li>
</ul><!-- /.places -->
</div><!-- /#ad-deck -->
<script src="./javascripts/jquery.js"></script>
<script src="./index.js"></script>
<script src="https://paydiv.io/static/jzed.js"></script>
<script src="./javascripts/app.js"></script>
</body>
</html>