从现实问题到计算机程序(Week 5)

总结回顾

计算机只能按照程序去执行,不可能自己“想出”一个解决问题的方法

面对一个问题,你必须自己找到解决方案,才有可能做出相应的程序

所以,没有解决方案的时候,不要急着动手写程序

  • 切饼

    • 假设:有一张足够大的饼,有一把足够长的刀
    • 要求:每次切一刀
    • 问题:n刀最多能切出多少块饼
    • 结论:q(n)=q(n-1)+n ⬅️这个解决方案是计算机“想”不出来的

现有构想再写程序

问题➡️解决方案:思考

解决方案➡️程序:描述

结构化程序设计中,总是按照“先粗后细,先抽象后具体“的办法,对索要描述的解决方案进行穷尽分解,知道分解为顺序、分支、循环三种结构

写程序前,先构思好程序的结构,可以先写出程序轮廓,再后补变量定义等细节

事例

  • 鸡兔同笼问题

    • 问题描述:一个笼子里面关了鸡和兔子,已知脚数a,问笼子里面至少有多少动物,至多有多少种动物

    • 输入&输出

      2➡️0 0

      3➡️0 0

      20➡️5 10

#include<iostream>
using namespace std;
int main()
{
int nCases,i,nFeet;
cin>>nCases;
for(i=0;i<nCases;i++)
{
cin>>nFeet;
if(nFeet%2!=0)
cout<<"0 0"<<endl;
else if(nFeet%4!=0)
cout<<nFeet/4+1<<" "<<nFeet/2<<endl;
ekse
cout<<nFeet/4<<" "<<nFeet/2<<endl;
}
return 0;
}
  • 百元买百鸡问题

    • 问题描述:假定小鸡每只0.5元,公鸡每只2元,母鸡每只3元。现在有100元要求买100只鸡,编程列出所有可能的购机方案。
    • 穷举法:将可能出现的各种情况一一测试,判断是否满足条件。
#include<iostream>
using namespace std;
int main()
{
int x,y,z;
cout<<"\t 母鸡\t\t 公鸡\t\t 小鸡"<<endl;
for(x=0;x<=33;x++)
for(y=0;y<=50;y++)
for(z=0;z<=100;z++)
{
if((x+y+z)== 100)
if((3*x+2*y+0.5*z)==100)
cout<<"\t"<<x<<"\t\t"<<y<<"\t\t"<<z<<endl;
}
return 0;
}
//可简化一层循环:z=100-x-y
  • 分出奇偶数

    • 问题描述:从键盘上输入10个整数,请将其中的奇数和偶数识别出来,分别放入不同的数组中并输出
    • 输入示例:23 34 65 43 67 12 67 341 61 34
    • 输出示例:
      • 奇数:23 65 43 67 67 341 61
      • 偶数:34 12 34
#include<iostream>
using namespace std;
int main()
{
int all[10],odd[10],even[10];
int i = 0; j = 0;
for(; i<10; i++)
cin>>all[i];
int numOdd = 0;
int numEven = 0;
for(i = 0; i < 10; i++)
{
if(all[i] % 2 != 0)
{
odd[numOdd] = all[i];
numOdd++;
}
else
{
even[numEven] = all[i];
numEven++;
}
}
for(i = 0;i < numOdd;i++)
cout<<odd[i]<<" ";
for(i = 0;i < numEven;i++)
cout<<even[i]<<" ";
return 0;
}
  • 整数排序

    • 问题描述:从键盘上输入10个整数,请按照从大到小的顺序将他们排列好,并按新的次序输出到屏幕上
    • 输入示例:23 34 65 43 67 12 67 341 61 34
    • 输出示例:341 67 67 65 61 43 34 34 23 12
    • 选择排列:最简单的排列方式
#include<iostream>
using namespace std;
int main()
{
int a[10];
int i=0,j=0;
int temp = 0;
for(i = 0;i < 10; i++)
cin>>a[i];
for(i=0;i<0;i++)
for(j=i+1;j<10;j++)
{
if(a[j]>a[i])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
for(i = 0;i < 10; i++)
cout<<a[i]<<" ";
return 0;
}
  • 整数奇偶排序

    • 问题描述:输入10个0~100之间的不同整数,彼此以空格分割重新排序以后输出(也按空格分割)

    • 要求:1.先输出其中的奇数,并按从大到小排列;

      ​ 2.然后输出其中的偶数,并按从小到大排列。

#include<iostream>
using namespace std;
int main()
{
int all[10],odd[10],even[10];
int i=0,j=0;
for(; i<10;i++)
cin>>all[i];
int numOdd = 0;
int numEven = 0;
for(i = 0; I , 10; I++){
if(all[i]%2 !=0)
{
odd[numOdd] = all[i];
numOdd++;
}
else
{
even[numEven] = all[i];
numEven++;
}
}
for(i = 0; i<numOdd-1;i++){
for(j = i;j<numOdd;j++)
{
if(odd[j]>odd[i])
{
int tmp = odd[i];
odd[i] = odd[j];
odd[j] = tmp;
}
}
}
for(i = 0; i < numEven - 1; i++)
{
for(j = i; j < numEven;j++)
{
if(even[j]<even[i])
{
int temp = even[j];
even[j] = even[i];
even[i] = temp;
}
}
}
for(i = 0; i < numOdd; i++)
cout<<odd[i]<<" ";
for(i = 0; i < numEVen; i++)
cout<<even[i]<<" ";
return 0;
}

结构化程序的基本思想

  • 程序由若干个模块组成
  • 模块之内高内聚
  • 模块之间低耦合

作业题

Quiz 1 晶晶赴约会

#include <iostream>
using namespace std;
int main() {
int a;
cin >> a;
if (a == 1 || a == 3 || a == 5)
cout << "NO" << endl;
else
cout << "YES" << endl;
return 0;
}

Quiz2 奇数求和

#include <iostream>
using namespace std;
int main() {
int m, n, result = 0;
cin >> m >> n;
while (m <= n) {
//对于m和n之间的每一个数, 如果它是奇数,那么就加入到我们的结果里。如果不是就跳过。
if (m % 2 == 1)
result += m;
m++;
}
//最后输出
cout << result << endl;
return 0;
}
//更快算法:若m为奇数,则循环+2求和至大于等于n;若m为偶数,则先+1再循环+2求和至大于等于n

Quiz3 整数的个数

#include <iostream>
using namespace std;
int main(){
int k;
cin>>k;
int n1=0, n5=0, n10=0;
for (int i=0;i<k;i++){
int n;
cin>>n;
if (n == 1) n1++;
else if (n == 5) n5++;
else if (n == 10) n10++;
}
cout<<n1<<endl;
cout<<n5<<endl;
cout<<n10<<endl;
return 0;
}

Quiz4 1的个数

# include <iostream>
using namespace std; int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x, ans = 0;
cin >> x;
while (x > 0) {
ans += x % 2;
x /= 2;
}
cout << ans << endl;
}
return 0;
}
//这道题的解法就是反复地除以2,看最低位是1还是0。

Quiz5 数组逆序重放

#include <iostream>
using namespace std;
int a[100];
int main() {
int n;
cin >> n;
for (int i = 0; i<n; i++)
cin >> a[i];
while (n--) { //常用的倒序计数循环,等价于while(n-->0)
cout << a[n];
if (n > 0) cout << " "; //如果不是最后一个数那么就要用空格分隔开
}
return 0;
}
//顺序输入倒序输出,如果要求通过修改数组本身实现逆序重放,则使用临时变量temp,将首尾元素逐个交换即可。

Coursera课程笔记----计算导论与C语言基础----Week 5的更多相关文章

  1. Coursera课程笔记----计算导论与C语言基础----Week 6

    理性认识C程序 导论(Week 6) 明确学习进度 讲课内容 感性➡️理性➡️函数➡️指针等 作业练习 初级阶段 ➡️正常作业练习 C语言的由来 程序设计语言的分类 低级语言之机器语言 0010101 ...

  2. Coursera课程笔记----计算导论与C语言基础----Week 8

    C语言中的运算成分(Week 8) 赋值运算符 "="赋值运算符 给赋值号左边的变量赋予数值 在变量定义的同时可以为变量赋初值 要点一:两面类型不同 若=两边的类型不一致,赋值时要 ...

  3. Coursera课程笔记----计算导论与C语言基础----Week 7

    C语言中的数据成分(Week7) 内存 把内存想象成长带,带子上有许多方格,每个方格有8位(8bit) 2^10 = 1024 1B = 8 b 1KB = 1024Byte MB.GB.TB.PB- ...

  4. Coursera课程笔记----计算导论与C语言基础----Week 4

    感性认识计算机程序(Week 4) 引入 编程序 = 给计算机设计好运行步骤 程序 = 人们用来告诉计算机应该做什么的东西 问题➡️该告诉计算机什么?用什么形式告诉? 如果要创造一门"程序设 ...

  5. Coursera课程笔记----计算导论与C语言基础----Week 2

    计算机的历史与未来(Week 2) 计算机历史 早期计算机:手工计算器➡️机械计算器➡️计算机原型 现代计算机:电子管计算机➡️晶体管计算机➡️集成电路计算机➡️超大规模集成电路 早期的手工计算辅助工 ...

  6. Coursera课程笔记----计算导论与C语言基础----Week 9

    C语言中的控制成分(Week 9) 计算机程序的基本结构 任何具有单入口单出口的程序,都可以用顺序结构.分支结构.循环结构来表达 分支语句 在执行if语句前,先对表达式求解 if()内可以是任意的数值 ...

  7. Coursera课程笔记----计算导论与C语言基础----Week 3

    存储程序式计算机 冯·诺伊曼式计算机 "关于EDVAC的报告草案" 组成:控制器(协调工作).运算器(算数&逻辑运算).存储器(存储操作信息和中间结果).输入设备.输出设备 ...

  8. Coursera课程笔记----计算导论与C语言基础----Week 1

    计算机的基本原理(Week 1) 第一次数学危机 公元前500年,毕达哥拉斯学派,他们相信数是万物的本源:一切数均可表示成整数或者整数之比 然而毕达哥拉斯证明了勾股定理,某些直角三角形的三边比不能用整 ...

  9. Coursera课程笔记----计算导论与C语言基础----Week 12

    期末编程测试(Week 12) Quiz1 判断闰年 #include <iostream> using namespace std; int main() { int year; cin ...

  10. Coursera课程笔记----计算导论与C语言基础----Week 11

    C程序中的字符串(Week 11) 字符数组 所有的字符串,都是以\0结尾的 只能在数组定义并初始化的时候:char c[6] = "China"; 不能用赋值语句将一个字符串常量 ...

随机推荐

  1. 【Java】封装、继承、多态

    封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代 ...

  2. java nio消息半包、粘包解决方案

    问题背景 NIO是面向缓冲区进行通信的,不是面向流的.我们都知道,既然是缓冲区,那它一定存在一个固定大小.这样一来通常会遇到两个问题: 消息粘包:当缓冲区足够大,由于网络不稳定种种原因,可能会有多条消 ...

  3. JUC并发编程基石AQS源码之结构篇

    前言 AQS(AbstractQueuedSynchronizer)算是JUC包中最重要的一个类了,如果你想了解JUC提供的并发编程工具类的代码逻辑,这个类绝对是你绕不过的.我相信如果你是第一次看AQ ...

  4. Python 开发工具推荐

    对于开发工具,仁者见仁智者见智,关键是自己喜欢,用着顺手就好,不用刻意去追求别人用的是什么工具. 这里给大家主要推荐三款工具,分别是PyCharm.Sublime Text 3.VS Code,因为这 ...

  5. 数据结构(C语言版)---线性表链式存储表示

    1.单链表:线性表的链式存储. 1)特点:用一组任意的存储单元存储数据元素(存储单元可以连续,也可以不连续),逻辑上相邻的元素存储位置不一定相邻. 2)结点包括两个域:数据域(存储数据元素信息).指针 ...

  6. stand up meeting for beta release plan 12/16/2015

    今天我们开会讨论一下beta版需要的feature,其中待定的feature是可选做的,如果有时间.其他都是必须实现的. 因为做插件的计划失败了,所以我们现在是pdf阅读器和取词查词加入生词本这两部分 ...

  7. 2020i春秋新春战疫

    简单的招聘系统 登陆这里就可以注入 查询这里也可以注入 从登陆这里注入把 爆破数据库名 爆破表名 列名 flag 就很奇怪跑出来的东西 重开容器跑一遍列,估计是flaaag.后面可能是发生了502 再 ...

  8. Os-hackNos-1靶机过关记录

    靶机地址:172.16.1.198(或112)  kali地址:172.16.1.108 1 信息收集 靶机界面如下 简单查看 OS:Ubuntu Web:Apache2.4.18 尝试端口扫描 开放 ...

  9. Springboot:修改默认端口以及Logo(三)

    端口修改 在application.yml文件中增加端口的配置: server: port: 8081 Logo修改 Logo生成网址: https://www.bootschool.net/asci ...

  10. cgi、fastCGI、php-fpm、 php-CGI的区别

    cgi.fastCGI.php-fpm. php-CGI的区别 作为面试的高频热点问题,必须来一波记录: 我们发送一个请求到收到响应之间的一个过程是什么? 如果客户端请求的是 index.html,那 ...