编程过程中笔记(C语言)(基础不好,从头开始)

代码编写用CB,需要注意的几点:

  1. 下面一栏不见用:view → log (或F2)
  2. 调试
    (1).Debug → Debugging windows → watches :先打开窗口,看调试一步一步变量值变化;
    (2).设置断点,光标定位于哪一行,按F5;
    (3).F4编译运行,出现黑框界面;
    (4).Next line 一步一步运行,看程序运行过程。
    若不能调试,则需要自动添加安装目录下的gdb32.exe.

问题笔记

1.输出Hello world!以及换行输出printf函数的返回值
(1)%d前面我其实还没有懂加\n,知道加会换行,但是这种我没有遇见过,希望朋友些帮我解答一下。

#include<stdio.h>
int main(){
    //int a;
    //int len = printf("Hello world!");
   // printf("Hello world!\n");
   // printf("\n");
    printf("\n%d\n",printf("Hello world!"));   //只能在%d的前面放\n,若没有,则输出Hello world 12不换行
    return 0;
}

(2)putchar(10)有换行的作用
putchar()函数是指向屏幕输出一个字符型数据,10按数字来讲就是一个整型,故在输出时系统会将10转换为字符,在ASCLL表中,第10个是换行符,故会输出换行符。

#include <stdio.h>
int main()
{
    int i = printf("Hello world!");
    putchar(10);    //若省略,则输出结果在同一行,参数只能是10,多或少都不行
    printf("%d\n", i);
}

(3)利用printf函数返回值赋值,和(1)同原理

#include<stdio.h>
int main(){
    int a = printf("Hello world!");
    printf("\n%d\n",a);
}

2.请输出十进制整数1234对应的八进制和十六进制。
八进制:%o(o是小写字母)
十进制:%x(可大写也可小写)
若输出需要显示前导则加#,八进制:%#o、十进制:%#X(x的大小写是对应输出大小写,注意输出要求)
补充:
(1)%lx 表示以十六进制格式打印long类型整数,%lo 表示以八进制格式打印long类型整数;
(2)%hd 表示以十进制显示short类型的整数,%ho 表示以八进制显示short类型的整数。

#include<stdio.h>

int main(){
    int i = 1234;
    printf("%#o %#X", i, i);
    return 0;
}

3.十六进制整数ABCDEF,对应的十进制整数是多少。
没有考虑到十六进制数可以用前导表示,想成输入的字符串,想法完全错误,看来真的急需要提高。用了char,也用了string。

#include<stdio.h>

int main(){
    //char ch;
    //ch = 'ABCDEF';
    //gets(ch);
    printf("%15d", 0XABCDEF);
    return 0;
}

4.字符金字塔(自己的一大难点)
字母和数字的,比较详细

for(i=1; i<=(n+1)/2; i++)	//行数要从第一行开始,i为行,j为列,此处的(n+1)/2为总行数
	{
		for(j=0; j<(n+1)/2 - i; j++)	// 打印空格,每行空格数为(n+1)/2 - i
		{	
			printf(" ");     //空格只需要管左上角的
		}
		for(j=0; j<2*i-1; j++)	// 打印**,每行打印*个数为 2*i - 1
		{
			printf("*");
		}
		printf("\n");
	}

原文链接:https://blog.csdn.net/adidas74891496/article/details/84454508

5.转换以下ASCII码为对应字符并输出他们

 printf("%C%C%C%C%C%C%C%C%C%C%C%C",73,32,99,97,110,32,100,111,32,105,116,33);

6.三行,第一行为出生年份,第二行为出生月份,第三行为出生日期。输出时如果月份或天数为1位数,需要在1位数前面补0。
( 1)过scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数),按此宽度截取所需数据;
(2)通过printf函数的%0格式控制符,输出数值时指定左面不使用的空位置自动填0。
(注:最开始没有想到scanf是这样输入的,想到是直接输入一个数,在printf时想办法分离数据。)

    int year,month,date;
    scanf("%4d%2d%2d",&year,&month,&date);
    printf("year=%04d\n",year);
    printf("month=%02d\n",month);
    printf("date=%02d",date);

7.输入一个字符,输出该字符相应的ASCII码
getchar()用法:
(1).从缓冲区读走一个字符,相当于清除缓冲区
(2).前面的scanf()在读取输入时会在缓冲区中留下一个字符’\n’(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar(),把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误
(3)使用下面的语句清除回车: while(getchar()!=’\n’);

    char c;
    c = getchar();
    printf("%d",c);

8.将一个四位数,反向输出。
最开始通过率为:60%,输入1000,输出为1,没有考虑前面输出为0的情况。
解决方法:printf输出的格式为%04d,若没有数自动补充0(与6题一样)
另外:%搞混了,把n % 1000想成了是剩余数(个位)
改:n = 1234
n % 1000 = 234; n % 100 = 34; n % 10 = 4;

#include<stdio.h>

int main(){
    int n,a,b,c,d;
    scanf("%d",&n);
    if(n >= 1000 && n <=9999)
    a = n / 1000;
    d = n % 10;
    b = n / 100 % 10;
    c = n /10 % 10;
    printf("%04d",d*1000 + c*100 +b*10 +a);
    return 0;
}

9.一年约有3.156×107s,要求输入您的年龄,显示该年龄合多少秒。
printf中输出的类型要一致,开始age是int类型,输出为%ld,但是结果有误,类型不一致导致的错误。
科学计数法:3.156e7 3.156e0 3.156e-7

int main(){
    long age;
    scanf("%d",&age);
    if(age > 0 && age <= 200)
    printf("%ld",age * 31560000);
    return 0;
}

10.分类统计字符个数
(1)计算字符串长度
(2)循环字符串,判断类型
最开始的误区:长度直接用n = length()表示,而且还要读取每一个字符串。C语言没有length()求字符串长度的用法。

void StringCount( char s[] ){
    int  letter = 0, blank = 0, digit = 0, other = 0;
    int n;
    n = strlen(s);  //计算字符串的长度
    for(int i = 0; i < n; i++){
        //char ch=getchar(i);
        if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')){
            letter ++;
        } 
        else if(s[i] >= '0' && s[i] <= '9'){
            digit ++;
        }
        else if(s[i] == ' ' || s[i] == '\n'){
            blank ++;
        }
        else{
            other ++;
        }
    }
    printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
    
}

11.编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和
注意:开始想的是把最高位算出来再加上后面的数,利用pow()需要在math.h的头文件中
解决:把除个位外的数先算出来,后面直接*10再加个位即得该数。

//函数fn须返回的是n个a组成的数字
int fn( int a, int n ){
    int sum = 0;
    for(int i = 0; i < n; i++){
       sum = sum * 10 + a;
    }
    return sum;
}
//SumA返回要求的和
int SumA( int a, int n ){
    int sum = 0;
    for(int i = 1;i <= n ;i++){  //从1开始数的,从0开始编译错误,是具体的数,不想数组可以从0开始
        sum = sum + fn(a,i);
    }
    return sum;
}

12.求cos(x)的近似值,精确到最后一项的绝对值小于e:
cos(x)=x0​​ /0!−x2​​/2!+x4/4!−x6/6!+⋯
注:(1)利用flag = -1实现多项式的正负
(2)分母的实现:递归,再想乘以i * (i + 1)
(3)分子的实现:递归,再相乘以自身的二次方

double funcos(double e, double x){
    dpible item = 1.0,cosx = 1.0, fenzi = 1.0, fenmu = 1.0;
    int flag, i;
    flag = -1;
    for(i = 2; fabs(item) >= e; i+=2){
        fenmu *= (i * (i + 1));
        fenzi *= (x*x);
        item = 1.0 * flag * fenzi/fenmu;
        cosx += item;
        flag *= -1; 
    }
    return cosx;
}

13.使用函数输出水仙花数
误区:水仙花数只有3位数,直接求相应位的位数
注:while(n)与while(m!=0)是一样的,满足n为真,直到n=0结束

int narcissistic( int number ){
	int i,n=0,sum=0,cnt=0;  
    n = number;  
    while(n){    //求位数
        cnt++;  
        n/=10;  
    }  
  
    n = number;  
    while(n){
		i=n%10;
        sum += (int)pow(i, cnt);   //求和
        n/=10; 
    }  
  
    if(sum == number)  
        return 1;  
    else  
        return 0;  
 
}
 
void PrintN( int m, int n ){  
  
    int i;  
  
    for(i=m+1;i<n;i++)  
        if(narcissistic(i))  
            printf("%d\n", i);  
}  

14.使用函数输出指定范围内的完数
注:(1)格式的书写,要正确,可能一个空格是关键
(2)特殊的要单独表示出来
(3)想最简洁的,例如,最大因子(出本身外)为n/2,效率会提高不少。

//函数factorsum须返回int number的因子和
int factorsum( int number ){
    int sum = 0;
     if (number == 1)
    {
        return 1;
    }
    else{
    for(int i = 1; i < number; i++){
        if(number % i == 0){
            sum += i;
        }
      }
    }
    return sum;
}
void PrintPN( int m, int n ){
    int count = 0;
    for(int i = m; i <= n; i++){
//         if(m == 1){
//             printf("1 is a perfect number");
//         }
           if(factorsum(i) == i){
             printf("%d = 1", i);
           for(int j = 2; j <= i/2; j++){ //除以2,最大的因子
               if(i % j == 0){
                   printf(" + %d",j);  //注意格式
               }
           }
            printf("\n");
            count++;
        }
    }
     if(count == 0){  //表示不是完数,没有因子
            printf("No perfect number\n");
        }
}

15.秒转化为时 分 秒

int  h = sec / 60 / 60;
int m = sec / 60 % 60;   //除以60后再取模,得到分钟
int s = sec % 60;       //直接取模得到秒

16.多组输入

while(~scanf("%d",&n))
    {
        
    }
  //或者
 while(scanf("%d",&n) != EOF)  //scanf输入几个数字就返回几个数字,若不正确就返回EOF
    {
        
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值