代码编写用CB,需要注意的几点:
- 下面一栏不见用:view → log (或F2)
- 调试
(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
{
}