c实例练习笔记(拓展)

本博文参考题目的地址看右边----》C技能树

我跟你说!!!!!c语言有bool类型!!!!!你是不是百度跟你说没有只有c++才有?   是有的!!!!!! 这就是为啥我们要做扩展练习!!!!

// #include <stdbool.h> 引入这个文件  c语言就有bool 数据类型了; bool only_child=true;
// #include <ctype.h>//大小写处理 系统便准库  isalpha 该函数检查所传的字符是否是字母。 isupper判断大写返回1 ,islower(int c) 判断是不是小写
//  #include <stdarg.h>  va_list valist;定义变量 va_start 初始化va_start(valist, num); va_arg(valist, int);读字  va_end(valist);
//   itoa():将整型值转换为字符串。
//   ltoa():将长整型值转换为字符串。
//   ultoa():将无符号长整型值转换为字符串。
//   gcvt():将浮点型数转换为字符串,取四舍五入。
//   ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点。
//   fcvt():指定位数为转换精度,其余同ecvt()。

// 获取char字符串长度strlen(str)
// extern 申明变量在别的文件
// #include <windows.h> SetConsoleOutputCP(65001); 打印中文
// srand((unsigned) time(NULL)); 随机数种子(rand())
//  %d 十进制有符号整数
//  %u 十进制无符号整数
//  %f 浮点数
//  %s 字符串
//  %c 单个字符
//  %p 指针的值
//  %e 指数形式的浮点数
//  %x, %X 无符号以十六进制表示的整数
//  %o 无符号以八进制表示的整数
//  %g 把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
//  %p 输出地址符
//  %lu 32位无符号整数
//  %llu 64位无符号整数
//  %% 输出百分号字符本身。
//  %ld的L是long的意思,%ld表示按longint格式(有符号长整型数格式)输出。

打印二维数组char

#include <stdio.h>
#include <string.h>
#include <windows.h>
#define ROW 7
#define COL 50
void print(char arr[ROW][COL]){
   char str;
   for(int i=0;i<ROW;i++){
      printf("%s\n",arr[i]);
   }
   
}
int main(int argc, char** argv)
{
   SetConsoleOutputCP(65001);
    char feature[ROW][COL] = {
        "1. 语言简洁,使用方便灵活",
        "2. 可移植性好",
        "3. 表达能力强",
        "4. 表达方式灵活",
        "5. 可进行结构化程序设计",
        "6. 可以直接操作计算机硬件",
        "7. 生成的目标代码质量高"
    };
    printf("********** C语言特点 **********\n");
    print(feature);
    printf("*******************************\n");
    return 0;
}

计算圆的面积

#include <stdio.h>
#include <windows.h>
// #define PI 314e-2
#define PI 3.14   
// const float PI=3.14;
// const float PI;// 错误const 定义产量 要赋值
// PI=3.14;       // 错误 
int main(int argc, char** argv)
{
   SetConsoleOutputCP(65001);
    float radius = 2.0;
    float area = PI * radius * radius;
    printf("半径为%.2f的圆,面积是%.2f", radius, area);
    return 0;
}

 打印学生基本信息

bool类型其实是有的!!!!! !我才知道!!!

#include <stdbool.h>
#include <stdio.h>
#include <windows.h>
int main(int argc, char **argv)
{
   SetConsoleOutputCP(65001);
   int student_id=1001;
   char name[]="陈晓明";
   char sex[]="男";
   int age=19;
   double height=164.50;
   double weight=70.50;
   bool only_child=true;   //这个bool是c++的,所以题目出的多少有问题。因为c里面也可以跑c++,而c本身没有bool类型
   
   printf("学号:\t%d\n", student_id);
   printf("姓名:\t%s\n", name);
   printf("性别:\t%s\n", sex);
   printf("年龄:\t%d\n", age);
   printf("身高:\t%.2f\n", height);
   printf("体重:\t%.2f\n", weight);
   printf("是否独生子女:\t%s\n", only_child ? "是" : "否");

   return 0;
}

 英文字母判断

#include <stdio.h>
#include <windows.h>
#include <ctype.h>
int main(int argc, char** argv)
{
   SetConsoleOutputCP(65001);
    char ch;
    printf("请输入一个字符:");
    scanf("%c", &ch);

    if ('A'<=ch &&ch<='Z'||'a'<=ch &&ch<='z')//引入 #include <ctype.h> 用isalpha(ch)可以直接判断
        printf("字符 \'%c\' 是一个英文字母", ch);
    else
        printf("字符 \'%c\' 不是一个英文字母", ch);

    return 0;
}

while i++和++i  都会跳过i=0这个值

#include <stdio.h>
#include <windows.h>
#include <ctype.h>
#define UPPER 10
int main(int argc, char** argv){
   SetConsoleOutputCP(65001);
    int i = 1;
   while(i++<UPPER){ //先对比i<UPPER 才会执行i++; 如果是++i只会输出到9
      // if(i%10==0){
         printf("%d\n",i);
      // }
   }
    return 0;
}

 区间重叠判断

#include <stdio.h>
#include <windows.h>
#define MAX(a,b) ((a > b) ? a : b)
#define MIN(a,b) ((a < b) ? a : b)
int main(int argc, char** argv){
   SetConsoleOutputCP(65001);
    int start_1, end_1;
    int start_2, end_2;
    printf("请输入第1个闭区间(逗号分隔):");
    scanf("%d,%d", &start_1, &end_1);
    printf("请输入第2个闭区间(逗号分隔):");
    scanf("%d,%d", &start_2, &end_2);
    if(!(MAX(start_1,start_2)==start_2 &&MIN(start_1,end_2)==start_1)||(MAX(end_1,start_2)==start_2 &&MIN(end_1,end_2)==end_1))
        printf("两个区间不重叠!");
    else
        printf("两个区间重叠!");

    return 0;
}

int 组数的数组长度

#include <stdio.h>
#include <windows.h>
int main ()
{
   SetConsoleOutputCP(65001);
   int arr[] = {1,2,3,4,5};
   //注意前提,是arr[] 如果arr[10]长度就变成10了,所以一下定义是在arr[]形式下 可行
   int len=sizeof arr/sizeof(int);//sizeof(arr)/sizeof int;是不行的
   // int len=sizeof(arr)/sizeof(*arr);//
   // int len=sizeof(arr)/sizeof(arr[0]);//
   printf("%d",len);
   return 0;
}

 字符串 数组长度

#include <stdio.h>
#include <windows.h>
int main ()
{
   SetConsoleOutputCP(65001);
   char a[]={'h','e','l','l','o','\0'};
   int aSize=sizeof(a)/sizeof(*a);
   // int aSize=strlen(a);写法2 这种写法的前提是要求 a[] 
   //的尾巴一定要有 '\0'     直到空结束字符,但不包括空结束字符
   printf("%d",aSize);
   return 0;
}

 如果strlen如果自定的a[]尾巴没有‘\0’查出来会变成如下图

 但是对于用户输入的  scanf 这种就不用管他'\0'了因为用户输入完一般是要回车的!

这也就是我扩展练习的时候才发现,之前以为一个strlen就搞定了,之前也觉得要引入<string.h>,现在发现不引入也没事

c语言,逗号运算符

他是这样,括号里面 取最后的一个值给z, 是由顺序决定的!跟大小无关!

c和c++是一样的  ,看这篇===》C++ 逗号运算符 | 菜鸟教程

#include <stdio.h>
#include <windows.h>
int main ()
{
   
   SetConsoleOutputCP(65001);
   int x, y, z;
   x = y = 1;
   z=(1,2);
    //要让结果输出 2 3 1
   printf("%d\n", z);
   return 0;
}

 如果你换一种写法

z=1,2;

 看懂了吗,这玩意教程里面也没教。博主只能靠换值去试

运算符优先级与求值顺序

自己做了一遍还是感觉以后会忘记,有必要记录下现在的思路

#include <stdio.h>
#include <windows.h>
int main ()
{
   
   SetConsoleOutputCP(65001);
   int x, y, z;
   x = y = 1;
   z=(++x,y++),y++; 
   // 输出结果要是 2,3,1。
   printf("%d,%d,%d\n", x, y, z);
   return 0;
}

 1、首先尾巴的y++跟z没关系,不懂的去看上面那个案例c语言,逗号运算符博主有举例

 2、z只跟(a,b)里面的b的取值有关,跟a无关

 3、因为题目要求z=1;所以要先赋值在运算,而++y会变成先  y+1;然后z才等于y,所以不行

 4、因为x要输出2 ,括号里面是x++还是++x;都跟z没关系!所以随便写

 5、因为结果y要输出3,前面y已经是2了,所以尾巴是y++还是++y;都没关系。

 值互换函数传参

#include <stdio.h>
#include <windows.h>
void huan(int *x,int *y){
   int z=*y;
   *y=*x;
  *x=z;
}
int main ()
{
   
   SetConsoleOutputCP(65001);
   int a;
   int b;
   printf("请输入2个数字用逗号隔开:");
   scanf("%d,%d",&a,&b);
   huan(&a,&b);
   printf("%d,%d",a,b);
   return 0;
}

 我竟然做错了。。。。

切记要改变量值,要传&,  有& 就有*指针。一对。

goto语句:求10以内的数之和

第一次看到这种循环体

他是这样你写一个if(){},然后再if前面加一个自定义变量 a:if(){},然后再if里面 i++;去goto去跑a,就跟while很像,只不过while没有goto。

#include <stdio.h>
#include <windows.h>
int main()
{
    SetConsoleOutputCP(65001); 
   int sum = 0;
   int i = 0;
   a:if(++i<=10){
      sum+=i;
      goto a;
   }
   printf("10以内的正整数之和为:%d", sum);
   return 0;
}

 函数申明和定义几种写法

1、先申明、后面在定义

  int型

#include <stdio.h>
#include <windows.h>
void print_skill_tree(int,int);
int main()
{
   SetConsoleOutputCP(65001);
   int tree_name = 1;
   int tree_link = 2;
   print_skill_tree(tree_name, tree_link);
   return 0;
}
void print_skill_tree(int a,int b){
   printf("%d,%d",a,b);
}

 char型

#include <stdio.h>
#include <windows.h>
void print_skill_tree(char [],char []);
int main()
{
   SetConsoleOutputCP(65001);
   char tree_name[] = "微信搜";
   char tree_link[] = "程序员实用资源";
   print_skill_tree(tree_name, tree_link);
   return 0;
}

 2、直接定义和申明

void print_skill_tree(char arr[],char arr1[]){
   printf("%s,%s",arr,arr1);
}
int main()
{
   SetConsoleOutputCP(65001);
   char tree_name[] = "微信搜";
   char tree_link[] = "程序员实用资源";
   print_skill_tree(tree_name, tree_link);
   return 0;
}

 函数返回字符串 函数指针

#include <stdio.h>
#include <windows.h>
char* a(){
   return "湖南";
};
int main()
{
   SetConsoleOutputCP(65001);
   printf("%s",a());
}

 模拟循环那题 答案是错的~!!!!!!!!

我模拟了下,如下

#include <stdio.h>
#include <windows.h>
void a(int i){
   
   if(i<10){
      a(++i);
      printf("%d\n",i);
   }
}

int main()
{
   SetConsoleOutputCP(65001);
   a(1);
}

这个结果是

 所以正确的写法应该是

#include <stdio.h>
#include <windows.h>
void a(int i){
   
   if(i<10){
      printf("%d\n",i);
      a(++i);
      
   }
}

int main()
{
   SetConsoleOutputCP(65001);
   a(1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪狼之夜

打个赏,让博主知道博文没白写

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值