C语言学习历程——研0小白的崛起

本文记录了作者从学习C语言基础知识、观看视频课程,到实践编程、遇到的算术运算、除法规则、字符串处理、数组初始化等问题,以及对指针、位运算等高级概念的初步探索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        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')) 吗?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值