IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言(初遍学的一些零乱笔记) -> 正文阅读

[C++知识库]C语言(初遍学的一些零乱笔记)

#include <stdio.h>

int main()
{
    xxx;    
    return 0;
}

本课中所有的程序都需要这一段,直到学函数之前,我们的代码都只是在这个框架中间,也就是xxx的位置。

? 做事情的句子之后必须有分号,不过换行无所谓,在C里面,换行/空格不代表任何。

printf("%d",12+34);
printf("12+34=%d",12+34)
#%d 说明后面有一个整数要输出在这个位置上
    
int price;
int amount;
int price,amount;


scanf("%d",&price)
    
const int AMOUT=100;  #后期不能被赋值修改
int price=0;
int change=AMOUNT-price;


条件判断

//如果符合括号里的条件,就做,不符合就不会做了

//常规形式
if(im<0){
    im+=60;
    ih--;
}else{
    xxx
}


//如果没有大括号,那么只有紧跟在它后面的那一句是有效的
//(好的编程习惯)建议是要加大括号的,因为else的归属情况是,严格遵循就近原则(即使有时候不再符合缩进),所以加上大括号会更加明了一些
if(im<0)
    im+=60;
else
    xxx;

//if嵌套
int a,b,c;
scanf("%d %d %d",&a,&b,&c);

int max=0;
if(a>b){
    if(a>c){
        max=a
    }else{
        max=c
    }
}else{
    if(b>c){
        max=b
    }else{
        max=c
    }
}
printf("The max is %d\n",max);

我有一个问题:为什么print f那个引号里面最后的地方要加个\n呢??都有什么句子必须加呢??

//多路分支
switch(type)
{
case 1:
case 2:
    printf("hhh\n");
    break;
//加了break就跳出
case 3:
    printf("ggg\n");
//没加break会继续进行4
case 4:
	printf("kkk\n");
    break;
//以上几个数字都没出现,则执行default后面的语句
default:
    printf("a\n");
    break;
}

//有时候划分范围的问题,可以取其中的十位数/百位数那种(方法就是那个除并取整),然后转化为数字多分类问题

循环

//普通while循环
int x;
int n=0;
scanf("%d",&x);

n++;
x/=10;
while(x>0){
    n++;
    x/=10;
}
printf("%d\n",n);


//do-while循环
/*在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮的循环,不满足则结束循环*/

int x;
int n=0;
scanf("%d",&x);
do{
    x/=10;
    n++;
}while(x>0);
printf("%d\n",n);

//for循环
int count=1;
/*常用套路:若是乘积,则初始化为1,若是加和,则初始化为0*/
int i;
for(i=10;i>1;i--){
    count*=i;
}
/*完全等同于以下while循环*/
int i;
while(i>1){
    count*=i;
    i--;
}
/*这种一般是用于n需要保住这个值,后面可能还会用到的情况*/
int n=10;
int i;
for(i=n;i>1;i--){
    count*=i;
}

/*用于n不需要保值,,以后用不到了的情况*/
int n=10;
for(n=n;n>1;n--){
    count*=n;
}
/*for循环语句里n=n可以省略,但分号不能省略*/
int n=10;
for(;n>1;n--){
    count*=n;
}

//可以看出
for(;条件;){} == while(条件){}

· 三种循环对比:

如果有固定次数,用for循环;

如果必须执行一次,用do-while循环;

其他情况用while循环。

//循环控制
break   continue
/*不过它们只能对自己所在的那层循环进行跳出/重来,如果要逐层跳出循环的话,一种方法是——需要使用接力break,如下所示*/

        exit=1;
		break;
	}
}
if(exit=1) break;

//另一种方法是:

int main()
{
   
    
    xxx//此处代表省略了前面的一大堆,只展示结尾跳出部分
			goto out;
		}
	}
}
out:
	return 0;
}

? 有的时候,上一步的结果可以通过给一个新变量赋值,再通过新变量值的判断输出结果的方式来进行,并且有的时候,这种方式,比其他的一些比较大小要优越一点。

//五个一行
if(cnt%5==0){
    printf("\n");
}
//对的整整齐齐
printf("%d\t",x);
这个\t使它对齐
//题目练习:正序输出整数
int main()
{
    int x;
    scanf("%d",&x);
    
    int mask=1;
    int t=x;
    while(t>=10){
        t/=10;
        mask*=10;
    }
    while(mask>0){
        a=x/mask;
        x=x%mask;
        mask/=10;
        printf("%d",a);
        if(mask>0){
            printf(" ");
        }
    }
/*我认为我这样做是没错的,没必要do-while,因为mask它必然大于0,它初始都是1了,而且你前面唯一的可能是让它变大,所以你直接用while应该是没什么问题的。当然你do-while从逻辑上也是对的,更直白地表现出了它必须要进行一次。*/    
    return 0;
}

? 现在的问题就是,奥,我了解这个语法了,但是我做的题少,用起来还是很不熟悉,还是有可能在一些条件设置上犯错误,或者是选择了不太合适的语法。就是还要多练,多做题,这一遍过去之后回来一定要多做题练习熟练一点。

? ·关于do-while和while,前者虽然是在后面判断,但是它影响的是会不会进行下一次循环,所以它并不是使它可以后验,超出了这个要求就取消本次循环;恰恰相反,它还是必须要做一次的,还不如while。由于并没有后判断再取消操作的这种函数,所以只能是修改条件,把前置条件等价转化成若它在后置条件为此的时候所等价对应的前置条件,便如上所示,把 t>0 修改为 t>=10。

//使用辗转相除法计算最大公约数
#include <studio.h>
int main()
{
    int a,b;
    int t;
    scanf("&d &d",&a,&b);
    do{
        if(b=0){
        	printf("gcd=%d",a);
    	}
        else{
    	t=b;
    	b=a%b;
    	a=t;
        }
      }while(b!=0);
        
    return 0;
}
//例题一:求符合给定条件的整数集【这个的数字位数是确定的】

int a,b,c,d;
scanf("%d",&a);
b=a+1;
c=a+2;
d=a+3;
//这是我的尝试,我想先列出来,但这样并不明智……做不出来了

? 计算机为什么不能利用我们的方法枚举——因为它不能记忆上一个,还要去比对,看是不是重复,这个条件判断就很离谱,所以我们只能使用更适合计算机的也就是更普适的方法——递归。

//例题一:求符合给定条件的整数集【这个的数字位数是确定的】
int a;
scanf("%d",&a);
int i,j,k;
int cnt=0;
i=a;
j=a;
k=a;
while(i<=a+3){
    while(j<=a+3){
        while(k<=a+3){
            if(i!=j){
                if(i!=k){
                    if(j!=k){
                        printf("%d%d%d",i,j,k);
                        cnt++;
                        if(cnt%6=0){
                            print("\n");
                        }else{
                            print(" ");
                        }
                          
                    }
                }
                k++;
            }                          
            j++;
        }
        i++;
    }
}

我觉得不对劲啊…有点质疑这个答案

??是我对while的特性掌握不清还是对if的特性掌握不清?刚才读到了这句指令,但由于当时不符合条件而跳过了这句指令,之后因为操作使得条件符合了,就会去执行刚才那个指令吗??

//例题二:水仙花数【这个相比上一题,多了位数的不确定性和一个输出的条件判断】
//我在平板打草纸上写了一遍,今天就先不打上来了

? 一开始没做出来主要是因为思路跑偏了,被上一个例题带的,一直想一位数一位数的处理,至于每个用哪个方法我还没完全想清楚,再往后学学再回来考虑吧。

//例题三:下三角九九乘法表
//较为简单,暂时略
//例题四:统计素数求和
int main()
{
    int m,n;
    scanf("%d %d",&m,&n);
    int i;
    int cnt=0;
    int sum=0;
    if(m==1){
        m=2;
    }
    for(i=m;i<=n;i++){
        int isprime=1;
        int k;
        for(k=2;k<=n;k++){
            if(i%k==0){
                isprime=0;
                break;/*我一开始这里忘记加break了,逻辑上没错但是就要白费很多功夫,都已经知道它不是素数了你还算什么算…*/
            }
        }
        if(isprime=1){
            cnt++;
            sum+=i;
        }
    }
    printf("%d %d",cnt,sum);
    
    return 0;
}
//例题五:猜数字游戏
//比较简单,暂时略过
//例题六:求序列前n项和
//比较简单,暂时略过
//但此处引出了int上界和double上界的问题
//例题七:约分最简分式
int a,b;
scanf("%d/%d",&a,&b);
int m=0;
int n=1;
int t=1;
while(t>0){   
	m=b;
    b=a%b;
    t=a/b;
    a=m;
    if(a%b=0){
        n=b;
    }
}
if(m=0){
    printf("分母不能为0!");
}
printf("%d/%d\n",a/n,b/n);




//例题八:念数字
int a;
scanf("%d",&a);
int m=a;
int n=a;
int count=0;
int i;
/*因为后续用到余数相关,需要按0判别,所以首先处理完本身就是0的情况*/
if(a=0){
    printf("ling");
}


/*因为要从左往右读,所以先算出它是几位数*/
while(m!=0){
    m=m/10;
    count++;
}
/*得到最大的除数*/
for(i=1;i<=count;i++){
    int j=1;
    j*=10;
}

/*改进1:上面两个步骤可以合二为一,算出是几位数的同时得到应该除的部分
while(m>=10){
    int j=1;
    m/=10;
    j*=10;
}
只能说还是经验不足+基本模型没有很好的掌握,每次都在重新写一遍模型*/

/*逐个取出并念出*/
int b=1;
int k;
while(j>=1){
    k=n/j;
    if(k<0){
        printf("fu");
        printf(" ");
        k=-k;
        if(k=1){
            printf("yi");
     
        }else if(k=2){
            printf("er");
           
        }else if(k=3){
            printf("san");
            
        }else if(k=4){
            printf("si");
           
        }else if(k=5){
            printf("wu");
           
        }else if(k=6){
            printf("liu");
            
        }else if(k=7){
            printf("qi");
            
        }else if(k=8){
            printf("ba");
           
        }else if(k=9){
            printf("jiu");
           
        }else if(k=0){
            printf("ling");
            
        }
    }else if(k>0){
        if(k=1){
            printf("yi");
            
        }else if(k=2){
            printf("er");
            
        }else if(k=3){
            printf("san");
           
        }else if(k=4){
            printf("si");

        }else if(k=5){
            printf("wu");

        }else if(k=6){
            printf("liu");

        }else if(k=7){
            printf("qi");

        }else if(k=8){
            printf("ba");

        }else if(k=9){
            printf("jiu");

        }else if(k=0){
            printf("ling");

        }
    }
    n=n%j;
    j/=10;    
}
/*改进2:其实这里k<0只要一上来就输出fu然后变成正的就不用费两遍事了*/
/*改进3:我这里是删掉了每条后面赘余的空格的,首先你想每个后面加空格,你不用每句加一个呀好不,你直接在那后面写就行;另一方面,最后一个后面是不需要输出空格的,所以在改进二进行了的条件下,只需要在恰当的位置处加上:
if(j>=10){
    printf(" ");
}
*/




//例题九:求a的连续和
int a,n;
scanf("%d %d",&a,&n);
int i;
int sum1=0;
int sum2=0;
int j=1;
//错了 int k;
int k=1;
for(i=1;i<=n;i++){
    sum1+=2*j;
    sum2+=sum1;
    //这是一种办法,还有一种办法是可以b=b*10+a,比我这种更好想一点
    for(;k<=i;k++){
//错了 for(k=1;k<=i;k++){
//错了   t*=10;
		
        j*=10;
    }
//错了    j*=t;

}
printf("%d\n",sum2);

/*这里多套了一层是一个大错;另一个大错也是很重要的教训点:
在for循环里如果嵌套for循环,一定要注意,内部嵌套的那个很有可能不该写初始条件!!因为这样内部就会进行两次循环,所以说建议酌情,最好是把变量的初始值拿到最前面去,防止犯错!*/

? 务必要整理基本模型!!!比如素数、最大公约数、从左到右逐个输出、从右到左逐个输出等。

sizeof()
//注意它并不会对里面进行运算操作,只会按照规律去预判一下将获得的类型
char
short 
int 
long 
long long

数组

//例题:输入一堆不定量的个位数,并统计每个数字出现的次数
const int num=10;
int array[num];
int i;
int x;
for(i=0;i<=num;i++){
    array[i]=0;
}
/*可以直接
int array[num]{0};
*/
scanf("%d",&x);
while(x!=-1){
    if(x>=0&&x<=9){
        array[x]++;
    }
    scanf("%d",&x);
}
for(i=0;i<num;i++){
    printf("%d:%d\n",i,array[i]);
}
//一个是我还不太明白&是干嘛,为啥交替用i和x,另一个是我还是对循环的理解不太够
//数据的集成初始化
int a[]={1,2,3,4,5,6,7};
int a[13]={2,4,6} //剩余的都补位为0
//以下是一个C99 only的做法,也可以不给出数组大小,让编译器算
int a[10]={
    [0]=2,[2]=3,6,
}//这种方法特别适合初始数据稀疏的数组

sizeof(a)/sizeof(a[0])//是数组元素个数
//这样的代码,一旦修改数组中初始的数据,不需要修改遍历的代码
//还是素数那个题,我接下来用多种方式去构建

//方法1,较为常规,数学思维,sqrt方法

int i;
int isprime(i);//函数声明
//主函数
int main(){
    for(i=2;i<=20;i++){
        if(isprime(i)){
            printf("%d\n",i)
        }
    }
    return 0;
}
//定义的isprime()函数
int isprime(i){
    int t;
    isprime=1;
    for(t=2;t<=sqrt(i);t++){
        if(i%t=0){
            isprime=0;
            break; 
        }
    }
    return isprime;
}

//方法2,考虑到除了2以外的偶数都不可能,所以先构建一个包含了2的数组,然后逐渐往里面加//其实还有一种是你可以就是只考虑到偶数那一块儿,我放到方法4了

int primes[20]={2};
int length=1;
const int max=20;
int i;
int addprime(i,primes[],length);

int main(){
    for(i=3;i<=20;i+=2){
        addprime(i,primes[],length)
    }
    return 0;
}

int addprime(i,primes[],length){
    int t;
    for(t=2;t<=sqrt(i);t++){
        if(i%t==0){
            break;
        }else{
            primes[length++]=i;
            //我想知道,这里好像没有把真正的 length++ 哎…这不是个独立的变量空间吗…//!!对呀,所以完全搞错了。。
        }
    }
}

//方法二修改版:
int i;
int primes[length]={2};
int length=20;
int cnt=1;
int isprime(int i,int primes[],int length);

int main(){
    for(i=2;i<length;i++){
        if(isprime(i,primes[],length)){
            primes[cnt++]=i;
        }
    }
    //下面增加一段,以进行格式较为规整的输出
    for(i=0;i<length;i++){
        printf("%d",primes[i]);
        if((i+1)%5==0){
            printf("\t");
        }else{
            printf("\n");
        }
    }
    return 0;
}

int isprime(int i,int primes[],int length){
    ret=1;
    int x;
    for(x=0;x<length;x++){
        if(i%primes[x]==0){
            ret=0;
            break;      
        }
    }
    return ret;
}
//方法3:使用删除的方法
/*先构建一个数组,全是1
只挑选为1的,从0到满,去判断是不是isprime,是的就保持为1,并把它们的每个倍数全都设置为0,如果不是就把它自己弄成0
isprime依然是比较淳朴的样子
*/
//方法:使用数组来记录0,1:考虑到你无法直接说,我除去这个数(至少说目前我不知道如何完成这件事),所以还是那样,设计一个变量,然后我是1/0;再考虑好多好多数呢,所以就设置一个数组,它的键是数字,内部是0/1


/*int array[20]={1};
一上来就不对!!这样的话其他补位可都是0呀!*/

int i;
int isprime(i);
int sum=0;
const int max=20;
int array[max];

int main(){
    for(i=0;i<max;i++){
        array[i]=1;
    }
    
    for(i=2;sum<=20;i++){
        isprime(i);
        sum++;
    }
    printf("%d\n",array);
}

int isprime(i){
    int t;
    for(t=2;t<sqrt(i);t++){
        if(i%t==0){
            array[i]=0;
            break;
        }else{
            int x;
            for(x=2;x*i<20;x++){
                array[i]=0;
            }
        }
    }
}
//又犯了这个错…改吧

//方法三修改版1.2 :
int main(){
    int i;
    //int isprime(i);
    int array[max];
    const int max=20;
    
    for(i=0;i<max;i++){
        array[i]=1;
    }
    
    /*第一次注掉的
    for(i=2;i<max;i++){
        if(!isprime(i){
            array[i]=0;
        }else{
            int t;
            for(t=2;t*i<max;;t++){
                array[t*i]=0;
            }
        }
    }
    for(i=0;i<max;i++){
        if(isprime(i)){
            printf("%d\n",array[i]);
        }
    }*/
    
    /*第二次又被我注掉了,不错
    for(i=0;i<max;i++){
        for(x=2;x<sqrt(i);x++){
            if(i%x==0){
                array[i]=0;
                break;
            }else{
                for(t=2;t*i<max;t++){
                    array[t*i]=0;
                }
            }
        }
    }
    
    for(i=2;i<max;i++){
        if(array[i]){
            printf("%d\n9",i);
        }
    }*/
    
    //其实吧它这就是一个简单的数字逻辑问题,所有的非素数(除1外)一定是素数的整数倍,所以说,你只要从前往后地去掉所有已知素数的整数倍,那么在你往后走的过程中,遇到的没有被剔除的每个数都一定是素数了…来吧
    int i;
    int array[i];
    const int max=20;
    for(i=0;i<max;i++){
        array[i]=1;
    }
    
    for(i=2;i<max;i++){
        if(array[i]){
            int x;
            for(x=2;x*i<sum;x++){
                array[x*i]=0;
            }
        }
    }
    for(i=2;i<max;i++){
        if(array[i]){
            printf("%d\n",i);
        }
    }
    
    return 0;
}

//ok了!
/*int isprime(int i){
    int ret=1;
    for(t=2;t<=sqrt(i);t++){
        if(i%t==0){
            ret=0;
            break;
        }
    }
}*/
//好家伙,我想说,我觉得我这个修改后的确实没错,但我还是封装了函数,我突然发现,老师讲的意思是你不封装函数……那个0/1是数组的值!!好家伙,怪不得我找了半天都找不到老师写的函数在哪


/*//方法4→不想了,我直接注掉了
int i;
int ret;
int isprime(i);
int cnt=20;

int main(){
    for(i=1;cnt>0;i++){
        //我想知道在函数isprime里放上cnt--有用吗…不是说因为变量处于不同空间,所以改不了其他变量的值来?
        if(isprime(i)){
            printf("%d\n",i);
        }
    }
    return 0;
}


int isprime(i){
    ret=1;
    if(i==1||i%2==0&&i!=2){
        ret=0;
        cnt--;
    }else if(i!=2){
        int t;
        for(t=3;t<=sqrt(i);t+=2){
            if(i%t==0){
                ret=0;
                break;
            }else{
                cnt--;
            }
        }else{
            cnt--;
        }
        return ret;
    }
    
}*/

· 切记,一定不要只顾着赶进度,每一个章节对应的题都要认认真真再自己做一遍,看懂不等于理解,更不等于会做,一定要自己全部敲一遍,并且把老师所写代码的思想吃透!!

· 我这个犯错的思想其实有点受之前学python的影响,我觉得,把更多的东西封装进函数里,主函数越简洁越好,但这对于我目前学到的C语言的部分来说是不合理的,因为你的函数目前只是可以return一个值而已,并不能去修改你原本有的值。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 10:58:44  更:2021-08-03 10:59:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 0:49:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码