目录
从0开始的C语言学习:)
第一章很简单所以略0.0
第二章 运算和数据类型
2-1 运算
练习2-1
显示出前者是后者的百分之几:
#include <stdio.h>
int main(void)
{
int vx,vy;
puts("请输入两个整数。");
printf("整数a、整数b:\n"); scanf_s("%d%d", &vx,&vy );
printf("a是b的%d%%。\n",100*vx/vy);
return 0;
}
练习2-2
读取两个整数然后输出它们的和,积:
#include <stdio.h>
int main(void)
{
int x, y;
puts("please input two integer:"); scanf_s("%d%d", &x, &y);
printf("sum=%d multiply=%d",x+y,x*y);
return 0;
}
2-2 数据类型
练习2-3
读出两个实数的值:
#include <stdio.h>
int main(void)
{
double x;
double y;
puts("please put x,y:");
printf("double x:"); scanf_s("%lf", &x);
printf("double y:"); scanf_s("%lf", &y);
printf("%f\n%f",x,y);
return 0;
}
练习2-4
对整型常量、浮点型常量、int型变量和double型变量进行乘除等各种运算:
#include <stdio.h>
int main(void)
{
int n1, n2, n3, n4;
double d1, d2, d3, d4;
int x;
double y;
puts("please input x,y:");
printf("int x:"); scanf_s("%d",&x);
printf("double y:"); scanf_s("%lf",&y);
printf("division x=%d multiply x=%d\n", x / 2,x*2);
printf("division y=%f multiply y=%f\n\n", y / 2.0,y*2.0);
n1 = 5 / 2;
n2 = 5.0 / 2.0;
n3 = 5.0 / 2;
n4 = 5 / 2.0;
d1 = 5 / 2;
d2 = 5.0 / 2.0;
d3 = 5.0 / 2;
d4 = 5 / 2.0;
printf("n1=%d\n", n1);
printf("n2=%d\n", n2);
printf("n3=%d\n", n3);
printf("n4=%d\n\n", n4);
printf("d1=%f\n", d1 );
printf("d2=%f\n", d2);
printf("d3=%f\n", d3);
printf("d4=%f\n", d4);
return 0;
}
练习2-5
计算前者是后者的百分之几,并用实数输出结果:
#include <stdio.h>
int main(void)
{
int x, y;
puts("please input two integer:");
printf(" x:"); scanf_s("%d", &x);
printf(" y:"); scanf_s("%d", &y);
printf("x的值是y的%f %%。\n",(double)(100*x/ y));
return 0;
}
练习2-6
读取表示身高的整数值,显示出标准体重的实数值。标准体重根据公式(身高-100)*0.9进行计算,所得结果保留一位小数:
#include <stdio.h>
int main(void)
{
double h;
printf("please input your height;"); scanf_s("%lf", &h);
printf("your standard weight is :%.1f kg", (h - 100) * 0.9);
return 0;
}
第三章 分支结构程序
3-1 if语句
练习3-1
输入两个整数,如果后者是前者的约数,则显示b是a的约数;如果不是,则显示b不是a的约数:
#include <stdio.h>
int main(void)
{
int a, b;
puts("please input two integer:");
printf(" a:"); scanf_s("%d", &a);
printf(" b:"); scanf_s("%d", &b);
if (a % b)
puts("b不是a的约数");
else
puts("b是a的约数");
return 0;
}
练习3-3
输入一个整数值,显示出它的绝对值:
#include <stdio.h>
int main(void)
{
int x;
printf("input an integer:"); scanf_s("%d", &x);
if (x >= 0)
printf("x的绝对值是%d",x);
else
printf("x的绝对值是%d",x=-x);
return 0;
}
练习3-4
输入两个整数,显示它们之间的大小关系:
#include <stdio.h>
int main(void)
{
int x,y;
puts("input an integer:");
printf(" x:"); scanf_s("%d", &x);
printf(" y:"); scanf_s("%d", &y);
if (x == y)
puts("x equal y");
else
if (x > y)
puts("x>y");
else
puts("x<y");
return 0;
}
练习3-5
确认相等运算符和关系运算符的运算结果是1和0:
#include<stdio.h>
int main(void)
{
int a, b, c, d, e, f, x1, x2;
puts("please input two integer:");
printf(" x:"); scanf_s("%d", &x1);
printf(" y:"); scanf_s("%d", &x2);
a = (x1 == x2);
b = (x1 != x2);
c = (x1 <= x2);
d = (x1 >= x2);
e = (x1 > x2);
f = (x1 < x2);
printf("%d %d %d %d %d %d", a, b, c, d, e, f);
return 0;
}
练习3-6
计算输入的三个整数中的最小值,并显示 :
#include<stdio.h>
int main(void)
{
int a, b, c,min;
printf("please input 3 integer:\n");
scanf_s("%d %d %d", &a, &b, &c);
min = a;
if (b < min) min = b;
if (c < min) min = c;
printf("the minimum one is %d.\n", min);
return 0;
}
练习3-7
计算输入的四个整数中的最大值并显示 :
#include<stdio.h>
int main(void)
{
int a, b,c,d,max;
printf("please input 4 integer:\n");
scanf_s("%d %d %d %d", &a, &b, &c, &d);
max = a;
if (b > max) max = b;
if (c > max) max = c;
if (d > max) max = d;
printf("the biggest one is %d", max);
return 0;
}
练习3-8
使用if语句计算输入的两个运算符的差值 :
#include<stdio.h>
int main(void)
{
int a, b;
printf("please input 2 integer:");
scanf_s("%d%d", &a, &b);
if (a > b)
printf("the deviation is %d", a - b);
else
printf("the deviation is %d", b - a);
return 0;
}
练习3-9
使用条件运算符,计算输入的三个整数中的最小值 :
#include<stdio.h>
int main(void)
{
int a, b, c, min;
printf("please input 3 integer:\n");
scanf_s("%d %d %d", &a, &b, &c);
min = (b < a) ? b : a;
min = (c < min) ? c : min;
printf("the minimum one is %d.\n", min);
return 0;
}
练习3-10
输入三个数,显示有几个相等,否则显示三个值各不相等 :
#include<stdio.h>
int main(void)
{
int a,b,c;
puts("请输入三个整数:");
scanf_s("%d%d%d", &a, &b, &c);
if(a==b&&b==c)
printf("三个值都相等");
else if(a==b||b==c||a==c)
printf("有两个值相等");
else
printf("三个值都不相等");
return 0;
}
练习3-11
输入两个整数,如果它们的差值小于10,则显示它们的差值小于10;否则,显示它们的差值大于11。 :
#include <stdio.h>
int main(void)
{
int x, y;
printf("please input 2 integer:");
scanf_s("%d%d", &x, &y);
if ((x - y) >= 11 || (y - x )>= 11)
printf("它们的差大于11");
else
printf("它们的差小于10");
return 0;
}
3-2 switch语句
练习3-12
用Switch语句实现判断输入的整数值是奇数还是偶数:
#include <stdio.h>
int main(void)
{
int n;
printf("n:");
scanf_s("%d", &n);
switch (n % 2) {
case 0:printf("是偶数"); break;
default:printf("是奇数"); break;
}
return 0;
}
练习3-13
用Switch语句实现显示输入的月份所在的季节:
#include <stdio.h>
int main(void)
{
int month;
printf("input a month:");
scanf_s("%d", &month);
switch (month) {
case 3:case 4:case 5:printf("%d is spring", month); break;
case 6:case 7:case 8:printf("%d is summer", month); break;
case 9:case 10:case 11:printf("%d is autumn", month); break;
case 12:case 1:case 2:printf("%d is winter", month); break;
}
return 0;
}
第四章 程序的循环控制
4-1 do语句
练习4-1
输入一个整数,判断该整数的符号,并循环任意次:
#include <stdio.h>
int main(void)
{
int retry;
do {
int no;
printf("input n:");
scanf_s("%d", &no);
if (no == 0)
puts("n=0");
else if (no > 0)
puts("n>0");
else
puts("n<0");
printf("again?[yes0/no]:");
scanf_s("%d", &retry);
} while (retry == 0);
return 0;
}
练习4-2
读取两个整数的值,然后计算出它们之间的所有整数的和:
#include <stdio.h>
int main(void)
{
int a, b, n; /*从键盘输入两个整数a,b;用n存放第一个值*/
int sum = 0; /*所有数之和sum初始化为0*/
printf("请输入两个整数:\n");
scanf_s("%d%d", &a, &b);
/*因为a、b的大小不同,求和有两种顺序*/
if (a < b) {
n = a; /*如果a<b,则将a的值赋给n,并进行累加求和*/
do {
sum = sum + n; /*可以想象,每次循环中n+1*/
n++; /*遇到第一次条件时,sum=a,n=a+1,n即为下次要加上的数...*/
} while (n<=b); /*a与b之间的和,相当于b-n+1个整数相加,需进行b-n个条件循环,即n=b+1时打破循环条件*/
printf("sum is %d", sum);
} /*例如2,6之间有5个数相加,需要进行4次循环,在n=7时打破循环条件n<=6,跳出循环*/
else if (a > b) {
n = b;
do {
sum = sum + n;
n++;
} while (n<=a);
printf("sum is %d", sum);
}
return 0;
}
4-2 while语句
练习4-3
从输入的整数开始倒数到0,并输出,且当输入值为负数时不换行:
#include <stdio.h>
int main(void)
{
int no;
printf("no:");
scanf_s("%d", &no);
while (no >= 0) {
printf(" %d", no);
no--;
}
while (no >= 0) {
printf("\n");
}
return 0;
}
练习4-4
从输入整数开始倒数到1,并显示,且当输入的值小于0时不换行:
#include <stdio.h>
int main(void)
{
int no;
printf("请输入一个正整数: ");
scanf_s("%d", &no);
while ( no > 0) {
printf("%d ", no--);
}
if (no == 0)
printf("\n");
return 0;
}
练习4-5
递增显示从1到输入的正整数为止的各个整数,并且当输入的值小于0的时候不换行:
#include <stdio.h>
int main(void)
{
int no;
int i = 1;
printf("input n:");
scanf_s("%d", &no);
while (i <= no) {
printf("%d ", i++);
}
if (no >= 0)
printf("\n");
return 0;
}
练习4-6
升序显示出小于输入值的所有正偶数:
#include <stdio.h>
int main(void)
{
int no;
int i = 2;
printf("input n:");
scanf_s("%d", &no);
while (i <= no) {
printf("%d ", i++);
i++;
}
printf("\n");
return 0;
}
练习4-7
升序显示出小于输入的整数的所有2的乘方:
#include <stdio.h>
int main(void)
{
int no;
int i = 2;
printf("input n:");
scanf_s("%d", &no);
while (i <= no) {
printf("%d ", i);
i *= 2;
}
return 0;
}
练习4-8
输入一个整数,连续输出该整数个*,当输入的值小于1时不输出换行符:
#include <stdio.h>
int main(void)
{
int no;
int i;
printf("input n:");
scanf_s("%d", &no);
i = no;
while (i-- > 0) {
putchar('*');
}
if (no > 0)
putchar('\n');
return 0;
}
练习4-9
:交替显示+和-,总个数等于所输入的整数值,另外当输入小于0的整数时,则什么都不显示。
#include<stdio.h>
int main(void)
{
int num;
int i = 0;
printf("正整数:");
scanf_s("%d", &num);
do {
++i;
if (i % 2 == 0)
putchar("-");
else
putchar("+");
} while (i<num);
return 0;
}
练习4-10
:连续显示*,总个数等于所有输入的整数值。另外,当输入小于0的整数时什么都不显示。
#include <stdio.h>
int main(void)
{
int num;
int i = 0;
printf("正整数:");
scanf("%d",&num);
while (i++ < num){
printf("*\n");
}
return 0;
}
练习4-11
:输入一个非负整数,并逆向显示。
#include<stdio.h>
int main(void)
{
int i;
do {
printf("请输入一个正整数:");
scanf_s("%d", &i);
if (i <= 0) {
puts("请不要输入非正整数。");
}
} while (i <= 0);
printf("%d逆向显示结果是:",i);
while (i > 0) {
printf("%d", i % 10);
i /= 10;
}
puts("。");
return 0;
}
练习4-12
:读取一个正整数,并显示其位数。
#include<stdio.h>
int main(void)
{
int n;
int i = 0;;
do {
printf("please input n:");
scanf_s("%d", &n);
if (n <= 0)
printf("try again:");
} while (n <= 0);
printf("%d bits are :",n);
while (n > 0) {
n /= 10;
i++;
}
printf("%d", i);
return 0;
}
4-3 for语句
练习4-13
:键入n的值,求1到n的和
#include<stdio.h>
int main(void)
{
int i = 0;
int sum = 0;
int n;
printf("输入n:");
scanf_s("%d", &n);
for (i = 1;i <= n;i++) {
sum += i;
}
printf("从1到n的和:%d\n", sum);
return 0;
}
练习4-14
:输入一个整数,循环显示1234567890,显示的位数和输入的整数值相同。
#include <stdio.h>
int main(void)
{
int n, i;
printf("请输入一个整数:");
scanf_s("%d", &n);
for (i = 1;i <= n;i++)
{
printf("%d", i % 10);
}
return 0;
}
练习4-15
显示身高和标准体重的对照表,显示的身高范围和间隔由输入的整数控制,标准体重精确到小数点后两位。
#include <stdio.h>
int main(void)
{
int h1, h2;
int i;
double weight;
printf("开始数值:");scanf_s("%d", &h1);
printf("结束数值:");scanf_s("%d", &h2);
printf("间隔数值:");scanf_s("%d", &i);
for (;h1 <= h2;h1 += i) {
weight = (h1 - 100) * 0.9;
printf("%dcm %.2fkg\n", h1, weight);
}
return 0;
}
练习4-16
输入一个整数,显示小于等于该整数的所有奇数。
#include<stdio.h>
int main(void)
{
int n;
printf("请输入一个整数:");
scanf_s("%d", &n);
for (int i = 1;i <= n;i++) {
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}
练习4-17
输入一个整数,显示1到n的整数的二次方。
#include<stdio.h>
int main(void)
{
int n;
printf("请输入一个整数:");
scanf_s("%d", &n);
for (int i = 1;i <= n;i++) {
printf("%d 的二次方是 %d\n", i,i*i);
}
return 0;
}
练习4-18
输入一个整数值,显示该整数值个*,每显示五个就换行。
#include<stdio.h>
int main(void)
{
int n;
int i;
printf("请输入一个整数:");
scanf_s("%d", &n);
for (i = 1;i <= n;i++) {
putchar('*');
if (i % 5 == 0) {
printf("\n");
}
}
return 0;
}
练习4-19
输入一个整数,显示其所有约数,及约数的个数。
#include<stdio.h>
int main(void)
{
int n, i;
int sum = 0;
printf("整数值:");
scanf_s("%d", &n);
for (i = 1;i <= n;i++) {
if (n % i == 0) {
printf("%d\n", i);
sum++;
}
}
printf("约数有%d个。", sum);
return 0;
}
4-4 多重循环
练习4-20
为九九乘法表添加横纵标题。
#include<stdio.h>
int main(void)
{
int i, j;
printf(" |");
for (int a = 1;a <= 9;a++) {
printf("%3d",a);
}
putchar('\n');
printf("---------------------------------\n");
for (i = 1;i <= 9;i++) {
printf("%2d |", i);
for (j = 1;j <= 9;j++)
printf("%3d", i * j);
putchar('\n');
}
return 0;
}
练习4-21
显示以所输入的整数为边长的正方形
#include<stdio.h>
int main(void)
{
int i, j;
int n;
printf("how long?");
scanf_s("%d", &n);
for (i = 1;i <= n;i++) {
for (j = 1;j <= n;j++)
putchar('*');
putchar('\n');
}
return 0;
}
练习4-22
画一个长方形,总使较短的边作为高。
#include<stdio.h>
int main(void)
{
int i, j;
int n1, n2, n;
printf("input n1,n2:\n");
scanf_s("%d%d", &n1, &n2);
if (n1 > n2) {//比较n1和n2的大小
n = n1;//复制n1中的值到n中
n1 = n2;//将n2的值赋给n1
n2 = n;//将n1的值赋给n2
}
for (i = 1;i <= n1;i++) {
for (j = 1;j <= n2;j++)
putchar('*');
putchar('\n');
}
return 0;
}
练习4-23
显示等腰直角三角形在左上方和右上方的图像。
#include<stdio.h>//左上三角形
int main(void)
{
int i, j;
int len;
puts("shorts len:");
scanf_s("%d", &len);
for (i = len;i >= 1;i--) {
for (j = 1;j <= i;j++)
putchar('*');
putchar('\n');
}
return 0;
}
#include<stdio.h>//右上三角形
int main(void)
{
int i, j;
int len;
puts("shorts len:");
scanf_s("%d", &len);
for (i = len;i >= 1;i--) {
for (j = 1;j <= len - i;j++)
putchar(' ');
for (j = 1;j <= i;j++)
putchar('*');
putchar('\n');
}
return 0;
}
练习4-24
输入一个整数,显示出输入整数层的金字塔图像。
#include <stdio.h>
int main()
{
int blank, star;
int l,j;//长度l用来控制行数j循环次数,i和j共同控制blank和star(输出字符)的循环
puts("让我们来画一个金字塔。");
printf("金字塔有几层:");
scanf("%d",&l);
for (j = 1;j <= l;j ++)//j表示第几次循环,表示输出三角形第几层的图案
{
for (blank = 1;blank <= l - j;blank ++)//表示第j层中应先输出多少空格
{
putchar(' ');
}
for (star = 1;star <= (j - 1) * 2 + 1;star ++)//表示第j层中应再输出多少*
{
putchar('*');
}
putchar('\n');
}
return 0;
}
练习4-25
显示输入整数层的向下的金字塔形状,第i行显示i%10的结果。
#include <stdio.h>
int main()
{
int blank, star;
int j,i;
puts("让我们来画一个金字塔。");
printf("金字塔有几层:");
scanf("%d",&i);
for (j = 1;j <= i;j ++)//与上一题类似,j从1递增
{
for (blank = 1;blank <= j - 1;blank ++)//每次for循环递增输出j-1个空格
{
putchar(' ');
}
for (star = 1;star <= (i - j) * 2 + 1;star ++)//每次for循环递减输出*
{
printf("%d",j % 10);//显示输出的整数为层数
}
putchar('\n');
}
return 0;
}
第五章 数组
5-1 数组
练习5-1
依次将数组中的元素赋值为01234。
#include<stdio.h>
int main(void)
{
int i;
int x[5];
for (i = 0;i < 5;i++) {
x[i] = i;
}
for (i = 0;i < 5;i++) {
printf("x[%d]=%d\n", i, x[i]);
}
return 0;
}
练习5-2
依次将数组中的元素赋值为54321。
#include<stdio.h>
int main(void)
{
int i;
int x[5];
for (i = 0;i < 5;i++) {
x[i] = 5-i;
}
for (i = 0;i < 5;i++) {
printf("x[%d]=%d\n", i, x[i]);
}
return 0;
}
练习5-3
依次用54321将数组初始化。
#include<stdio.h>
int main(void)
{
int a[5] = { 5,4,3,2,1 };
int i;
for (i = 0;i < 5;i++)
printf("a[%d]=%d\n",i, a[i]);
return 0;
}
练习5-4
将数组a中的元素按倒序复制到数组b中。
#include<stdio.h>
int main(void)
{
int a[5] = { 17,23,36 };
int b[5];
int i;
for (i = 0;i < 5;i++)
b[4 - i] = a[i];
puts(" a b");
puts("----------");
for (i = 0;i < 5;i++)
printf("%4d%4d\n", a[i], b[i]);
return 0;
}
练习5-5
将数组中的元素倒序排列,改用对象式宏来定义元素个数。
#include<stdio.h>
#define NUMBER 7
int main(void)
{
int i;
int x[NUMBER];
for (i = 0;i < NUMBER;i++) {
printf("x[%d]:", i );
scanf_s("%d", &x[i]);
}
for (i = 0;i < 3;i++) {
int temp = x[i];
x[i] = x[6 - i];
x[6 - i] = temp;
}
puts("倒序排列:");
for (i = 0;i < NUMBER;i++)
printf("x[%d]=%d\n", i, x[i]);
return 0;
}
练习5-6
假设变量a是double型,变量b是int型,请说明经过以下赋值后a和b的值分别是多少。
a=b=1.5;
#include<stdio.h>
int main(void)
{
double a;
int b;
a = b = 1.5;//赋值表达式的判定结果,和赋值后的左操作数的类型和值相同。
printf("a的值为:%d\n", a);//a的值为0
printf("b的值为:%d", b);//b的值为1
return 0;
}
练习5-7
读取数组中的数据个数和元素值并显示。显示时,各值之间用逗号和空格分隔,并用大括号{}将所有值括起来。
#include<stdio.h>
#define NUMBER 80
int main(void)
{
int x[NUMBER];
int i;
int num;
printf("数据个数:");
scanf_s("%d", &num);
for (i = 0;i < num;i++) {
printf("%d号:", i + 1);
scanf_s("%d", &x[i]);
}
printf("{");
for (i = 0; i < num - 1; i++)
{
printf("%d, ", x[i]);
}
printf("%d", x[num-1]);
printf("}");
return 0;
}
练习5-8
输入学生的分布,并从小到大显示出分数的分布情况。
#include<stdio.h>
#define NUMBER 80
int main(void)
{
int i, j;
int num;
int tensu[NUMBER];
int bunpu[11] = { 0 };
printf("请输入学生的人数:");
do {
scanf_s("%d", &num);
if (num<1 || num>NUMBER)
printf("\a请重新输入1~%d的数:", NUMBER);
} while (num<1 || num>NUMBER);
printf("请输入%d人的分数。\n", num);
for (i = 0;i < num;i++) {
printf("%2d号:", i + 1);
do {
scanf_s("%d", &tensu[i]);
if (tensu[i] < 0 || tensu[i]>100)
printf("请输入1~100的数:");
} while (tensu[i] < 0 || tensu[i]>100);
bunpu[tensu[i] / 10]++;
}
puts("\n----分布图----");
for (i = 0;i <= 9;i++) {
printf("%3d-%3d:", i * 10, i * 10 + 9);
for (j = 0;j < bunpu[i];j++)
putchar('*');
putchar('\n');
}
printf(" 100:");
for (j = 0;j < bunpu[10];j++)
putchar('*');
putchar('\n');
return 0;
}
练习5-9
输入学生的分布,并用纵向分布图从小到大显示出分数的分布情况。(做法是参考网上的,已注释。)
#include<stdio.h>
#define NUMBER 80
int main(void)
{
int i, j;
int num;
int tensu[NUMBER];
int bunpu[11] = { 0 };
printf("请输入学生的人数:");
do {
scanf_s("%d", &num);
if (num<1 || num>NUMBER)
printf("\a请重新输入1~%d的数:", NUMBER);
} while (num<1 || num>NUMBER);
printf("请输入%d人的分数。\n", num);
for (i = 0;i < num;i++) {
printf("%2d号:", i + 1);
do {
scanf_s("%d", &tensu[i]);
if (tensu[i] < 0 || tensu[i]>100)
printf("请输入1~100的数:");
} while (tensu[i] < 0 || tensu[i]>100);
bunpu[tensu[i] / 10]++;
}
int max;//确定分布图中*的位置
max = bunpu[0];
for (i = 1;i <= 11;i++) {
if (bunpu[i] > max) max = bunpu[i];//找到最多分布的数组bunpu[]
}
for (;max > 0;max--) {//max递减到0
for (j = 0; j < 11; j++)//从max最大时开始遍历数组bunpu,max每递减一次,遍历一次。
{
if (bunpu[j] >= max)//判断数组元素个数是否小于当前max值
printf(" *");
else
printf(" ");//小于当前max时输出空格
}
putchar('\n');
}
putchar('\n');
printf("---------------------------------------------------");
putchar('\n');
for (i = 0; i < 11; i++)
{
printf("%4d", i * 10);
}
putchar('\n');
return 0;
}