高中信息技术(Python) 选择性必修1 数据与数据结构 源代码

选择性必修1 数据与数据结构部分,即普通高校招生选考科目考试(选考)内容。

本文章原文地址:https://www.cnblogs.com/BobHuang/p/16697303.html,原文体验更佳

第一章 数据与数据的组织

1.1 数据

1.2数据的组织

第二章 数组与链表

2.1数组

P35 统计分数
创建原始分的一维数组

s=[0]*9
print(s)

创建棋盘二维数组的方式1 直接定义

qp=[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]
for i in range(4):
    print(qp[i])

创建棋盘二维数组的方式2 间接定义

qp=[[0 for i in range(4)]for j in range(4)]
for i in range(4):
    print(qp[i])

P37 例2 基于数组实现数据合并的功能

from random import randint
a=[0]*20
b=[0]*15
c=[0]*35
a[0]=randint(95, 100)
for i in range(1,20):
    a[i]=a[i-1]-randint(1, 5)
b[0]=randint(95, 100)
for i in range(1,15):
    b[i]=b[i-1]-randint(1, 5)
print("原始数据序列一为:")
print(a)
print("原始数据序列二为:")
print(b)
i=0
j=0
k=0
while(i<20 and j<15):
    if a[i]>=b[j]:
        c[k]=a[i]
        i=i+1
        k=k+1
    else:
        c[k]=b[j]
        j=j+1
        k=k+1
while i<20:
    c[k]=a[i]
    i=i+1
    k=k+1
while j<15:
    c[k]=b[j]
    j=j+1
    k=k+1
print("合并后的数据序列为:")
print(c)

更新棋盘二维数组信息

qp=[[0 for i in range(4)] for j in range(4)]
qp[1][2]=1
for i in range(4):
    print(qp[i])

P89 例3 基于数组的车牌摇号系统功能实现

from random import randint
luck=[""]*20
csv_file=open("bh.csv","r")
flines=csv_file.readlines()
csv_file.close()
i=0
for one_line in flines:
    tmp=one_line.strip('\n')
    luck[i]=tmp
    i=i+1
m=int(input("请输入发放数:"))
c=0
while c<m:
    k=randint(0, 19)
    if luck[k]!="":
        c=c+1
        print(luck[k])
        luck[k]=""

2.2链表

P47 例1 基于链表实现数据合并功能

from random import randint
data_a=[]
head_a=-1
data_b=[]
head_b=-1
tmp=randint(95, 100)
data_a.append([tmp,head_a])
head_a=0
for i in range(1,20):
    tmp=data_a[i-1][0]-randint(1, 5)
    data_a.append([tmp,data_a[i-1][1]])
    data_a[i-1][1]=i
print("链表结构的原始数据序列一")
print(data_a)
tmp=randint(95, 100)
data_b.append([tmp,head_b])
head_b=0
for i in range(1,25):
    tmp=data_b[i-1][0]-randint(1, 5)
    data_b.append([tmp,data_b[i-1][1]])
    data_b[i-1][1]=i
print("链表结构的原始数据序列二")
print(data_b)
k_a=head_a
q_a=head_a
k_b=head_b
while (k_a!=-1 and k_b!=-1):
    if data_a[k_a][0]>=data_b[k_b][0]:
        q_a=k_a
        k_a=data_a[k_a][1]
    else:
        if k_a==head_a:
            data_a.append([data_b[k_b][0],head_a])
            head_a=len(data_a)-1
            q_a=head_a
            k_b=data_b[k_b][1]
        else:
            data_a.append([data_b[k_b][0],k_a])
            data_a[q_a][1]=len(data_a)-1
            q_a=data_a[q_a][1]
            k_b=data_b[k_b][1]
while k_b!=-1:
    data_a.append([data_b[k_b][0],-1])
    data_a[q_a][1]=len(data_a)-1
    q_a=data_a[q_a][1]
    k_b=data_b[k_b][1]
print("链表结构合并后数据序列")
print(data_a)
print("按链表链接顺序输出数据序列")
tmp=head_a
while data_a[tmp][1]!=-1:
    print(data_a[tmp][0],end=" ")
    tmp=data_a[tmp][1]
print(data_a[tmp][0])

P49 例2 约瑟夫问题

llist=[]
n=int(input("请输入参与人数(N):"))
m=int(input("请输入淘汰数(M):"))
for i in range(n-1):
    llist.append([i+1,i+1])
llist.append([n,0])
head=0
long=n
k=head
i=1
while long > 1:
    i=i+1
    if i==m:
        t=llist[k][1]
        llist[k][1]=llist[t][1]
        if t==head:
            head=llist[k][1]
        i=1
        long=long-1
    k=llist[k][1]
print(llist[head][0])

P50 拓展链接 链表的类实现
1.自定义单向链表的节点类

class LinkNode:                          #定义节点类LinkNode
    def __init__ (self,data,next_=None): #初始化节点包含两个区域self.data、self.next
        self.data=data                   #self.data区域保存数据
        self.next=next_                  #self.next区域保存指针

2.构建单向链表

class LinkList:                          #定义单向链表类LinkList
    def __init__(self):                  #初始化空链表
        self._head=None                  #空链表头指针指向为空

第三章 字符串、队列和栈

3.1字符串

P61 1.子串判断

S="Hello"
if ('H' in S):
    print("H在变量S中")
else:
    print("H不在变量S中")
for a in S:
    print(a,end='')

2.求子串

S="Hello World"
print(S[6:11])

3.字符串的连接

S1="Wor"
S2="ld"
S=S1+S2
print("连接后的字符串为:",S)

P63 例1 回文串

s=input("请输入一个字符串:")
length=len(s)
mid=length//2
left=s[0:mid]
temp=s[-mid:]
right=""
for i in range(len(temp)):
    right=right+temp[len(temp)-i-1]
if left==right:
    print("Yes")
else:
    print("No")
s=input("请输入一个字符串:")
s1=s[::-1]
if s==s1:
    print("Yes")
else:
    print("No")

P64 例2 机动车违章识别系统

import csv
f=open("车辆号码csv","r")
f_csv=csv.reader(f)
k=0
for row in f_csv:       #逐一枚举所有车辆信息
    k=k+1
    if k==1:
        print(row[0],"",row[1])
        continue
    car=row[0]
    name=row[1]
    w=row[3]
    week="12345"
    pos=0
    for letter in car:
        if letter >='A' and letter <='Z':
            if letter == 'B':
                pos=1
            break
    if pos ==0 and w!=6 and w!=7:
        print(car," ",name)
    if pos==1:
        i=len(car)
        while i>=0:
            i=i-1
            ch=car[i]
            if ch>='0' and ch<='9':
                break
        num=int(ch)
        if i<0:
            continue
        elif num==0:
            t=week[4]
        elif num<=5:
            t=week[int(ch)-1]
        else:
            t=week[9-int(ch)]
        if t==w:
            print(car," ",name)
f.close()

P66 拓展链接 正则表达式
检查字符串中是否出现过12位数的电话号码

def findphone(text):
    for i in range(0, len(text)):
        flag=True
        if text[i].isdecimal() and i<len(text)-12:
            for j in range(i+1, i+4):
                if not text[j].isdecimal():         #判断是否为数字 
                    flag=False
            if text[i+4]!='-':
                flag=False
            for j in range(i+5, i+13):
                if not text[j].isdecimal():
                    flag=False
            if flag:
                return text[i:i+13]
    else:
        return False
x=input("请输入一串字符")
result=findphone(x)
if result==False:
    print("没有找到电话号码")
else:
    print("电话号码为:",result)

使用正则表达式的写法

import re
phone=re.compile(r'\d\d\d\d-\d\d\d\d\d\d\d\d')
x=input("请输入一串字符")
mo=phone.search(x)
if mo:
    print("电话号码为:",mo.group())
else:
    print("没有找到电话号码")

3.2队列

P71 1.建队

head=0
tail=0
queue=[""]*4

P71 2.入队、出队

que[tail]="A"
tail=tail+1
que[tail]="B"
tail=tail+1
que[tail]="C"
tail=tail+1
que[tail]="D"
tail=tail+1

#出队
head=head+1

P70 拓展链接 循环队列

que=[""]*4
head=0
tail=0
que[tail]="A"
tail=(tail+1)%4
que[tail]="B"
tail=(tail+1)%4
que[tail]="C"
tail=(tail+1)%4
que[tail]="D"
tail=(tail+1)%4
print(que[head])   #元素"A"出队
head=(head+1)%4
print(que[head])   #元素"B"出队
head=(head+1)%4
print(que[head])   #元素"C"出队
head=(head+1)%4
print(que[head])   #元素"D"出队
head=(head+1)%4

P73 例1 信息的加密

s= input("请输入字符串:")
print("加密后的串为:")
que=[""]*100
head=0
tail=0
for i in range(len(s)):
    que[tail]=s[i]
    tail+=1
while head<tail:
    print(que[head],end="")
    head+=1
    if head<tail:
        que[tail]=que[head]
        tail+=1
        head+=1

P74 银行叫号排队系统

que=[-1]*1000
head=0
tail=0
print("请输入具体的操作编号:")
print("1.新到顾客(取号)")
print("2.下一个顾客(叫号)")
print("3.程序结束")
x=int(input())
while x!=3:
    if x==1:
        que[tail]=que[tail]+1
        print("您当前的号码为:A%d,需要等待的人数为%d"%(tail, tail-head))
        tail=tail+1
    if x==2:
        if head==tail:
            print("对不起,没有等待的客户")
        else:
            print("请A%d号客户准备,马上将为您办理业务。"%head)
            head=head+1
    x=int(input(“请输入操作\n"))

3.3栈

P77 1.建栈

top=-1
st=[""]*4

P77 2.入栈、出栈

top=top+1
s[top]="A"
top=top+1
s[top]="B"
top=top+1
s[top]="C"
top=top+1
s[top]="D"

#出栈
top=top-1

P79 十进制转二进制进出栈方式

st=[-1]*100
top=-1
number=int(input("请输入十进制整数:"))
while number >0:
    x=number %2
    top=top+1
    st[top]=x
    number=number//2
while top>=0:
    print(st[top],end="")
    top=top-1

P80 例1 括号匹配

st=[-1]*100
top=-1
flag=True
s=input("请输入数学计算式:")
for i in range(len(s)):
    if s[i]=="(":
        top=top+1
        st[top]=s[i]
    elif s[i]==")":
        if top==-1:
            flag=False
            break
        else:
            top=top-1
if top>=0:
    flag=False
if flag:
    print("括号匹配")
else:
    print("括号不匹配")

P81 拓展链接 用列表自带的函数和方法实现的栈

stacklist=[]            #建立一个空栈list
stacklist.append("A")   #字母A入栈
stacklist.append("B")   #字母B入栈
print(stacklist[1])     #输出栈顶元素,为字母B
print(len(stacklist))   #输出栈中元素的个数,为2
stacklist.pop()         #弹出栈顶元素
print(len(stacklist))   #输出栈中元素的个数,为1,是字母A

第四章 树

4.1 树与二叉树

4.2 二叉树的基本操作

* P101 实践与体验 二叉树遍历的Python程序实现

class Node:
    def __init__(self,value=None,left=None,right=None):
        self.value=value
        self.left=left
        self.right=right

def preTraverse(root):
    if root==None:
        return
    print(root.value)
    preTraverse(root.left)
    preTraverse(root.right)

def midTraverse(root):
    if root==None:
        return
    midTraverse(root.left)
    print(root.value)
    midTraverse(root.right)

def afterTraverse(root):
    if root==None:
        return
    afterTraverse(root.left)
    midTraverse(root.right)
    print(root.value)

if __name__=='__main__':
    root=Node('A',Node('B',Node('D'),Node('E')),Node('C',right=Node('F',Node('G'))))
    print('前序遍历')
    preTraverse(root)
    print('中序遍历')
    midTraverse(root)
    print('后序遍历')
    afterTraverse(root)

4.3 抽象数据类型

第五章 数据结构与算法

5.1 数据结构与算法的关系

5.2 迭代与递归

P119 迭代求平方根

a=int(input("请输入一个需要求其平方根的数:"))
x=a/2
while ((abs((x+a/x)/2-x))>0.00001):
    x=(x+a/x)/2
print(a,"的平方根约为",round((x+a/x)/2,6))

P120 拓展链接 欧几里得算法

def gcd(m,n):
    while n!=0:
        temp=n
        n=m%n
        m=temp
    return m

P121 递归求n的阶乘

def fac(n):
    if n==0:
        s=1
    else:
        s=n*fac(n-1)
    return s
print(fac(3))

P123 例1 汉诺塔游戏

def move(n, a, b, c):
    if(n==1):
        print(a, "->",c)
        return
    move(n-1, a, c, b)
    move(1, a, b, c)
    move(n-1, b, a, c)
move(3,"A","B","C")

* P125 实践与体验 走迷宫

maze = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1, 1, 0, 1, 1, 1, 0, 1, 0],
        [0, 1, 1, 0, 1, 1, 1, 0, 1, 0],
        [0, 1, 1, 1, 1, 0, 0, 1, 1, 0],
        [0, 1, 0, 0, 0, 1, 1, 1, 1, 0],
        [0, 1, 1, 1, 0, 1, 1, 1, 1, 0],
        [0, 1, 0, 1, 1, 1, 0, 1, 1, 0],
        [0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
        [0, 0, 1, 1, 1, 1, 1, 1, 1, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

def valid(maze, x, y):
    if(x >= 0 and x < len(maze) and y >= 0 and y < len(maze[0]) and maze[x][y] == 1):
        return True
    else:
        return False


def walk(maze, x, y):
    # 如果位置是迷宫的出口,
    if(x == 8 and y == 8):
        print("successful")
        return True
    if valid(maze, x, y):
        maze[x][y] = 2
        # 做标记,防止折回
        # 针对四个方向依次试探
        walk(maze, x-1, y)
        walk(maze, x, y-1)
        walk(maze, x+1, y)
        walk(maze, x, y+1)


walk(maze, 1, 1)

P129 拓展链接 Python中的排序函数

>>> a=[5,7,6,3,4,1,2]
>>> b=sorted(a)
>>> print(a)
[5, 7, 6, 3, 4, 1, 2]
>>> print(b)
[1, 2, 3, 4, 5, 6, 7]
>>> a.sort()
>>> print(a)
[1, 2, 3, 4, 5, 6, 7]
>>> a.sort(reverse=True)
>>> print(a)
[7, 6, 5, 4, 3, 2, 1]

P131 冒泡排序

def bubble_sort(L):
    length=len(L)
    #序列长度为length,需要执行length-1遍加工
    for i in range(1,length):
        for j in range(0, length-i):
            if L[j]>L[j+1]:
                temp=L[j]
                L[j]=L[j+1]
                L[j+1]=temp

P132 例1 奥运排行榜

import csv

#数据读入
csvFile=open("jp.csv","r")
reader=csv.reader(csvFile)
a=[]
for item in reader:
    a.append(item)
csvFile.close()
#排序
for i in range(1, len(a)-1):
    for j in range(1, len(a)-i):
        if int(a[j][3])<int(a[j+1][3]):
            temp=a[j]
            a[j]=a[j+1]
            a[j+1]=temp

#数据写入
csvFile2=open('jp2.csv', 'w', newline='')
writer=csv.writer(csvFile2, dialect='excel')
m=len(a)
for i in range(m):
    writer.writerow(a[i])
csvFile2.close()

5.4 数据查找

P136 顺序查找

d=[25,22,13,18,14,11,17,19]
key=18
flag=False
length=len(d)
for i in range(length):
    if d[i]==key:
        flag=True
        break
if flag==True:
    print("查找成功!")
else:
    print(“未找到")

函数形式

def seq_search(s,a):
    length=len(d)
    flag=False
    for i in range(length):
        if d[i]==key:
            flag=True
            break
    if flag==True:
        return i
    else:
        return False

d=[25,22,13,18,14,11,17,19]
key=15
result=seq_search(d,key)
print(result)

P139 二分查找

规模为n的数组d中进行二分查找
key=12
d=[6,12,15,18,22,25,28,35,46,58,60]
f=False
#和定义子数组的边界,一开始搜索的是整个数组
i=0
j=len(d)-1
while i <= j: 
    m=(i+j)//2
    if d[m] == key:
        f=True
        b=m
        break
    if key < d[m]:
        j=m-1
    else:
        i=m+1

if f==True:
    print("查找成功!第"+str(b)+"个")
else:
    print("没有找到!")

P139 拓展链接 二分查找算法的递归实现

def bsearch(s, array):
    if len(array)==0:
        print("未找到!")
        return False
    mid=(len(array)-1)//2
    if array[mid] == s:
        print("找到了!第"+str(mid+1)+"个")
        return True
    elif s < array[mid]:
        return bsearch(s, array[:mid-1])
    else:
        return bsearch(s, array[mid+1:])

key=12
d=[6,12,15,18,22,25,28,35,46,58,60]
print(bsearch(key, d))

P141 例2 航空公司VIP会员积分查询

import csv
#数据读入
csvFlle=open("vip.csv","r")
reader=csv.reader(csvFile)
a=[]
for item in reader:
    a.append(item)
csvFlle.close()
#排序
def bubble_sort(d):
    for i in range(1, len(d)-1):
        for j in range(1, len(d)-1):
            if int(d[j][0])<int(d[j+1][0]):
                temp=d[j]
                d[j]=d[j+1]
                d[j+1]=temp

#二分查找
def bsearch(s, array):
    i=1                       		#查找范围不包含第一行数据
    j=len(array)-1
    while i <= j: 
        m=(i+j)//2
        if int(array[m][0]) == s:
            return m
        if s < int(array[m][0]):
            j=m-1
        else:
            i=m+1
    return -1						#未找到返回-1

bubble_sort(a)
key = int(input('请输入要查询的VP号:'))
m=bsearch(key, a)
if m!=-1:
    print(a[m][1],"先生/女士,您的积分为:",a[m][3])
else:
    print('找不到VP号对应的用户信息!')

第六章 大数据时代数据的组织

6.1 实时查询系统中数据的组织

6.2 POI数据的组织与应

posted @ 2022-09-15 17:17  暴力都不会的蒟蒻  阅读(1270)  评论(0编辑  收藏  举报