一、引言
对于学校作业的实验题进行一些总结,选取一些在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("%dn", 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 %dn", 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 %cn", 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("%sn", 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] = '