01
差不多是从前天(2023/10/6)开始正式看C语言课本,正式开始了基础知识的学习,昨天(2023/10/7)开始在B站上看视频课程。
这两天学习了C语言程序设计概述、算法、编程规范与数据类型、运算符与表达式、顺序结构程序设计、选择结构程序设计这几个章节,对C语言大概有了一些初步的认识。动手练习了一个代码,只是粗略地看了书,对关键字、什么类型的数据占多少内存这些具体内容还没有开始记忆,准备在之后的学习过程中慢慢融汇贯通,我目前相信是这样的,这些东西后面肯定会用到,一边用一边记忆吧。
02
这几天开始一边练习编写程序,一边推进看书,发现编程真的是要实际动手才能真正学会,仅仅只看书是记不住的。渐渐地发现编程不是简单地几行代码,输入输出,他中间的过程是非常具有逻辑性的,非常简洁,逻辑又非常严密,优秀程序员的脑子真的是非常聪明的。
自己既然选择了这条路,真的就要好好干下去。目前自己的感受是,这行自己好好学、能力够强,上限会非常非常高,但如果不好好学,真的可能毕业后工作都找不到。不要浪费时间,做让自己后悔的事情!
03
发现自己目前对于这一类问题总是没有思路,很难自己想出t=t*10+a
编程计算S=a+aa+aaa+aaaa+……的前n项和。例如a=3,n=5,则表达式为S=3+33+333+3333+33333。
【算法分析】:这是一个累加的问题,循环次数由n来控制,所有累加的形式都是S=S+T的形式。所以首要任务是确定累加项T的通用表达式,以n为5、a为2为例,第一次循环t=2,第二次循环t=22,则可以构造表达式t=t*10+a,t的初值为0。以此表达式去验证后面的情况,如果没有问题,则可认为构造的表达式是正确的。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
//计算a+aa+aaa+aaaa+……的前n项和
int main()
{
int a, n,i;
long s=0,t=0;
printf("please input a & n\n");
scanf("%d %d", &a, &n);
for (i = 1; i <= n; i++)
{
t = t * 10 + a;
s = s + t;
}
printf("a+aa+aaa+aaaa……=%ld\n", s);
return 0;
}
04
【除法表达式5/2与5.0/2的结果是不同的,C语言规定:两个整数相除,结果仍是整数,小数部分将会被舍弃。所以5/2的结果是2,5.0/2的结果是2.5。】我最近总是没注意到这个,老是犯错误。
用if(i%5==0) printf("\n"); 来控制每行输出固定的量,感觉非常好用。
05
这个代码暂时看不出问题,但他就是不对
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
//看不出来有什么问题,但这个代码不对!
int main()
{
int a[10] = { 10,12,34,44,45,56,77,87,90,93 };
int x, min, top, mid;
printf("please input x :");
scanf("%d", &x);
min = 0; top = 9; mid = (min + top) / 2;
while (top > min)
{
if (x == a[mid])
{
printf("the location is %d", mid);
break;
}
else
{
if (x > a[mid])
{
min = mid + 1;
mid = (min + top) / 2;
}
else
{
top = mid - 1;
mid = (min + top) / 2;
}
}
}
if (min >= top)
printf("No found!\n");
return 0;
}
05(20231029)
为啥这个代码在VS2022上运行不成功?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//判断字符串中单词数量
int abc(int a, int b)
{
int i,t;
if (a > b)
{
t = b;
b = a;
a = t;
}
if (b % a == 0)
return a;
else
return (abc(a, b % a));
}
int main()
{
int a, b,c;
printf("please input datas a&b :");
scanf("%d %d", &a, &b);
c = abc(a, b);
printf("The GCD of %d and %d is %d\n", a, b, c);
return 0;
}
06(20231107)
一直拖拖拉拉地学到了今天,还剩下指针、位运算、文件、存储、结构体没学。但是我觉得现在应该要回过头去重新过一遍前面的基础内容了,现在在学函数的时候发现有很多地方开始搞得不是很明白,所以决定花几天时间去复习一下前面的基础内容。
07(20231112)
下面这个代码告诉了我,定义变量时,一定要习惯性地赋初值。
#include<stdio.h>
int main()
{
int a[10]={0},i;
int max, min;
int maxp=0, minp=0; //这里一定要赋初值,否则运行会出错
printf("please input 10 dtatas :\n");
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
max = a[0];
min = a[0];
for (i = 0; i < 10; i++)
{
if (a[i] > max)
{
max = a[i];
maxp = i;
}
if (a[i] < min)
{
min = a[i];
minp = i;
}
}
printf("%d %d,最大值的下标是%d,最小值的下标是%d", max, min, maxp, minp);
return 0;
}
08(20231115)
不太理解getchar()的用处
#include <stdio.h>
int main() {
char nrr;
while(scanf("%c",&nrr)!=EOF)
{
getchar();//用于吃掉多余字符 回车 是啥意思?
printf("%c\n",nrr+32);
}
return 0;
}
09(20231119)
这里的getchar()的作用到底是什么?
#include <stdio.h>
int main() {
char a;
while(scanf("%c",&a)!=EOF)
{
getchar();
if(a=='A'||a=='a'||a=='E'||a=='e'||a=='I'||a=='i'||a=='O'||a=='o'||a=='U'||a=='u')
printf("Vowel\n");
else
printf("Consonant\n");
}
return 0;
}
下面的整形又不需要使用getchar()了
#include <stdio.h>
int main() {
int a, b;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a>b)
printf("%d>%d\n",a,b);
else if(a<b)
printf("%d<%d\n",a,b);
else if(a=b)
printf("%d=%d\n",a,b);
}
return 0;
}
为什么这里一开始定义 a,b为float 类型时在乘法会出错,而在改为double 类型后就没问题了?简单计算器_牛客题霸_牛客网 (nowcoder.com)
#include <stdio.h>
int main() {
char ch;
double a,b;
while(scanf("%lf%c%lf",&a,&ch,&b)!=EOF)
{if(ch=='+')
printf("%.4lf+%.4lf=%.4lf\n",a,b,a+b);
else if(ch=='-')
printf("%.4lf-%.4lf=%.4lf\n",a,b,a-b);
else if(ch=='*')
printf("%.4lf*%.4lf=%.4lf\n",a,b,a*b);
else if(ch=='/')
{
if(b==0.0)
printf("Wrong!Division by zero!");
else
printf("%.4lf/%.4lf=%.4lf\n",a,b,a/b);
}
else {
printf("Invalid operation!\n");
}
}
return 0;
}
if(a>='a'&&a<='z'||a>='A'&&a<='Z') 等价于 if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) 吗?