高中信息技术(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数据的组织与应
本文来自博客园,作者:暴力都不会的蒟蒻,转载请注明原文链接:https://www.cnblogs.com/BobHuang/p/16697303.html