实验室寒假收假考核总结

收假考核

第一部分:C语言与python
1.请写出下面程序的输出结果。

#include <stdio.h>
int main(void) {
printf("%d\n", printf("Hello World!\n"));
return 0;
}

首先此题的实际运行结果为:
Hello World!
13
解析:题目意在考查函数嵌套和printf函数的返回值的应用,外层函数嵌套内层,程序先行执行的函数是内层函数,执行完后将内层函数的返回值返回给外层函数才能起到作用,所以应当先打印内层的Hello World!然后printf返回打印出字符的个数加上转义字符则为数字13

3.CSV的中文全称为:逗号分隔值(或字符分隔值)。CSV文件(填写“是”或“不是”)纯文本文件。

4.csv.reader()中参数delimiter的作用是:分隔符,默认为英文逗号
5.使用pd.read_csv()读取CSV文件,返回值类型为:数据框
6.构建一个学生类,包含学生的姓名,年龄,三科的成绩(高数,线代,离散),总分,该类同时含有输出学生按某科成绩的排序的方法。
下面给出一组示例,斜体字为从键盘输入的内容:
请输入学生数量:3
请输入姓名:Tom
请输入年龄:18
请输入高数成绩:95
请输入线代成绩:93
请输入离散成绩:94
请输入姓名:Jerry
请输入年龄:18
请输入高数成绩:93
请输入线代成绩:96
请输入离散成绩:89
请输入姓名:Spike
请输入年龄:19
请输入高数成绩:92
请输入线代成绩:99
请输入离散成绩:85
请输入需要比较的成绩:线代
线代 成绩排名为:
第1名:Spike
第2名:Jerry
第3名:Tom
请在矩形框中和横线上完善代码,使其能够实现上面的功能。

class Student():
    def __init__(________, n):    # n为学生数量
        ________.stu = {}
        for i in range(n):
            name = str(input('请输入姓名:'))
            age = int(input('请输入年龄:'))
            score1 = int(input('请输入高数成绩:'))
            score2 = int(input('请输入线代成绩:'))
            score3 = int(input('请输入离散成绩:'))
        ________________________________________________	  
        ________________________________________________    
        ________________________________________________    
        ________________________________________________    
        ________________________________________________  
    def sortScore(________, val):
        ________________________________________________
        ________________________________________________
        print(val, '成绩排名为:')
        for i in range(n):
            print(________________________________________________)
n = int(input('请输入学生数量:'))
a = Student(n)
sort_key = str(input('请输入需要比较的成绩:'))
a._________________________________________________________________

针对这道题,我们先来总一下有关于类与对象的知识点
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。
对象:它是类的实例化。
方法:类中定义的函数。
类(Class) 由3个部分构成:
类的名称:类名
类的属性:指对象的特征(一组数据)
类的方法:允许对象进行操作的方法 (行为/功能)
Python 3.x中取消了经典类,默认都是新式类。
新式类的语法 -> class 类名(object): pass
类对象支持两种操作:属性引用实例化
属性引用的语法:obj.属性
类实例化的语法:obj = 类名()
类中方法的调用:obj.方法名()

我们首先定义一个类,其次将实例化一个对象,并且给类的对象添加属性,还可以调用类中所存在的方法,哪个对象调用了这个方法,self就是那个对象;可以把self理解为一个形参

定义构造方法

def __init__(self, n, a):  #__init__() 是类的初始化方法;它在类的实例化操作后 会自动调用,不需要手动调用;

init(self)在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在_init__()里
本题正确答案:

class Student():
    def __init__(self, n):    # n为学生数量   #此空self相当于一个形参
        self.stu = {}
        for i in range(n):
            name = str(input('请输入姓名:'))
            age = int(input('请输入年龄:'))
            score1 = int(input('请输入高数成绩:'))
            score2 = int(input('请输入线代成绩:'))
            score3 = int(input('请输入离散成绩:'))
            self.stu[name] = []
            self.stu[name].append(age)
            self.stu[name].append({
            '高数':score1,
            '线代':score2,
            '英语':score3
            })
            self.stu[name][1]['总分'] = sum(self.stu[name][1].values())#运用和列表的相关知识嵌套到类里在运用sum函数进行values的求值            
    def sortScore(self, val):
    	a = sorted(self.stu.items(),key = lambda item:item[1][1][val], reverse = True)#返回迭代器
        print(val, '成绩排名为:')
        for i in range(n):
            print('第{0:d}名:{1:s}'.format(i+1,a[i][0]))
n = int(input('请输入学生数量:'))
a = Student(n)#对象实例化
sort_key = str(input('请输入需要比较的成绩:'))
a.sortScore(sort_key)#调用方法

第二部分:数据结构与算法
1.在循环队列中,当队列为空时,有front == rear;而当所有队列空间全占满时,也有front ==rear。为了区别这两种情况,规定循环队列最多只能MAXSIZE-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front == rear,队列判满的条件是front == (rear + 1)%MAXSIZE。请简述循环队列的优点:有效解决了以顺序表形式存储的队列的“假溢出”问题:(当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元,这种现象称为假溢出。

2.对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为0(1),在给定值为x的结点后插入一个新结点的时间复杂度为0(n)

在已知结点*p后插入一个新节点只需直接插入即可,不用遍历链表,所以时间复杂度为0(1),而在给定值为x的结点后插入一个新结点则需要遍历整个链表,所以时间复杂度为0(n)

3.2010·考研真题 若元素a,b,c,d,e,f依次进栈,允许进栈、退栈操作交替进行,但不允许连续三次进行退栈操作,则不可能得到的出栈序列是:D
A.d,c,e,b,f,a B.c,b,d,a,e,f C.b,c,a,e,f,d D.a,f,e,d,c,b
解析:
依次进栈 不允许连续三次进行退栈操作则依次分析得:
A.a进b进c进d进d出c出e进e出b出f进f出a出符合题意
B.a进b进c进c出b出d进d出a出e进e出f进f出符合题意
C.a进b进b出c进c出a出d进e进e出f进f出d出符合题意
D.a进a出b进c进d进e进f进f出e出d出c出b出连续退栈4次不符合题意故选D

4.请判断一个单链表是否为回文链表。若链表为回文链表,函数返回true,否则,
返回false。链表的长度不超过50000。
语言:C
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode* next;
 * };
 */
bool isPalindrome(struct ListNode* head) {








}
解法:/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode* next;
 * };
 */
 bool isPalindrome(struct ListNode* head)
{
	int nums[50000];
	int len = 0;
	while(head != NULL)
	{
		nums[len++] = head -> val;
		head = head -> next;
	}
	for(int i = 0,j = len-1;i < j;i++,j--)
	{
		if(nums[i] != nums[j])
		{
			return False
		}
	}
	return True
}

此方法判断链表是否为回文链表的核心是数组方法
首先开辟一个数组单元,用while循环将链表的每一结点的数据域存于所开辟的数组中,其次用for循环遍历数组将顺序与倒序的数组单元数据依依进行比较,如果不相同,则原链表不为回文链表,反之则反。
还有一种方法为快慢指针方法+链表反转
主要思想为:设置两个指针变量,一个为快指针一次移动两步,另一个为慢指针一次移动一步,当同一时间快指针移动到链表尾端时,慢指针移动到链表中间,将前一半或者后一半链表实行链表反转,然后依次进行比较,若是相同则判断为回文链表,反之则反。
链表反转代码如下:

struct ListNode *reverse(struct ListNode *head)
{
	struct ListNode *pre = NULL;
	struct ListNode *cur = head;
	while(cur != NULL)
	{
		struct ListNode *nextNode;
		cur -> next = pre;
		pre = cur;
		cur = nextNode;
	}
	return pre;
}
//本题中nextNode主要是指向原链表不让原链表数据丢失,而cur则是不停在中间搬运给新链表数据的指针

5.给定pushed和popped两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入push和弹出pop操作序列的结果时,返回true;
否则,返回false。
提示:
(1)0 <= pushed.length == popped.length <= 1000
(2)0 <= pushed[i], popped[i] < 1000
(3)pushed是popped的排列。

bool validateStackSequences(int* pushed, int pushedSize,
int* popped, int poppedSize)
{




}

在这里插入图片描述
如同实例说明,这里的核心思想之前选择题已经有所体现,代码实现如下:

bool validateStackSequences(int* pushed, int pushedSize,
int* popped, int poppedSize)
{
	int *stack = (int*)malloc(sizeof(int) *pushedSize);
	int stack[stackSize] = 0;
	for(int i = 0,j = 0;i < pushedSize;i++)
{	
	stack[stackSize] = pushed[i];
	stackSize++;
	while(stackSize && stack[stackSize - 1] == popped[j])
	{
		stackSize--;
		j++;
	}
	return stack[stackSize] == 0;
}

题中给出两个栈分别为pushed和popped,设置另一个空栈嵌套循环将pushed栈中的数据推入空栈当中每进入一个数据用while循环来判断是否弹出每当栈顶元素等于popped栈中的元素时每次循环并且判断弹出return函数返回如果栈为空则满足条件,否则序列不满足条件

6.实现一种算法,删除单向链表中间的node结点(即不是第一个或最后一个结
点),假定你只能访问该结点。
示例:
输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f
语言:C

 /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode* next;
 * };
 */
void deleteNode(struct ListNode* node) {



 
}

题解代码:

 /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode* next;
 * };
 */
void deleteNode(struct ListNode* node) 
{
	struct ListNode *p = node,*q = node -> next;
	p->val = q->val;
	p->next = q->next;
	free(q);
}

本次考核基础知识掌握不是很牢固,很多旧东西学了会经常遗忘,新东西又来不及消化,所以需要及时总结和复习掌握知识,将知识分块来逐个学习,希望以后能够做的更好!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值