程序設計導論-2 函數與控制流 偽代碼實現

分支結構

循環結構

求近似的圓周率

C

#include<stdio.h>
#include<math.h>
int main(){
    int n;
    scanf("%d",&n);
    double pi = 0;
    double cnt = 0;
    double item = 1;
    while(fabs(item)>pow(0.1,n)){
        item = pow(-1,cnt)/(2*cnt+1);
        pi = pi + item *4;
        cnt = cnt + 1;
    }
    printf("%lf",pi);
    return 0;
}

C++

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int n;
    cin>>n;
    double pi = 0;
    double cnt = 0;
    double item = 1;
    while(fabs(item)>pow(0.1,n)){
        item = pow(-1,cnt)/(2*cnt+1);
        pi = pi + item *4;
        cnt = cnt + 1;
    }
    cout<<pi<<end;
    return 0;
}

Java

public class piapprox{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        double pi = 0;
        double cnt = 0;
        double item = 1;
        while(Math.abs(item)>Math.pow(0.1,n)){
            item = Math.pow(-1,cnt)/(2*cnt+1);
            pi = pi + item *4;
            cnt = cnt + 1;
        }
        System.out.println(pi);
    }
}

Python

n = int(input())
pi = 0.
cnt = 0.
item = 1
while abs(item) > pow(0.1,n):
    item = pow(-1,cnt)  /(2*cnt+1)
    pi = pi + item*4
    cnt = cnt +1
print(pi)

求近似的自然對數e

C

#include<stdio.h>
#include<math.h>
int prod(int n){
    int prd = 1;
    for(int i = 1; i<= n;i++){
        prd = prd * i;
    }
    return prd;
}
int main(){
    int n;
    scanf("%d",&n);
    double e = 0;
    int cnt = 0;
    double item = 1;
    while(fabs(item)>pow(0.1,n)){
        item = 1.0 / prod(cnt);
        e = e + item;
        cnt = cnt + 1;
    }
    printf("%lf",e);
    return 0;
}

C++

#include<iostream>
#include<cmath>
using namespace std;
int prod(int n){
    int prd = 1;
    for(int i = 1; i<= n;i++){
        prd = prd * i;
    }
    return prd;
}
int main(){
    int n;
    cin>>n;
    double e = 0;
    int cnt = 0;
    double item = 1;
    while(fabs(item)>pow(0.1,n)){
        item = 1.0 / prod(cnt);
        e = e + item;
        cnt = cnt + 1;
    }
    cout<<e<<endl;
    return 0;
}

Java

public class eapprox{
    public static int prod(int n){
        int prd = 1;
        for(int i = 1; i<= n;i++){
            prd = prd * i;
        }
        return prd;
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        double e = 0;
        int cnt = 0;
        double item = 1;
        while(Math.abs(item)>Math.pow(0.1,n)){
            item = 1.0 / prod(cnt);
            e = e + item;
            cnt = cnt + 1;
        }
        System.out.println(e);
    }
}

Python

def prod(n):
    prd = 1.0
    for i in range(1,n+1):
        prd = prd * i
    return prd
n = int(input())
e = 0
cnt = 0
item = 1
while abs(item) > pow(0.1,n):
    item = 1.0  /prod(cnt)
    e = e + item
    cnt = cnt +1
print(e)

遞歸

斐波那契數列

C

#include<stdio.h>
#include<math.h>
int fib(int n){
    if(n==1){
        return 1;
    }
    if(n==2){
        return 1;
    }
    return fib(n-1)+fib(n-2);
}
int main(){
    int n;
    scanf("%d",&n);
    printf("%d",fib(n));
    return 0;
}

C++

#include<iostream>
#include<cmath>
using namespace std;
int fib(int n){
    if(n==1){
        return 1;
    }
    if(n==2){
        return 1;
    }
    return fib(n-1)+fib(n-2);
}
int main(){
    int n;
    cin>>n;
    cout<<fib(n)<<endl;
    return 0;
}

Java

public class fib{
    public static int fib(int n){
        if(n==1){
            return 1;
        }
        if(n==2){
            return 1;
        }
        return fib(n-1)+fib(n-2);
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(fib(n));
    }
}

Python

nin = int(input())
def fib(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    return fib(n-1) + fib(n-2)
print(fib(nin))

分治

二分搜索

C

#include<stdio.h>
#include<math.h>
int binarysearch(int arr[],int l,int r,int x){
    int mid = l+r/2;
    if (arr[mid]==x){
        return mid;
    }
    if (l >= r)
        return -1;
    else if(arr[mid] >x){
        return binarysearch(arr,l,mid-1,x);
    }
    else
        return binarysearch(arr,mid+1,r,x);
}
int main(){
    int n;
    int arr[1000];
    int x;
    scanf("%d",&n);
    for(int i = 0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    scanf("%d",&x);
    printf("%d",binarysearch(arr,0,n,x));
    return 0;
}

C++

#include<iostream>
#include<cmath>
using namespace std;
int binarysearch(int arr[],int l,int r,int x){
    int mid = l+r/2;
    if (arr[mid]==x){
        return mid;
    }
    if (l >= r)
        return -1;
    else if(arr[mid] >x){
        return binarysearch(arr,l,mid-1,x);
    }
    else
        return binarysearch(arr,mid+1,r,x);
}
int main(){
    int n;
    int arr[1000];
    int x;
    cin>>n;
    for(int i = 0;i<n;i++){
        cin>>arr[i];
    }
    cin>>x;
    cout<<binarysearch(arr,0,n-1,x)<<endl;
    return 0;
}

Java

class binarysea{
    public static int binarysearch(int arr[],int l,int r,int x){
        int mid = (l+r)/2;
        if (arr[mid]==x){
            return mid;
        }
        else if (l >= r){
            return -1;
        }
        else if(arr[mid] >x){
            return binarysearch(arr,l,mid-1,x);
        }
        else
            return binarysearch(arr,mid+1,r,x);
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int arr[] = new int[1000];
        for(int i = 0;i<n;i++){
            arr[i]=sc.nextInt();
        }
        int x = sc.nextInt();
        System.out.println(binarysearch(arr,0,n,x));
    }
}

Python

arr = input().split(" ")
x = input()
def binarysearch(arr,l,r,x):
    mid = int((l + r)/2)
    if arr[mid] == x:
        return mid
    elif l >= r:
        return -1
    elif arr[mid] > x:
        return binarysearch(arr,l,mid-1,x)
    else :
        return binarysearch(arr,mid+1,r,x)
print(binarysearch(arr,0,len(arr)-1,x))

回溯--圖的遍歷

輸入
6 6 //圖的大小
# # # # # #
# * * # * #
# # * * * #
# * * # * #
# # # * * #
# # # # # #
3 3 // 起始點

C

#include<stdio.h>
int visited[1000][1000];
char graph[1000][1000];
int detect(int x,int y){
    if(visited[x][y]!= 1 && graph[x][y] != '#')    return 1;
    else return 0;
}
void huisu(int x,int y){
    visited[x][y] = 1;
    printf("%d %d\n",x,y);
    int arr[4][2] = {{x+1,y},{x-1,y},{x,y+1},{x,y-1}};
    for(int i = 0;i < 4;i++){
        if(detect(arr[i][0],arr[i][1])){
            huisu(arr[i][0],arr[i][1]);//!??!
        }
    }
}
int main(){
    int m,n;
    scanf("%d %d",&m,&n);
    for(int i = 0;i < m;i++){
        for(int j = 0;j<n;j++){
            scanf(" %c",&graph[i][j]);
        }
    }
    int st_x,st_y;
    scanf("%d %d",&st_x,&st_y);
    huisu(st_x,st_y);
}

C++

#include<iostream>
#include<cmath>
using namespace std;
int visited[1000][1000];
char graph[1000][1000];
int detect(int x,int y){
    if(visited[x][y]!= 1 && graph[x][y] != '#')    return 1;
    else return 0;
}
void huisu(int x,int y){
    visited[x][y] = 1;
    cout<<x<<" "<<y<<endl;
    int arr[4][2] = {{x+1,y},{x-1,y},{x,y+1},{x,y-1}};//!?。?    for(int i = 0;i < 4;i++){
        if(detect(arr[i][0],arr[i][1])){
            huisu(arr[i][0],arr[i][1]);
        }
    }
}
int main(){
    int m,n;
    cin>>m>>n;
    for(int i = 0;i < m;i++){
        for(int j = 0;j<n;j++){
            cin>>graph[i][j];
        }
    }
    int st_x,st_y;
    cin>>st_x>>st_y;
    huisu(st_x,st_y);
}

Java

import java.util.Scanner;
public class graphgothr{
    public static int visited[][] = new int[1000][1000];
    public static char graph[][] = new char[1000][1000];
    public static boolean detect(int x,int y){
        if(visited[x][y]!= 1 && graph[x][y] != '#')    return true;
        else return false;
    }
    
    public static void huisu(int x, int y) {
        visited[x][y] = 1;
        System.out.println(x + " " + y);
        int arr[][] = { { x + 1, y }, { x - 1, y }, { x, y + 1 }, { x, y - 1 } };//?。。?        for (int i = 0; i < 4; i++) {
            if (detect(arr[i][0], arr[i][1])) {
                huisu(arr[i][0], arr[i][1]);
            }
        }
    }

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                graph[i][j] = sc.next().toCharArray()[0];
            }
        }
        int st_x = sc.nextInt();
        int st_y = sc.nextInt();
        huisu(st_x, st_y);
    }
}

Python

m,n = [ int(i) for i in input().split()]
graph = [ [j for j in input().split()] for i in range(m)]
st_x ,st_y =  [ int(i) for i in input().split()]
visited = [[0 for j in range(n)]for i in range(m)]
def detect(x,y):
    global visited,graph,m,n
    if visited[x][y] != 1 and graph[x][y] != '#':
        return True
    else:
        return False
def huisu(x,y):
    global visited,graph,m,n
    visited[x][y] = 1
    print(x,y)
    diec = [(x+1,y),(x-1,y),(x,y+1),(x,y-1)]#?。?!
    for i in range(4):
        if detect(diec[i][0],diec[i][1]):
            huisu(diec[i][0],diec[i][1])
huisu(st_x,st_y)

通用額外問題

  1. 掌握控制流。
  2. 掌握全局變量的使用。
  3. 掌握遞歸。
  4. 了解程序中標注了?。?!的地方的使用技巧。
  5. 了解如何用遞歸樹和主定理判斷程序復雜度。
  6. 了解分治和回溯。

語言特性問題

C

  1. 了解math.h里的內容。
  2. 掌握浮點數的使用及浮點數運算時會出現的問題(提示:2進制表示方法)。
  3. 理解scanf(" %c",&graph[i][j])這段" %c"的處理方式。
  4. 了解C語言的字符處理。
  5. 掌握C語言利用函數返回值作為判斷條件的使用。

C++

  1. 了解cmath里的內容。
  2. 掌握浮點數的使用及浮點數運算時會出現的問題(提示:2進制表示方法)。
  3. 了解C++的字符處理。
  4. 了解C++的泛型。
  5. 掌握C++里的Boolean變量。

Java

  1. 了解java.Math的內容。
  2. 掌握浮點數的使用及浮點數運算時會出現的問題(提示:2進制表示方法)。
  3. 理解"graph[i][j] = sc.next().toCharArray()[0]"這段的處理方式。
  4. 掌握java里的靜態方法。
  5. 了解java里的String對應的方法。
  6. 掌握java里的Boolean變量。

Python

  1. 掌握python的浮點數處理。
  2. 掌握其中的列表推導式。
  3. 掌握python的global關鍵字。
  4. 掌握python的True、False表示。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容