admin 管理员组

文章数量: 887021

计算机科学与技术

一、引言

对于学校作业的实验题进行一些总结,选取一些在c语言学习路上的坎坷,留下一些对大一的学习感想。

二、正文

1) exp.1->1

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main(void)
{printf("Hello, world");return 0;
}

梦开始的地方,还是觉得hello world经典一点

2) exp.2->4

以第14列为对称轴,输出星号。输入一个正整数n(n<=14),输出n行星号。

其中,第一行为13个空格后接一个星号,第二行为12个空格后接3个星号…。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main(void)
{int i, j, n;scanf("%d", &n);for (i = 1; i <= n; i++){for (j = 1; j <= 15 - i; j++) printf(" ");for (j = 1; j <= 2 * i - 1; j++) printf("*");printf("\n");}return 0;
}

第一次接触数学与代码结合,小测还考了这类型的题 

3) exp.3->NULL

感觉没有代表性的题目,都是巩固循环知识和用法

4) ☆exp.4->5

输入一个正整数n(3<=n<=7),输出所有的n位水仙花数。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main(void)
{int n;scanf("%d", &n);int first = 1;int i = 1;while (i < n){first *= 10;i++;}i = first;while (i < first * 10){int t = i;int sum = 0;do{int d = t % 10;t /= 10;int p = 1;int j = 0;while (j < n){p *= d;j++;}sum += p;} while (t > 0);if (sum == i){printf("%d\n", i);}i++;}return 0;
}

这是唯一一题没有自主写出来的题,在b站上看完教学视频后就打通了任督二脉,对代码有了全新的理解,往后每一题都是自主写出来的。也是一道很经典的代码与数学结合的题。后面的实验题也再次遇见了这题,感慨一声,然后三分钟秒了。

5) exp.4(2)-->NULL

虽然标题是上一节的提高题,但也没有类似水仙花那样惊艳,也都是巩固题,不多赘述

6)exp.5->NULL

根据提交时间来看,都为5分钟之内写完的题,此节是数组的开始。

7) exp.6->4(优化版)

输入一行字符(字符个数小于80),这行字符包括小写字母,大写字母,数字,空格等其他可打印符号。请统计各字母的个数,小写字母和大写字母统计于小写字母上,例如输入字符串为:aA123B,则字母a出现的次数为2,字母b出现的次数为1;如果某字母小写大写都没出现,则不用进行输出。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main(void)
{char c[80];scanf("%s", c);int i, j = 0;char a;for (a = 'a'; a <= 'z'; a++){for (i = 0; c[i]; i++)if (c[i] == a || c[i] == a - 32)j++;if (j != 0)printf("%c is %d\n", a, j);j = 0;}return 0;
}

 第一次写这题的时候傻乎乎的,对输入进行排序,忽略了可以输出,搞了一个多小时,但在这里我也自己搞出了冒泡排序和选择排序,第一次接触排序算法,当时颇为激动。

8) exp.7->6

新生军训开始了,1班n位同学给自己班级战队取名为“1level1”,呵呵,他们的战队名是一个回文串。汇报表演开始了,n位同学围成一圈,并顺序编号为1~n。1班准备了7面旗帜,分别写上了1,l,e,v,e,l,1。他们从第一个人开始报数(从1到m报数),凡报数为m的人恰好手上举着一个写着字母(数字)的旗帜并退出圈子。依次退出了7个人(1level1的长度为7),按照退出的先后顺序排成一排,旗帜上的字母依次正好组成了1level1。

  你是班长,肯定知道班级有多少人,现在知道汇演口令是从1到m报数,怎么去安排哪7人分别拿哪个旗帜

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>int main()
{int n, m;scanf("%d %d", &n, &m);char words[7] = { '1','l','e','v','e','l','1' };int string[7];int i, j, k;i = m;j = 0;k = 0;int count = 0;while (i <= n && j < 7){string[j++] = i;i += m;}k = 0;while (j < 7)for (i = i - n; i < n; i++){for (k = 0; k <= j; k++)if (string[k] == i){i++;k = -1;}if (count % m == 0)string[j++] = i;count++;}for (i = 0; i < 7; i++){k = i;m = string[i];n = words[i];for (j = i - 1; j >= 0; j--, k--){if (string[k] < string[j]){string[k] = string[j];string[j] = m;words[k] = words[j];words[j] = n;}}}for (i = 0; i < 7; i++)printf("%d %c\n", string[i], words[i]);return 0;
}

这题真的是颇为恶心,继水仙花后最难的题,也是前7节中最难的题 ,花了颇大的力气,恶心在于最后一个例子:13,4;当初写的时候颇有一种无力感,现在再回想起来也是感觉恶心。为什么说是前7节最难呢,因为后面的指针可以玩出无数种花来。

9)exp.8->NULL

指针之前的小结,从第一题到最后一题,一个小时速通,除了代码长没有其他难度

1、小结

在前八节实验中,常使我困惑/代码跑不动 的点有

1.if等号条件

if(i = j);

2.数组越界

int a[10];

for(i = 0; i < 10; i++)

{    if(a[i] > a[i+1]

      略

}

3.scanf()函数,在赋值的变量前没有加地址符/转换说明用错

scanf("%d",a);

double i;

scanf("%f",&i);

4.printf()函数忘记加'\n'

5.读题不仔细,看错题目

6.忽视运算符号优先级问题

建议在写条件语句的时候,每一次写完运算式就加一个括号

10) exp.9->1 (优化版)

输入一个字符,再输入一个字符ch,将字符串中所有的ch字符删除后输出该字符串。要求定义和调用函数delcahr(s,c),该函数将字符串s中出现的所有c字符删除。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>int main(void)
{char s[100];char* p;char c;scanf("%s\n", s);scanf("%c", &c);p = delchar(s, c);printf("After delete:\n");printf("%s \n", p);return 0;
}char* delchar(char* s, char c)
{char* p = (char*)malloc(sizeof(char) * 100);int i, j = 0;for (i = 0; s[i]; i++){while (s[i] != c){p[j++] = s[i++];if (s[i] == c)break;}}p[j] = '\0';return p;
}

实验9就这一道编程题,其他填空题只要是看过书都会,这题实际上也不难,原版也找不到了,只有优化版,优化优化熟悉指针。

11) exp.10->1(优化版)

 输入整数n及n个字符串,试将这些字符串按照长度的升序排列并显示出来,试完成空缺处的代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>void sort(char* cities[50], int n)
{int i, j = 0;for (i = 0; i < n; i++){for (j = 0; j < n - i - 1; j++)if (strlen(cities[j]) > strlen(cities[j + 1])){char* tmp = cities[j];cities[j] = cities[j + 1];cities[j + 1] = tmp;}}
}int main()
{char cities[10][50];//指针数组不可更改,只能初始化int i, n;scanf("%d", &n);for (i = 0; i < n; i++)scanf("%s", cities[i]);char* pt[10];//注意甄别和char(*pt)[10]的不同for (i = 0; i < n; i++)pt[i] = cities[i];sort(pt, n);printf("Sorted result:\n");for (i = 0; i < n; i++)printf("%s\n", pt[i]);return 0;
}

第一次写这题也是写的颇为复杂,感觉颇有难度,现在再看也只是一眼丁真,鉴定为easy的题,从这里开始了解函数库中部分的函数。不过看题目描述这题本来应该是填空题,老师换成编程题让我们来写,可恶。这题也算是指针入门了,需要搞懂一些指针的概念。

12) exp.11->1(优化版)

从键盘输入n个字符串(n的值由键盘输入,n<11),用选择排序法对这些字符串按其值的升序进行排序,输出排序后的各个字符串。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>void sort(char* pt[11], int n);int main(void)
{int n, i;scanf("%d", &n);char words[11][20];char* pt[11];for (i = 0; i < n; i++)scanf("%s", words[i]);for (i = 0; i < n; i++)pt[i] = words[i];sort(pt, n);for (i = 0; i < n; i++)printf("%s\n", pt[i]);
}void sort(char* pt[11], int n)
{static int a = 0;int j, index;char* tmp;for (j = 0; j < n; j++){if ((*pt[a]) == (*pt[j]))if (strlen(pt[a]) < strlen(pt[j])){tmp = pt[a];pt[a] = pt[j];pt[j] = tmp;}}for (j = 0, index = a; j < n; j++){if (*pt[index] < *pt[j]){index = j;}}tmp = pt[index];pt[index] = pt[a];pt[a] = tmp;for (j = 0; j < n - 1; j++)if (*pt[j] > *pt[j + 1] && a < n - 1){a++;sort(pt, n);}return;
}

这题一开始不会用递归写,就用了普通循环,后面再用试着用递归写发现这题也是真阴啊,两个数值相等的字符串还要根据长度来排序,也花了一点时间来解决。第一次想用归并排序,但是发现太复杂而且我根本不会用这种排序,然后就放弃了,第二次就写了这个优化版。还是有些不足

13) exp.12->NULL

就是对文件这一块的磨炼,说简单不简单,说难也不难,基本功练习题吧,我的基本功也不太扎实,[叹气] 

2、小结

在涉及指针的内容中,容易出现这些问题

1.概念

int board[8][8];

int** ptr;

int* risks[10];

int(* rusks)[10];

int* oof[3][4];

int(* uuf)[3][4];

int(* uof[3])[4];

2.内存空间问题

int main(void){

char* p;

p = sort(a,n);

}

char* sort(char *a[],int n){

char* p;

return p;

//p没有分配内存空间,导致在sort()函数结束后内存会自动被清理,传回main()函数会是一个空指针;

3.二维动态数组

三、总结(反复删改)

差不多花了7周时间来学这门语言,除了学校作业外,也写了一些别的题来作为巩固,认真学习还是感到颇为充实的。

被捶打后的感想:妈妈呀这些题除了那个回文,真的是一点难度没有,都是普通的冒泡和选择排序,万变不离其宗。果然,一个人没有知识的时候是最膨胀的时候,学会了反而觉得自己太弱小了。基础还是很重要的,为之前的自满羞愧。


本来是GDU,但因为是个P,所以是GDPU

本文标签: 计算机科学与技术