最后一个部分了,这学期的大学计算机基础课程已于6月1日结束。相比于前面的计算机理论基础,我还是更喜欢后面的C编程。(虽然很难。。。)

编程题 - 结构体和排序【测试用例格式有修改】

定义包含学号、姓名和成绩的学生信息结构类型,完成以下功能:
(1)键盘输入n个学生信息数据(n从键盘输入);
(2)使用“冒泡法”对学生成绩由高到低排序;
(3)输出排序后学生信息。
输入输出样例如下,数据间以空格分隔。
输入:
3
100001 wang-li 91
100002 chen-da-wei 95
100003 guo-tao 93
输出为:
100002 chen-da-wei 95
100003 guo-tao 93
100001 wang-li 91

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<stdio.h>
typedef struct _Stu
{
int num;
char name[20];
int fenshu;
}Stu;
int main()
{
int n,i,j;
scanf("%d", &n);
Stu student[100];
for (i = 0; i < n; i++)
{
scanf("%d %s %d", &student[i].num, &student[i].name, &student[i].fenshu);
}
Stu sb;
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (student[j].fenshu > student[i].fenshu)
{
sb = student[i];
student[i] = student[j];
student[j] = sb;
}
}
}
for (i = 0; i < n - 1; i++)
{
printf("%d %s %d\n", student[i].num, student[i].name, student[i].fenshu);
}
printf("%d %s %d", student[n - 1].num, student[n - 1].name, student[n - 1].fenshu);
return 0;
}

编程题 - 字符线性表

创建一个字符线性表(顺序表),并实现其基本操作(如插入,查找,删除,输出等)。应用该线性表,将键盘输入的一行字符插入表中,然后输出表中所有字符及表长;再输入一个字符,从表中删除该字符(重复出现应进行多次删除),最后再次输出表中所有字符及表长。
输入为:
ABCBBDEF 12XYZBA
则输出为:
ABCBBDEF 12XYZBA
16
再输入:
B
则输出为:
ACDEF 12XYZA
12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int DataType;
//定义线性表的结构
typedef struct LIST
{
DataType* list; //指向线性表的指针
int length; //表长
int maxLength; //表容量
}ListType;
ListType* CreateList(int length)
{
ListType* sqList = (ListType*)malloc(sizeof(ListType));
if (sqList != NULL)
{
sqList->list = (DataType*)malloc(sizeof(DataType)*length); //为线性表分配内存
if (sqList->list == NULL)
return NULL; //如果分配失败,返回NULL
//置为空表
sqList->length = 0;
//最大长度
sqList->maxLength = length;
}
return sqList;
}
int main()
{
char ss[200];
gets(ss);
int length = strlen(ss);
for (int i = 0; i < length; i++)
{
printf("%c", ss[i]);
}
printf("\n%d\n", length);
char tt[200];
char del;
scanf("%c", &del);
int j = 0;
for (int i=0; i < length; i++)
{
if (ss[i] != del)
{
tt[j] = ss[i];
j++;
}
}
tt[j] = '\0';
int len = strlen(tt);
for (int i = 0; i < len; i++)
{
printf("%c", tt[i]);
}
printf("\n%d", len);
return 0;
}

编程题 - 折半查找

编写折半查找函数,函数原型:int Binserach(int *a,int n,int key);
功能:在n个元素的数组a中寻找key,若找到则返回key在数组中的下标,否则返回-1。
已知有排好序的整数数组:
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
在main函数中,使用折半查找函数,输入一个整数,查找是否在数组中,如在给出下标,否则-1
输入:
9
输出:
8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int find(int k)
{
int i = 0;
while (a[i] != '\0') {
if (a[i] == k)
return i;
i++;
}
return -1;
}
void main()
{
int k;
scanf("%d",&k);
printf("%d",find(k));
}

编程题 - 非公共有元素

输入两个整型数组(假设数组的大小为不超过10)的各个元素,输出不是两个数组共有的元素,并从小到大排序输出。
输入: 2个数组的元素(小于10个),数组中第一个数据指示元素的个数
输出:非共有的元素,从小到大排序
样例:
输入:
7 1 2 3 4 5 6 7
6 5 6 7 8 9 0
输出:
0 1 2 3 4 8 9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<stdio.h>
int main()
{
int ss1[10], ss2[10];
int len1, len2;
scanf("%d", &len1);
for (int i = 0; i < len1; i++)
{
scanf("%d", &ss1[i]);
}
scanf("%d", &len2);
for (int i = 0; i < len2; i++)
{
scanf("%d", &ss2[i]);
}
int new[20];
int j = 0;
int cishu = 0;
for (int i = 0; i < len1; i++)
{
cishu = 0;
for (int k = 0; k < len2; k++)
{
if (ss1[i] == ss2[k])
cishu++;
}
if (cishu == 0)
{
new[j] = ss1[i];
j++;
}
}
for (int i = 0; i < len2; i++)
{
cishu = 0;
for (int k = 0; k < len1; k++)
{
if (ss2[i] == ss1[k])
cishu++;
}
if (cishu == 0)
{
new[j] = ss2[i];
j++;
}
}
int m;
for (int i = 0; i < j; i++)
{
for (int k = i + 1; k < j; k++)
{
if (new[i] > new[k])
{
m = new[i];
new[i] = new[k];
new[k] = m;
}
}
}
printf("%d", new[0]);
for (int i = 1; i < j; i++)
{
printf(" %d", new[i]);
}
}

编程题 - 字符统计

输入任意长度的字符串,分别统计其中大写字母,小写字母,数字字符及其它字符的个数并输出统计结果,再按统计值从多到少依次输出。
提示:测试用例输出的冒号是中文冒号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<stdio.h>
#include<string.h>
int main()
{
char ss[50];
int dxzm = 0;
int xxzm = 0;
int szzf = 0;
int qtzf = 0;
gets(ss);
int length = strlen(ss);
for (int i = 0; i < length; i++)
{
if (ss[i] >= 'A'&&ss[i] <= 'Z')
dxzm++;
else if (ss[i] >= 'a'&&ss[i] <= 'z')
xxzm++;
else if (ss[i] >= '0' && ss[i] <= '9')
szzf++;
else
qtzf++;
}
printf("大写字母:%d\n小写字母:%d\n数字字符:%d\n其它字符:%d\n", dxzm, xxzm, szzf, qtzf);
printf("从多到少依次输出如下:\n");
int tt[4] = { dxzm,xxzm,szzf,qtzf };
int s[4];
int sb;
for (int i = 0; i < 4; i++)
{
sb = -1;
for (int j = 0; j < 4; j++)
{
if (tt[j] > sb)
{
sb = tt[j];
s[i] = j;
}
}
tt[s[i]] = -1;
}
for (int i = 0; i < 3; i++)
{
if (s[i] == 0)
printf("大写字母:%d\n", dxzm);
else if (s[i] == 1)
printf("小写字母:%d\n", xxzm);
else if (s[i] == 2)
printf("数字字符:%d\n", szzf);
else
printf("其它字符:%d\n", qtzf);
}
if (s[3] == 0)
printf("大写字母:%d", dxzm);
else if (s[3] == 1)
printf("小写字母:%d", xxzm);
else if (s[3] == 2)
printf("数字字符:%d", szzf);
else
printf("其它字符:%d", qtzf);
}

编程题 - 利用字符栈检查表达式的括号是否匹配

利用字符栈检查表达式的括号是否匹配。
提示:
从左向右扫描表达式,遇到“(”进栈,遇到“)”出栈,扫描完表达式后,若栈空,表示括号匹配。否则,
(1)当扫描完表达式后棧不空,可断定括号是不匹配的
(2)表达式未扫描完,需要出棧时棧是空的,此时可断定括号是不匹配的。
测试样例:
如输入:
(a+b)(5+c)((22-c)/23+56)
则输出:
括号匹配!

输入:
2+(5+8))
输出:
括号不匹配!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<string.h>
int main()
{
char ss[100];
gets(ss);
int qian = 0;
int hou = 0;
for (int i = 0; i < strlen(ss); i++)
{
if (ss[i] == '(')
qian++;
else if (ss[i] == ')')
hou++;
}
if (qian == hou)
printf("括号匹配!");
else
printf("括号不匹配!");
}

编程题 - 字符串处理

输入一个英文字符串(长度<81),删除其中所有非小写字母字符,并输出删除后的字符串。
如输入:
Xi’an Jiaotong University.
则输出:
ianiaotongniversity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<string.h>
int main()
{
char ss[100];
char nss[100];
gets(ss);
for (int i = 0; i < strlen(ss); i++)
{
if (ss[i] >= 'a'&&ss[i] <= 'z')
{
printf("%c", ss[i]);
}
}
}

编程题 - 凯撒加密

恺撒加密法加密规则是:将原来的小写字母用字母表中其后面的第3个字母的大写形式来替换,大写字母按同样规则用小写字母替换,对于字母表中最后的三个字母,可将字母表看成是首未衔接的。如字母c就用F来替换,字母y用B来替换,而字母Z用c代替。编程实现以下功能:输入一个字符串,将其加密后输出。
输入:仅含有字母的字符串
输出:加密后的字符串
样例:
输入:
AMDxyzXYZ
输出:
dpgABCabc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 80
int main(void) {
char message[N];
int n, i;
int length;
n = 3;
gets(message);
length = strlen(message);
for (i = 0; i < length; i++)
{
if (message[i] >= 'A' && message[i] <= 'Z')
{
message[i] = ((message[i] - 'A') + n) % 26 + 'A';
}
else if (message[i] >= 'a' && message[i] <= 'z')
{
message[i] = ((message[i] - 'a') + n) % 26 + 'a';
}
else continue;
}
for (int i = 0; i < length; i++)
{
if (message[i] >= 'a'&&message[i] <= 'z')
message[i] = message[i] - 'a' + 'A';
else if (message[i] >= 'A'&&message[i] <= 'Z')
message[i] = message[i] - 'A' + 'a';
}
puts(message);
return 0;
}

编程题 - 字符串查询

编写字符查找函数,函数原形为:
int mystrchr(char string[],char c);
功能是在字符串string中查找c中的字符,如果找到则返回该字符的索引值(即下标,否则返回-1。
编写主函数进行测试。输入一个字符串数据(长度<80)和一个字符,输出该字符的序号(从0开始)。
如输入如下:
asdffg & *123 hjkl
f
则输出为:
3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<string.h>
int main()
{
char ss[100];
gets(ss);
char find;
scanf("%c", &find);
for (int i = 0; i < strlen(ss); i++)
{
if (ss[i] == find)
{
printf("%d", i);
break;
}
}
int num = 0;
for (int i = 0; i < strlen(ss); i++)
{
if (ss[i] != find)
{
num++;
}
}
if (num == strlen(ss))
printf("-1");
}