PAT (Basic Level) Practice学到的东西C语言篇

1 函数

  • sprintf 和 sscanf
int sprintf(char *str, const char *format, ...);
str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
format -- 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
...--想要输入的东西
例如:sprintf(n,"%04d",num);
num以%04d的格式输出到字符数组n里面
这样如果num不足四位,也可以补0了。
sscanf(a,"%lf",&temp);
a是字符数组,a以%lf的格式输入到temp里面
  • 如果 c 是一个数字,则该函数返回非零值,否则返回 0。同理 isalpha 等函数
int isdigit(int c);
  • 使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。
  • 如果前面使用的不是 gets() 而是 scanf,那么通过键盘给 ch 赋值前就必须先使用 getchar() 清空缓冲区。
# include <stdio.h>
int main(void)
{
    char str[30];
    char ch;
    printf("请输入字符串:");
    gets(str);
    printf("%s\n", str);
    scanf("%c", &ch);
    printf("ch = %c\n", ch);
    return 0;
}
  • 快排
 int cmp(const void* a,const void*b){
     int * pa = (int *)a;
     int * pb = (int *)b;
     int numa = *pa;
     int numb = *pb;
     return numa - numb;
 }
qsort(score,n,sizeof(int),cmp);
  • 字符数组比较,赋值
strcmp(a,b);
strcpy(des,a);
  • int 接收pow要强制转换成int
wei = a % (int)pow(10,d);

2 数字

  • 判断质数
int isPrime(int n){
	if(n <= 1){
		return 0;
	}
	for(int i = 2; i*i <= n; i++){
		if(n % i == 0){
			return 0;
		}
	}
	return 1;
}
  • 求个位十位百位
	int bai = sum / 100 % 10;//(%10有没有都行)
	int shi = sum / 10 % 10;
	int ge = sum % 10;

取时,分,秒 逻辑是类似的。

    h = t / 3600;
    m = t / 60 % 60;
    s  =t % 60;

同理 十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可。

change / (29 * 17), change / 29 % 17, change % 29
  • 把最大值最小值先赋值了,确保最大值不会比任何一个值大,最小值不会比任何一个值小(0 <= n <= 100)
max.grade = -1;
min.grade = 101;
  • 算出一个数字的位数
while(n > 0){
	count++;
	n = n / 10;
}
  • long long
long long 范围更大
%lld
  • int 不能以%f输出,float也不能以%d输出
 否则输出的会是0或者其他奇怪的数。
  • 以d进制输出
    dd是d进制后的数组,sum是待转化的10进制数,d是进制 1 < d <= 10.
    除于d再取模,最后倒着输出。
while(sum > 0){
	dd[i] = sum % d;
	sum = sum / d; 
	i++;
}
  • 求最大值的时候,如果要输出位置,可以这样写以保存位置
 if(score[max] < score[i]){
      max = i;
 }
  • 如果一个数 a < 0.005 && a > -0.005 那么 这个数.2f会被四舍五入输出为0,而又由于这是负数,所以会被输出-0。
if(b < 0 && b > -0.005){
     b = 0;
}

  • 向上取整向下取整四舍五入取整
double floor(double)向下取整
double ceil(double)向上取整
double round(double)四舍五入取整
double round(double x)四舍五入取整
{
    return (x > 0.0) ? floor(x + 0.5) : ceil(x - 0.5);
}
(int)(pram) 正数向下取整,负数向上取整。整体向0取整。
(int)(pram + 1)正数向上取整
(int)(pram - 1)负数向下取整
(int)(param - 0.5)负数四舍五入取整
(int)(param + 0.5)正数四舍五入取整

3 字符和字符数组

  • 按数字输出对应星期,利用二维数组下标实现
char week[7][4] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
  • 用字符数组接收数字记得
 - '0'或者 + '0'
  • 将输入的字符直接作为数组下标,判断字符个数
num[ch1[i]]++;
  • 字符串含有空格,一定不要用scanf
gets(s);
  • 倒置数组
int reverse(char a[],int n){
    int left = 0;int right = n-1;
    char temp;
    while(left < right){
        temp = a[left];
        a[left] = a[right];
        a[right] = temp;
        left ++;
        right--;
    }
}
  • 倒置数字
int reverse(int num){
	int t = 0;
	int n = num;
	while(n>0){
		t = t * 10 + n % 10; 
		n = n / 10;
	}
	return t;
}	
  • 判断回文直接判断字符串版
int isHuiwen(char * n){
	for(int i = 0; i < 4; i++){
		if(n[i]!=n[7-i]){
			return 0;
		}
	}
	return 1;
}
  • 判断回文倒置数字,比较数字版
int isHuiwen(int num){
	int t = 0;
	int n = num;
	while(n>0){
		t = t * 10 + n % 10; 
		n = n/10;
	}
	if(t == num){
		return 1;
	}
	return 0;
}	
  • 输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 [ ] 内。符号会有多个字符,怎样把符号取出来呢。
    不断取字符,如果为 [ 则 正则输入%[^]] 表示不断输入 遇到 ] 为止
while((ch = getchar()) != '\n'){
		if(ch == '[')
			scanf("%[^]]",hand[a[0]++]);//hand为二维数组
	
	}
  • 当读到一行只有单个 # 字符时,输入结束
if(strcmp(store[i],"#") == 0){//和字符串相比可不行
	break;
}
//或者
end[2] = "#";
if(strcmp(store[i],end) == 0){
	break;
}
  • 要输入多个字符 还要空格和回车记得用 getchar() 接收
for(int j = 0; j < 4; j++){
	scanf("%c-%c",&timu,&zhengque);
	getchar();//接收空格 和回车 
	if(zhengque == 'T'){
		printf("%d",timu - 'A' + 1);
	}
}

4 其他

  • 格式化输出
printf("%.2f",a);//输出两位小数
printf("%04d",a);//输出四位整数,不足补零
  • 设置flag = 0,刚开始不会输出空格

例一

if(flag == 1){
	printf(" ");
}
flag = 1;

例二

if(flag == 0){
     printf("%d",i+1);
     flag = 1;
 }
else{
     printf(" %d",i+1);
}

利用for循环的循环变量

	for(int i = row;i >= 0;i--){
		//printf("%s",c[i]);
		if(i > 0){
			printf(" ");
		}
		
	} 
  • 输出 %
%% 不能用\%
  • 不断输入 直到文件结束
while(scanf("%d%d",&a,&n) != EOF)
  • 如果每个人都要有一个标识,代表一些含义,这时可以采用结构体的形式。保存姓名和标识。
    可以代替二维数组的使用。
typedef struct Person
{
    char name[21];
    bool flag;
}person;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值