文章目录
- 前言
- 引入
- 题目合集
- 1.统计不同字符的个数
- 2.求两个整数的最大公约数,最小公倍数
- 3.逆序输出
- 4.进制转换(以十进制转其他进制为例)
- 5.输出三位数中的水仙花数
- 6.素数
- 7.回文数判断
- 8.闰年判断
- 9.公式法计算 π 值
- 10.求一元二次方的根(c语言)
- 11.求某分数数列前20项之和 (C语言)
- 12.累加、阶乘计算
- 13.输出数字对自由组合(C语言)
- 14.斐波那楔数列前n项和
- 15.数组/列表、元组、字典的创建及操作
- Python代码:
- (1)列表
- (2)元组
- (3)字典
- (4)集合
- C语言:
- (1)输入与输出
- (2)二维数组转置:
- (3)二维数组找最小数
- (4)二维数组找鞍点:
- (5)二维数组相乘
- 16.额外补充
- Python
- (1)指定缺省参数的默认值
- (2)多值参数求和
- (3)多值参数_字典与元组的拆包
- (4)使用不定长参数
- (5)时间函数
- (6)文本进度条更新
- (7)try检测
- (8)CSV文件的读写
- (9)田字格的输出
- C语言
- (1)变量类型(按作用域划分)
- (2)结构体
- (3)共用体
- (4)枚举变量
- Python面向对象
- (1)类的声明
- ①常规方法
- ②魔法方法
- (2)类的继承
- (3)类的多态
- (4)迭代器和生成器
- C语言结构化过渡到面向对象
前言
随着科学技术的发展、大数据时代信息的更新速度加快,掌握一项基本的编程思维能力和一定的计算机基础成为时代的趋势,因此练习编程成为普遍现象。本文收集了部分的习题及解法,希望对大家有帮助。
提示:这是一个有趣的编程引入题
引入
大家学过Python的话应该知道“天天向上的力量”这个经典的入门编程题,而这道题对博主本人也很有意义,因为这是博主上大学的第一门编程语言讲授课的讲解题目,而刚好这道题也反映出IT行业的一个时刻保持学习状态的特点,在此,博主以这道题为开头、以乔帮主的一句“Stay hungry, stay foolish”与大家共勉
# 一年365天,以第1天的能力为基数,记为1.0,当好好学习时能力值相比前一天提高1%,当没有学习时能力值相比前一天下降1%。问:每天努力和每天放任,一年下来的能力值相差多少
a = pow((1+0.01), 365)
b = pow((1-0.01), 365)
print("天天向上的力量:{:.5f}, 天天向下的力量:{:.5f}".format(a, b))
print("一年下来两者相差:%.10f" % (a-b))
print("================================================================")
# 一年365天,以第1天的能力为基数,记为1.0,当好好学习时能力值相比前一天提高1%,当没有学习时能力值相比前一天下降1%。问:每天努力和每天放任,一年下来的能力值相差多少
a = pow((1+0.01), 365)
b = pow((1-0.01), 365)
print("天天向上的力量:{:.5f}, 天天向下的力量:{:.5f}".format(a, b))
print("一年下来两者相差:%.10f" % (a-b))
print("================================================================")
# 一年365天,一周5个工作日,如果每个工作日都很努力,就可以提高1%,仅在周末放松一下,能力值下降1%,问:效果如何
dayfactor = eval(input("请输入每天努力or放纵的因子:"))
dayup = 1.00
for i in range(365):
if i % 7 in [6, 0]:
dayup = dayup * (1 - dayfactor)
else:
dayup = dayup * (1 + dayfactor)
print("向上5天向下2天后一年下累积能力值:{:.2f}".format(dayup))
print("================================================================")
# 每周工作5天,休息2天,休息日水平下降0.01,问:工作日要努力到什么程度,一年后的水平才与每天努力1%取得的效果一样呢
def dayUp(df):
dayup = 1.0
for i in range(365):
if i % 7 in [0, 6]:
dayup = dayup * (1 - 0.01)
else:
dayup = dayup * (1 + df)
return dayup
dayfactor = 0.01
while(dayUp(dayfactor) < 37.78):
dayfactor += 0.001
print("每天努力的参数是:{:.3f}".format(dayfactor))
print("================================================================")
# 天天向上续。以7天为周期,连续学习3天能力值不变,从第4天开始至第7天每天能力增长为前一天的1%。如果7天中有1天间断学习,则周期从头开始算。请编写程序回答,如果初始能力值为1,连续学习365天后能力值是多少?
dayup = 1
dayfactor = 0.01
i = 362
dayup = pow((dayup + dayfactor), i)
print("坚持365天下来的力量是:{:.3f}".format(dayup))
print("================================================================")
# 天天向上续。采用上题的能力增长模型,如果能力初始值为1,固定每10天休息1天,365天后能力值是多少?如果每15天休息1天呢?
def dayUp(days):
dayup = 1.0
dayfactor = 0.01
i = (365 % 10) - 3
dayup = pow((dayup + dayfactor), (days - 4) * 36) * pow((dayup + dayfactor), i)
return dayup
print("当 days=10 时,能力模型的力量是:{}".format(dayUp(10)))
print("当 days=15 时,能力模型的力量是:{}".format(dayUp(15)))
print("================================================================")
提示:部分习题有Python和C两种编程,但有些只有其中之一。解法不唯一,欢迎在评论区交流
题目合集
1.统计不同字符的个数
n = input("请输入一行字符:")
a = b = c = d = 0
for i in n:
if ord('a')<=ord(i)<=ord('z') or ord('A')<=ord(i)<=ord('Z'):
a = a + 1
elif ord('0') <= ord(i) <= ord('9'):
b = b + 1
elif ord(i) == ord(' '):
c = c + 1
else:
d = d + 1
print("这一行字符中字母的数量是:{},数字的数量是:{},空格数量是:{},其他字符的数量是:{}。".format(a, b, c, d))
// 按顺序读取键盘上的输入,遇到字符#时停止,并输出空格、字母e和i出现的次数。
#include<stdio.h>
int main()
{
int num_space, num_e, num_i;
char a = 0;
printf("请输入一串字符串:\n");
for(;;scanf("%c", &a))
{
if(a == 35)
break;
else if(a == 32)
num_space++;
else if(a == 101)
num_e++;
else if(a == 105)
num_i++;
}
printf("空格、字母e和i出现的次数分别为:%d, %d, %d\n", num_space, num_e,num_i);
return 0;
}
2.求两个整数的最大公约数,最小公倍数
# Python:
def get_greatest_common_divisor_V2(a,b):
big=max(a,b)
small=min(a,b)
if big%small==0:
return small
return get_greatest_common_divisor_V2(big%small,small)
i = get_greatest_common_divisor_V2(4, 10)
print("两数的最大公约数是:{}".format(i))
print("两数的最小公倍数是:{}".format(4 * 10 / i))
C_code:
#include <stdio.h>
int main()
{
int a,b,c,e,f,g;
printf("请输入两个正数:");
scanf("%d%d",&a,&b);
e=a;
f=b;
c=a%b;
while(c!=0)
{
a=b;
b=c;
c=a%b;
}
g=e*f/b;
printf("最大公约数是 %d\n最小公倍数是 %d\n",b,g);
return 0;
}
3.逆序输出
# Python:
#递归实现字符串翻转
import sys
sys.setrecursionlimit(2000)
def reverse(s):
if s == '':
return s
else:
return reverse(s[1:]) + s[0]
aa = input("请输入一个字符串:")
print(reverse(aa))
# Python:
# 最小最大数分别放置首尾
data = list(map(eval,input("请输入一组数据,各数之间用英文中的逗号分隔:").split(",")))
print(data)
min_L = data.index(min(data)) #找到最小数据的索引序号
if min_L != 0:
data[0], data[min_L] = data[min_L], data[0]
max_L = data.index(max(data))
if max_L != len(data)-1:
data.append(data.pop(max_L)) #先踢出最大值,再将它追加到序列末尾
print(data)
C_code:
/* 反序输出三位数 */
#include<stdio.h>
int main()
{
int i;
printf("请输入一个三位数:");
scanf("%d", &i);
printf("您所输入的三位数的反序是:\n");
while(i)
{
printf("%d", i%10);
i /= 10;
}
return 0;
}
/* 通过字符指针的传递,执行被调函数,将主函数中字符串的字符逆序存放 */
#include<stdio.h>
int main()
{
char str[20];
void sub(char*, int);
gets(str);
sub(str, strlen(str));
puts(str);
return 0;
}
void sub(char*p1, int n)
{
char *p2=p1+n-1, temp;
while(p1<p2)
{
temp=*p1;
*p1++=*p2;
*p2--=temp;
}
}
4.进制转换(以十进制转其他进制为例)
# Python:
# 十进制转二进制
print("(Into binary)Please type an integer:")
a = int(input())
print(bin(a))
# 十进制转八进制
print("(Into octal)Please type an integer:")
b = int(input())
print(oct(b))
# 十进制转十六进制
print("(Into hexadecimal)Please type an integrate:")
c = int(input())
print(hex(c))
// C:
#include<stdio.h>
void convert(int x, int y)
{
if(x > 0)
{
convert(x/y, y);
if(y!=16)
printf("%d", x % y);
else
printf("%x", x % y); // 以十六进制输出
}
}
int main()
{
int x, y;//输入要转换的数值和转化进制数
printf("请输入要转换的十进制整数: ");
scanf("%d", &x);
printf("请输入要转换的进制: ");
scanf("%d", &y);
convert(x,y);
return 0;
}
5.输出三位数中的水仙花数
题目描述:水仙花数是指一个n位数 (n≥3),它的每个位上的数字的n次幂之和等于它本身。例如:153是一个“水仙花数”,因为 153 是个 3位数,而13+53+3**3==153。要求输出三位数中的所有水仙花数
for i in range(100,1000):
a = i // 100 #百位数
b = i // 10 % 10
c = i % 10
if a**3 + b**3 + c**3 == i:
print(i)
#include<stdio.h>
#include<math.h>
int main()
{
int i,sum;
printf("水仙花数有:");
for(i=100;i<1000;i++)
{
sum=(i/100)*(i/100)*(i/100)+(i%100/10)*(i%100/10)*(i%100/10)+(i%100%10)*(i%100%10)*(i%100%10);
if(i==sum)
{
printf("%d\n",sum);
}
}
return 0;
}
6.素数
# 函数调用判断素数
def prime(x):
t=True
for i in range(2,x):
if x % i == 0:
t = False
break
return t
for x in range(200, 1001):
if prime(x):
print(x, end=' ')
7.回文数判断
题目描述:
回文数判断。设n是一任意自然数,如果n的各位数字反向排列所得自然数与n相同,则n被称为回文数。从键盘上输入一个5位数字,请编写程序这个数是不是回文数
# 1、字符串判断
x = input("请输入一个整数:")
if x==x[::-1]:
print("是回文数。")
else:
print("不是回文数。")
# 2、颠倒数据后判断
x = int(input("请输入一个整数:"))
if x < 0 or (x % 10 == 0 and x != 0):
print("不是回文数。")
elif not x // 10:
print("是回文数。")
else:
hou = 0
while (x > hou):
hou = hou * 10 + x % 10
x //= 10
if x == hou or x == (hou // 10):
print("是回文数。")
else:
print("不是回文数。")
8.闰年判断
//输入某年某月某日,判断这一天是这一年的第几天?
#include<stdio.h>
//判断闰年函数
int isLeapYear(int year)
{
//闰年,能被4整除但不能被100整除,或能被400整除
if((year%4==0 && year%100!=0) || year%400==0)
{
return 1;
}
return 0;
}
//计算某年某月某日是第几天
int calculateDays(int year,int month,int day)
{
int i; //循环变量
int days=0; //存放总天数
//存放平年每个月的天数,有效下标从1开始
int days_of_month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(i=1;i<month;i++)
{
days=days+days_of_month[i];//计算包含全部月份的天数
}
days=days+day; //加上不全月份的天数
//如果是闰年且包含全部2月份
if(isLeapYear(year) && month>=3)
{
days=days+1; //天数+1,因为2月份多一天
}
return days;
}
int main()
{
int year,month,day;
printf("请依次输入年,月,日,用空格隔开:\n");
scanf("%d %d %d",&year,&month,&day);
printf("这一天是这一年的第%d天",calculateDays(year,month,day));
return 0;
}
9.公式法计算 π 值
sum = 0
i = 1
t = 1 #第i项
while abs(t) > 1e-6:
t = (-1)**(i+1)/(2*i-1) #(-1)**(i+1),第i项的符号(分子)
sum += t
i += 1
print("{0:.5f}".format(4*sum))
print('%.5f' % (4*sum))
from random import random
from math import sqrt
from time import perf_counter
DARTS = 1000
hits = 0.0
start = perf_counter()
for i in range(1, DARTS+1):
x, y = random(), random()
dist = sqrt(x ** 2 + y ** 2)
if dist <= 1.0:
hits = hits + 1
pi = 4 * (hits / DARTS)
end = perf_counter()
print("pi的值是:{:.2f}".format(pi))
print("运行时间是:{:.5f}s".format(end - start))
//公式法求pi的近似值
#include<stdio.h>
#include<math.h>
int main()
{
int i=0;
int n=1;
double sum=1.0, pi=0.0, sign=1;
while(fabs(sum) >= 1e-6)
{
pi+=sum;
n+=2;
sign=-sign;
sum=sign/n;
i++;
}
pi=pi*4;
printf("pi的值是:%10.8f", pi);
return 0;
}
10.求一元二次方的根(c语言)
//求一元二次方程的根,并考虑 判别式大于0、等于0、小于0的情况
#include<stdio.h>
#include<math.h>
int main()
{
double a, b, c, x1, x2, d,x3 ,x0;
printf("输入方程的三个系数:");
scanf_s("%lf %lf %lf", &a, &b, &c);
if (a != 0)
{
d = sqrt(b * b - 4 * a * c);
if (d == 0)
{
x0 = (-b) / (2 * a);
printf("%.2lf\n", x0);
}
else if(d>0)
{
x1 = (-b + d) / (2 * a);
x2 = (-b - d) / (2 * a);
printf("%.2lf %.2lf\n", x1, x2);
}
else
printf("x无解");
}
else
{
x3 = -c / b;
printf("%.2lf\n", x3);
}
return 0;
}
11.求某分数数列前20项之和 (C语言)
#include <stdio.h>
#include <stdlib.h>
int main()
{
double a,b,temp; //a为分母,b为分子,temp保存前一项的分子
double sum=0;
int i;
a=2;
b=1;
for(i=0;i<20;i++)
{
sum+=a/b;
temp=a; //先保存前一项的分子
a+=b; //修改分子
b=temp; //修改分母(等于前一项分子)
}
printf("Sum is %6.4lf\n",sum);
return 0;
}
12.累加、阶乘计算
递归实现
# 定义一个函数 sum_numbers
# 能够接收一个 num 的整数参数
# 计算1 + 2 + 3 ...... + num的结果
def sum_numbers(num):
if num == 1:
return 1
temp = sum_numbers(num - 1)
return num + temp
result = sum_numbers(1)
print(result)
//定义函数运用递归计算n的阶乘
#include<stdio.h>
int main()
{
int fun(int);
int n;
printf("请输入数值:");
scanf("%d", &n);
if(n<0)
printf("输入错误!请重新输入");
else
printf("%d! = %d", n, fun(n));
return 0;
}
int fun(int n)
{
if(n<=1)
return 1;
else
return n*fun(n-1);
}
一般算法
// 用循环求1!+2!+3!+…+10!
#include<stdio.h>
#include<math.h>
int main()
{
int i;
int j;
int sum=0;
for(i=1;i<=10;i++)
{
j*=i;
sum+=j;
}
printf("1!+2!+3!+…+10!的和为:%d", sum);
return 0;
}
// 调用静态局部变量,计算5以内各数的阶乘
#include<stdio.h>
int main()
{
int fact(int);
int i;
for(i=1;i<6;i++)
printf("%d! = %d\n", i, fact(i));
return 0;
}
int fact(int n)
{
static int f=1;
f=f*n;
return f;
}
13.输出数字对自由组合(C语言)
//输出所有由数字“1”“2”“3”组成的三位数
#include<stdio.h>
int main()
{
int i, j, k;
printf("由数字1、2、3组成的三位数是:\n");
for(i = 1;i <= 3;i++)
{
j = 1;
while(j <= 3)
{
k = 1;
do
{
if(i != k && i != j && j != k)
{
printf("%d%d%d ", i, j, k);
}
k++;
}while(k <= 3);
j++;
}
}
return 0;
}
补充:Python随机选取某序列中的元素
import random
veg=['apple','pear','peach','orange','fish','苹果']
print(random.choice(veg))
14.斐波那楔数列前n项和
"""列表输出斐波那楔数列"""
f = [1, 1]
sum = 2
n = eval(input("请输入项数n: "))
for i in range(2, n+1):
f.append(f[i-1] + f[i-2])
sum += f[i-1] + f[i-2]
print("%d项的斐波那楔数列为:" % (n+1), f)
print("\n该数列的前%d项和为: %d" % (n+1, sum))
//求斐波那楔数列前n项和
//输入n,输入前n项,以及前n项和//
#include <stdio.h>
int main()
{
int n, i, t;
int sum = 0, flag = 2; //flag为换行标记
int a1 = 1, a2 = 1; //前两项先列出来
printf("请输入所需要的项数:");
scanf("%d", &n);
printf("%d %d ", a1, a2);
for (i = 3; i <= n; i++) //从第三项开始
{
t = a1 + a2;
printf("%d ", t);
sum = sum + t;
a1 = a2; //注意这里的写法,赋值,产生新的a1、a2
a2 = t;
flag++;
if (flag % 5 == 0) //原本想每5个输出一行,但是我之前先输出了a1、a2
printf("\n"); //导致第一行有7个,并不能完成每5行输出的任务
//放在这里让大家解决,感觉会麻烦一点
}
printf("\n\n前%d项和为:%d\n", n, sum+2); //注意这里的sum需要加上初值的2
return 0;
}
15.数组/列表、元组、字典的创建及操作
Python代码:
提示:此仅包括一维和二维,DL中涉及三维到四维的张量,详见Jupyter
(1)列表
①一维数组的基本操作
#列表可定义不同类型的数据,并且索引值是从0开始计数
name_list =['hello python','larissa','Alex',520,True]
#1取值与取索引
print(name_list[2])
print(name_list.index(520))
#2修改 or 替换 列表中的数据
"""
name_list[0] = "hello world"
print(name_list)
"""
#3增加
"""append 是在列表最后增添数据
insert 是在列表的指定位置插入数据
extend 用于在某一列表后拼接另一列表"""
"""name_list.append('1')
print(name_list)
print(len(name_list))
name_list.insert(2,'1')
print(name_list)
print(len(name_list))
another_list = ['1','2','3']
name_list.extend(another_list)
print(name_list)"""
#4删除
"""remove 可删除列表中指定数据
pop 在不传递数据的索引之前默认删除列表最后一个数据,在传递索引值后可删除索引值对应的数据
clear 可以清空列表的所有数据
del关键字本质上是将一个变量从内存中删除"""
"""name_list.remove(520)
print(name_list)
name_list.pop(2)
print(name_list)
name_list.clear()
print(name_list)
str = "nihao"
del str
print(str)"""
#5统计
"""len可统计列表中元素的个数
count可统计某一数据出现的次数"""
"""print(len(name_list))
name_list.append(520)
print(name_list.count(520))"""
#6排序
"""sort()升序
sort(reverse=True)降序
reverse()逆序/反序"""
str_list = ["wangwu","lisi","zhangsan"]
num_list = [1,3,9,5]
"""str_list.sort()
num_list.sort(reverse=True)
num_list.reverse()
print(num_list)"""
②二维数组的创建及基本操作
"""创建二维数组"""
#1.一维复制法
a = [[]] * 3
a[0].append(1)
a[1].append(2)
a[2].append(3)
print(id(a[0]))
print(id(a[1]))
print(a)
b = [[] for i in range(3)]
b[0].append(1)
b[1].append(2)
b[2].append(3)
print(id(b[0]))
print(id(b[1]))
print(b)
#2.直接创建法
a1 = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
print(a1)
#3.numpy库调用
import numpy as np
a2 = np.zeros((3, 3))
print(a2)
# 列表推导式:
# # [表达式 for 变量 in 列表]
# # [out_exp_res for out_exp in input_list]
names = ["Alex", "Bob", "Clara", "Davie", "Eve"]
new = [name.upper() for name in names if len(names) > 3]
print(new)
# #0-100 中可以被2整除的数作为一个列表
num = [i for i in range(100) if i % 2 == 0]
print(num)
# 遍历列表
s2 = ['name', 'num', 'score']
s3 = ['Alex', 1001, 91.5]
for index, val in enumerate(s2):
print(index, '(index)', val, '(value)')
for i, j in zip(s2, s3):
print(i, '->', j)
(2)元组
①基本操作
#元组不可修改
info_tuple = ("zhangsan",54,"wangwu","wangwu")
print(type(info_tuple))
#01取值与取索引
print(info_tuple[1])
print(info_tuple.index("zhangsan"))
#02计算某个数据出现的次数
print(info_tuple.count("wangwu"))
②拓展操作
# 元组只包含一个元素时,需要在元素后面添加一个逗号,否则括号会被当做运算符使用
tup1 = (1)
print(tup1)
print(type(tup1))
tup2 = (1,)
print(tup2)
print(type(tup2))
(3)字典
①基本操作
#键(key)是索引,必须是字符串、数字、元组,且唯一;值(value)是数据,不一定唯一。字典无序
info_dict = {"name":"张三",
"age":18,
"gender":"boy"}
#01取值
print(info_dict["name"])
#02增加 and 修改
info_dict["height"] = 1.75
"""当键(key)在字典中不存在时,会增加键值对"""
info_dict["name"] = "李四"
"""当键(key)在字典中存在时,会修改原来的值"""
#03删除
info_dict.pop("gender")
#04统计键值对的数量
print(len(info_dict))
#05合并字典
"""注意,当被合并的字典中出现原已存在的键值对时,会覆盖原来的值"""
temp_dict = {"age":20,
"country":"China"}
info_dict.update(temp_dict)
#06清空字典
info_dict.clear()
print(info_dict)
②拓展操作
# 遍历字典
s1 = {'name':'Alex', 'num':1001, 'score':91.5}
for k,v in s1.items():
print(k, '->', v)
(4)集合
#创建一个集合可以使用 {} 和 函数set([, 1 argument]),集合是一个无序且不重复的组成(即集合具有去重复的作用)
x = {'as', 'ee', 1}
y = set('orange')
print(type(x), type(y))
print(y)
C语言:
(1)输入与输出
//利用指针法实现对数组元素的输入和输出
#include<stdio.h>
//使用指针引用一维数组
//int main()
//{
// int a[5], *p=a, i;
// printf("请输入五维行向量:\n");
// for(i=0;i<5;i++)
// scanf("%d", &a[i]);
// printf("输出向量:\n");
// for(i=0;i<5;i++)
// printf("%d ", *(p++));
//
// return 0;
//}
//使用指针引用二维数组
int main()
{
int a[3][4]={11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22}, i, j;
int *p=a;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d ", *(p+i*4+j)); //(p+i*4+j)表示第i行第j列的元素地址
printf("\n");
}
return 0;
}
// a --二维数组名,首元素地址,第0行地址
// a[0], *(a+0), &a --第0行0列元素a[0][0]的地址
// a+1, &a[1] --第1行的地址
// a[1], *(a+1) --第1行0列元素a[1][0]的地址
// a[1]+2, *(a+1)+2, &a[1][2] --第1行2列元素a[1][2]的地址
// *(a[1]+2), *(*(a+1)+2),a[1][2] --第1行2列元素a[1][2]的值
(2)二维数组转置:
#include<stdio.h>
int main()
{
void sub(int b[][3]);
int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int i, j;
printf("转置前的数组为:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ", a[i][j]);
printf("\n");
}
sub(a);
printf("转置后的数组为:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
void sub(int b[][3])
{
int i, j, t;
for(i=0;i<3;i++)
for(j=0;j<i;j++)
{
t=b[i][j];
b[i][j]=b[j][i];
b[j][i]=t;
}
}
(3)二维数组找最小数
//现有int整型数组 a[3][4]={{12, 21, 34, 32}, {28, 10, 17, 43}, {19, 54, 38, 27}},找出数组中数值最小的元素
#include<stdio.h>
int main()
{
int i, j, c, b;
int a[3][4]={{12, 21, 34, 32}, {28, 10, 17, 43}, {19, 54, 38, 27}};
int min=a[0][0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if (a[i][j]<min)
{
min=a[i][j];
c=i;
b=j;
}
}
}
printf("数组中最小的元素是%d行%d列的%d\n", c+1, b+1, a[c][b]);
return 0;
}
(4)二维数组找鞍点:
/*找出二维数组的鞍点,及其值为所在行中最大、所在列中最小的元素
注:一个二维数组中也可能没有鞍点*/
#include<stdio.h>
int main()
{
int a[3][4];
int i, j, k, maxj, max;
int sum;
printf("请输入一个3x4矩阵(数字间用空格隔开):");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d", &a[i][j]);
for(i=0;i<3;i++)
{
max = a[i][0];
maxj = 0;
for(j=0;j<4;j++)
if(a[i][j]>max)
{
max = a[i][j];
maxj = j;
}
for(k=0;k<3;k++)
if(max>a[k][maxj])
break;
if(k>=3)
{
printf("该二维数组的鞍点为:a[%d][%d]=%d", i, maxj, max);
break;
}
}
if(i>=3)
printf("该二维数组没有鞍点。");
return 0;
}
(5)二维数组相乘
//求二维矩阵相乘的值
#include<stdio.h>
int main()
{
int a[2][3], b[3][2], c[2][2];
int i, j, k;
printf("请输入一个2x3矩阵a:\n");
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
scanf("%d", &a[i][j]);
}
printf("请输入一个3x2矩阵b:\n");
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
scanf("%d", &b[i][j]);
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
c[i][j]=0;
for(k=0;k<3;k++)
c[i][j]+=a[i][k]*b[k][j];
}
}
printf("矩阵a和矩阵b相乘的结果是:\n"); //矩阵c的值
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
printf("%d ", c[i][j]);
printf("\n");
}
return 0;
}
16.额外补充
Python
(1)指定缺省参数的默认值
def print_info(name, title, gender=True):
"""
:param title: 职位
:param name: 班上同学的姓名
:param gender: True 是男生,False 是女生
"""
gender_text = "男生"
if not gender:
gender_text = "女生"
print("[%s]%s 是 %s" % (title, name, gender_text))
print_info("小明","班长",)
print_info("猪妹","科代表",False)
(2)多值参数求和
def sum_num(*args):
num = 0
print(args)
for n in args:
num += n
return num
result = sum_num(1,2,3,4,5)
print(result)
(3)多值参数_字典与元组的拆包
def demo(*args, **kwargs):
print(args)
print(kwargs)
gl_tuple = (1,2,3,4)
gl_dict = {"name":"小明"}
#使用拆包语法时
demo(*gl_tuple, **gl_dict)
#不使用拆包语法时
demo(1,2,3,4, name = "小明")
(4)使用不定长参数
# 使用不定长参数,其中,*表示元组,** 表示定义参数为字典
def printme(*arg, **args):
print(arg)
print(args)
printme(1,2, a=2, b=3)
(5)时间函数
f = lambda x, y : x + y
f(1, 3)
def vfunc(a, *b):
print(type(b))
for i in b:
a += i
return a
vfunc(1, 2, 3, 4, 5)
from datetime import *
today = datetime.utcnow()
today
(6)文本进度条更新
import time
scale = 10
print("----执行开始----")
for i in range(scale + 1):
a, b = "**" * i, "··" * (scale - i)
c = (i / scale) * 100
print("%{:^3.0f}[{}->{}]".format(c, a, b))
time.sleep(0.3)
print("----执行结束----")
#单行更新文本进度条
import time
scale = 50
print("执行开始".center(scale // 2, '-'))
t = time.perf_counter()
for i in range(scale + 1):
a = '*' * i
b = '·' * (scale - i)
c = (i / scale) * 100
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, t), end=' ')
time.sleep(0.05)
print("\n" + "执行结束".center(scale // 2, '-'))
(7)try检测
try:
alp = "huadudadhjhagdhbx"
index = eval(input("请输入一个整数:"))
print(alp[index])
except NameError:
print("输入错误,请重新输入")
except IndexError:
print("索引值超出范围,请重新输入")
else:
print("没有发生异常")
finally:
print("程序执行完毕")
(8)CSV文件的读写
fo = open("/Users/mac/Desktop/picture2016.csv", "r")
ls = []
for line in fo:
line = line.replace("\n", "")
ls.append(line.split(","))
print(ls)
fo.close()
(9)田字格的输出
#田字格的输出
n = eval(input("请输入一个奇数:"))
a = "— "
b = "┼"
c = "|"
d = " "
m = n // 2
for i in range(n):
if i in [0,m,n-1]:
print("{0}{1}{0}{1}{0}".format(b, a*(m-1)))
else:
print("{0}{1}{0}{1}{0}".format(c, d*2*(m-1)))
C语言
自定义数据类型
(1)变量类型(按作用域划分)
#include<stdio.h>
int z; //全局变量,静态存储区
int main()
{
int sub();
int i; //局部变量
for(i=0;i<3;i++)
sub();
return 0;
}
int sub()
{
int x=0; //自动变量,动态存储区,可用关键字auto声明
static int y; //静态局部变量,静态存储区,在程序执行过程中占据固定的存储单元,直到程序执行完毕才被释放
++x;
++y;
++z;
printf("x=%d, y=%d, z=%d\n", x, y, z);
}
(2)结构体
详见数据结构学习代码
#include<stdio.h>
int main()
{
float sum;
struct Student
{
char num[5];
char name[20];
char sex;
int age;
float score;
};
struct Student stu1 = {"1001", "lin", 'M', 19, 94.5}, stu2;
stu2 = stu1;
stu2.age = 20;
stu2.score = 88;
printf("请输入第二个学生的学号:\n");
scanf("%s", stu2.num);
printf("请输入第二个学生的姓名:\n");
scanf("%s", stu2.name);
sum = stu1.score + stu2.score;
printf("\nnum name sex age score \n");
printf("%s %s %c %d %.1f\n",
stu1.num, stu1.name, stu1.sex, stu1.age, stu1.score);
printf("\nnum name sex age score \n");
printf("%s %s %c %d %.1f\n",
stu2.num, stu2.name, stu2.sex, stu2.age, stu2.score);
printf("\n总分为:%.1f\n", sum);
return 0;
}
(3)共用体
//定义并初始化结构体数组 boy[5],用于表示5个学生实体。输出5名学生的各项属性,计算总成绩、平均分和不及格人数,并显示不及格学生人数
#include<stdio.h>
int main()
{
struct Stu
{
int num;
char name[20];
char sex;
float score;
}boy[]={
{1, "李海", 'M', 94.5},
{2, "李好", 'M', 89.7},
{3, "李勉", 'M', 87.0},
{4, "李茶", 'M', 56.3},
{5, "李莎", 'M', 55.1},
};
int i, c=0;
float ave, sum=0;
printf("num name sex score\n");
for(i=0;i<5;i++)
printf("%-9d%-16s%-7c%.1f\n",
boy[i].num, boy[i].name, boy[i].sex, boy[i].score);
for(i=0;i<5;i++)
{
sum+=boy[i].score;
if(boy[i].score<60)
{
c+=1;
printf("不及格学生:%s\n", boy[i].name);
}
}
ave = sum/5;
printf("总成绩为:%.1f\n", sum);
printf("平均分为:%.2f\n", ave);
printf("不及格学生人数为:%d\n", c);
return 0;
}
(4)枚举变量
//定义枚举变量表示信号灯,并根据变量的不同取值,显示相应信息
#include<stdio.h>
int main()
{
enum lights
{
red,
yellow,
green
}lamp;
for(lamp=red;lamp<=green;lamp++)
switch(lamp)
{
case 0: printf("红灯禁停\n");break;
case 1: printf("黄灯慢行\n");break;
case 2: printf("绿灯通行\n");break;
default:break;
}
return 0;
}
Python面向对象
(1)类的声明
①常规方法
class Dog():#类的声明
def move(self):
print("提示:你的小可爱正在前往......")
def attack(self):
print("提示:你的小可爱会咬人......")
def info(self): #实例方法,定义该类的特征信息函数
print(self) #打印对象的储存地址
print("%s 的生命力是:%d" % (self.name, self.hp, self))
print("%s 的攻击力是:%d" % (self.name, self.atk))
jinmao = Dog() #声明符合该类特征的某一对象,记住此语句一定要放在所有具体定义的属性语句前,否则会报错
hashiqi = Dog()
#赋予具体属性
jinmao.name = "小二"
jinmao.hp = 450
jinmao.atk = 250
hashiqi.name = "五筒"
hashiqi.hp = 550
hashiqi.atk = 350
jinmao.move()
jinmao.attack()
jinmao.info()
hashiqi.info()
# print("%s 的生命力是:%d" % (jinmao.name, jinmao.hp))
# print("%s 的攻击力是:%d" % (jinmao.name, jinmao.atk))
②魔法方法
class Dog():
def move():
print("提示:你的小可爱活泼好动......")
def attack():
print("提示:你的小可爱会咬人......")
def __init__(self, name, hp, atck, armor): #魔法函数,可将用户逐步定义的步骤自动归类到一个函数内,则用户只需传入实参即可定义对象属性
self.name = name
self.hp = hp
self.atck = atck
self.armor = armor
def info(self):
print("%s 的生命力:%d" % (self.name, self.hp))
print("%s 的攻击力:%d" % (self.name, self.atck))
print("%s 的护甲值:%d" % (self.name, self.armor))
def __str__(self):
return self.name #在打印对象时,即print(self),返回的是某个字符串而不是对象存储地址
jinmao = Dog("小暖", 2000, 450, 400)
hashiqi = Dog("小二货", 3000, 350, 300)
Dog.move()
Dog.attack()
jinmao.info()
hashiqi.info()
print(jinmao)
print(hashiqi)
print(id(jinmao.name))
print(id(hashiqi.name))
(2)类的继承
# 父类
class Dog():
def __init__(self):
self.name = "Dog dad"
def skill(self):
print("bite people")
class Dog2():
def __init__(self):
self.name = "Dog mom"
def skill(self):
print("bite dog")
def skill2(self):
print("wag tail")
# 子类
class Son(Dog2, Dog): # 在多类继承时,若有重复和不同的属性,则优先继承第一个类别
def __init__(self): # 在内部修改具体属性
self.name = "Dog son"
def skill(self):
print("lick people")
# def dad_skill(self): # 第一种方法:在子类中通过调用父类的函数名来实现对父类属性的调用
# Dog.__init__(self)
# Dog.skill(self)
def dad_skill(self):
super().skill()
def mom_skill(self):
super().skill2()
jinmao = Son()
print(jinmao.name)
jinmao.skill()
jinmao.dad_skill()
jinmao.mom_skill()
# jinmao.skill2
(3)类的多态
class Dog():
def __init__(self):
self.name = "Dog dad"
def skill(self):
print("Bite people")
class son1():
def skill(self):
print("Bite man")
class son2():
def skill(self):
print("Bite woman")
class son3():
def skill(self):
print("Bite child")
son1 = son1()
son2 = son2()
son3 = son3()
son1.skill()
son2.skill()
son3.skill()
(4)迭代器和生成器
# 创建迭代器用 iter(),取其索引可用 next(),迭代器可记住其每一次遍历的位置
names = ["Alex", "Bob", "Clara", "Davie", "Eve"]
it = iter(names)
print(next(it))
print(next(it))
print(next(it))
# 生成器及 函数yield和函数return间的区别
#yield是暂停函数,return是结束函数; 即yield返回值后继续执行函数体内代码,return返回值后不再执行函数体内代码;
#yield返回的是一个迭代器(yield本身是生成器-生成器是用来生成迭代器的);return返回的是正常可迭代对象(list,set,dict等具有实际内存地址的存储对象)
def gen_num(data):
if data > 10:
for i in range(data):
yield i
else:
return data
g1 = gen_num(5)
for num in g1:
print(num)
print("传入参数5,返回类型:", type(gen_num(5)))
g2 = gen_num(12)
for num in g2:
print(num)
print("传入参数12,返回类型:", type(gen_num(12)))
C语言结构化过渡到面向对象
详见C语言版数据结构源码