前言
在vs2022的编译环境中不能调用scanf函数,只能调用scanf_s函数用于输入
For语句中的间隔用分号“;”例如for(i=1;i<=n;i++)
scanf_s后边对应的数值应该取址符“&”
一.初识C源程序及其数据类型
例1.1 编写一个程序,实现从键盘输入两个整数,计算并输出两者乘积。
#include <stdio.h>
int multiply(int a,int b )
{
return (a * b);
}
int main()
{
int x, y, product;
printf("please input two integers:");
scanf_s(" % d % d", &x, &y);
product = multiply(x , y);
printf("The product is %d\n", product);
return 0;
}
可修改为
#include<stdio.h>
int main()
{
int x, y, product;
printf("please input two integers:");
scanf_s("%d%d", &x, &y);
product = x * y;
printf("The product is %d\n", product);
return 0;
}

例 1.2 日期格式转换
#include<stdio.h>
int main()
{
int year, month, day;
printf("请按标准格式输入一个日期(YYYY-MM-DD):");
scanf_s("%d-%d-%d", &year, &month, &day);
printf("中国日期格式:%d年%d月%d日\n",year,month,day);
printf("美国日期格式:%d/%d/%d\n", month, day, year);
printf("英国日期格式:%d/%d/%d\n", day, month, year);
return 0;
}

例1.3作业等级的输入和输出
#include <stdio.h>
int main()
{
char grade1, grade2;
grade1 = getchar();
getchar();
printf("The first grade is:");
putchar(grade1);
putchar('\n');
printf("The second grade is:");
putchar(grade2);
putchar('\n');
return 0;
}

例1.4计算圆的面积和周长
#include <stdio.h>
int main()
{
const double pi = 3.14159;
double r;
scanf_s("%lf", &r);
printf("area=%.2f\n", pi * r * r);
printf("permeter=%.2f\n", 2 * pi * r);
return 0;
}

二.运算符与表达式
例2.1计算抛物运动的射程
#include <stdio.h>
#include <math.h> 引用数学函数 #include<stdio.h>;
int main()
{
const double pi = 3.14159;
const double g = 9.80;
double v0;
int theta;
double R;
printf("Please input v0 (m/s) and theta (degree):\n");
scanf_s("%lf%d", &v0, &theta);
R = v0 * v0 * sin(2 * theta / 180.0 * pi)/g;
printf("The range is:%.2f (m)\n", R);
return 0;
}

例2.2验证丢番图的规则
#include <stdio.h>
#include <math.h>
int main()
{
int a, b;
int x, y, z;
int t;
printf("please input a and b:");
scanf_s("%d%d", &a, &b);
t = (int)sqrt(2 * a * b);
printf("a=%d,b=%d\n", a, b);
printf("2ab %s a perfect square number\n", t * t == 2 * a * b ? "is" : "is NOT");
x = a + t;
y = b + t;
z = a + b + t;
printf("x=%d,y=%d,z=%d\n", x, y, z);
printf("(%d,%d,%d) %s a solution of the Pythagorean Theorem equation\n", x, y, z, x * x + y * y == z * z ? "is" : "is NOT");
return 0;
}


三.程序流程控制
例3.1 求三角形面积。从键盘输入三角形3条边的边长,求三角形面积并输出至屏幕。
#include <stdio.h>
#include <math.h>
int main()
{
double a, b, c, p, s;
printf("Please input three edges:");
scanf_s("%lf%lf%lf", &a, &b, &c);
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
printf("s=%lf\n", s);
return 0;
}

例3.2 年龄比较。从键盘读入两个人的年龄,比较并输出年长者的年龄。
#include <stdio.h>
int main()
{
int age1, age2;
printf("Enter age of two persons:");
scanf_s("%d%d", &age1, &age2);
if (age1 >= age2)
{
printf("The older age is %d\n:", age1);
}
Else
{
printf("The older age is %d\n:", age2);
}
return 0;
}

例3.3 求三角形面积的改善
#include <stdio.h>
#include <math.h>
int main()
{
float a, b, c, p, s;
printf("Enter three edges of a triangle:");
scanf_s("%f%f%f", &a, &b, &c);
if(a > 0 && b > 0 && c > 0 && a + b > c && a + c > b && b + c > a)
{
p = (a + b + c) / 2;
s = sqrt(p * (p - a) * (p - b) * (p - c));
printf("s=%f", s);
}
else
{
printf("error input!\n");
}
return 0;
}

例3.4 直角三角形的判别
#include <stdio.h>
#include <math.h>
int main()
{
float a, b, c;
printf("Enter three edges of triangle:");
scanf_s("%f%f%f", &a, &b, &c);
if (a <= 0 || b <= 0 || c <= 0)
{
printf("error input!\n");
}
else
{
if (a + b > c && a + c > b && b + c > a)
{
if (fabs(a * a + b * b - c * c) < 1E-2 || fabs(a * a + c * c - b * b) < 1E-2 || fabs(b * b + c * c - a * a) < 1E-2)
{
printf("%f,%f,%f is a right triangle\n",a,b,c);
}
else
{
printf("%f,%f,%f is a ordinary triangle\n",a,b,c);
}
}
else
{
printf("%f,%f,%f is not a triangle\n",a,b,c);
}
}
return 0;
}
 
例3.5 月份天数计算。从键盘输入年份和月份,计算该月份的天数并输出。
#include <stdio.h>
int main()
{
int year, month, daysum;
printf("Enter the year and the month:");
scanf_s("%d%d", &year, &month);
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
daysum = 31;
break;
case 4:
case 6:
case 9:
case 11:
daysum = 30;
break;
case 2:
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
{
daysum = 29;
}
else
{
daysum = 28;
}
}
printf("%d.%d has %d days\n", year, month, daysum);
return 0;
}

例3.6 求累加和。从键盘读入int型正整数n,计算累加和的值并输出。
#include <stdio.h>
int main()
{
int n, i, sum;
printf("Enter a positive integer:");
scanf_s("%d", &n);
i = 1;
sum = 0;
while (i <= n)
{
sum += i;
i++;
}
printf("累加和%d=%d", n, sum);
return 0;
}
例3.7 求阶乘。从键盘读入正整数n,计算n!并输出。
#include <stdio.h>
int main()
{
int n, i;
double fac;
printf("Enter a positive integer:");
scanf_s("%d", &n);
i= 1;
fac = 1;
Do
{
fac *= i;
i++;
} while (i <= n);
printf("%d!=%lf", n, fac);
return 0;
}

例3.8 数列求和已知一个数列如下,求该数列前1000项的和,并输出。
#include <stdio.h>
int main()
{
int sign, i;
double item, sum;
sum=0;
sign = 1;
for (i = 1; i <= 1000; i++)
{
item = sign / (2.0*i - 1);
sum += item;
sign = -sign;
}
printf("sum=%lf", sum);
}

例3.9 break与continue的使用比较。
#include <stdio.h>
int main()
{
int i, n;
for (i = 1; i <= 5; i++)
{
printf("Enter n:");
scanf_s("%d", &n);
if (n < 0)
break;
printf("n=%d\n", n);
}
printf("The end!\n");
return 0;
}
 代码二 continue的用法
例3.10 加法表打印。要求打印如下
#include <stdio.h>
int main()
{
int i, j;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d+%d=%2d ", i, j, i + j);
}
printf("\n");
}
return 0;
}

例3.11 梯形打印。要求打印如下所示的等腰梯形

#include <stdio.h>
int main()
{
int i, j;
for (i = 1; i <= 4; i++)
{
for (j = 1; j <= 4 - i; j++)
{
printf(" ");
}
for (j = 1; j <= 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}

例3.12 质数(素数)判断。从键盘输入一个正整数n,判断n是否为质数。
#include <stdio.h>
#include <math.h>
int main()
{
int n, i, k;
do
{
printf("Enter a positive integer:");
scanf_s("%d", &n);
} while (n <= 0);
if (n == 1)
{
printf("%d is not a prime\n", n);
}
else
{
k = (int)sqrt(n);
for (i = 2; i <= k; i++)
{
if (n % i == 0)
{
break;
}
}
if (i > k)
{
printf("%d is a prime", n);
}
else
{
printf(" % d is not a prime", n);
}
}
return 0;
}
  
例3.13 穷举法:百钱百鸡问题。公鸡5钱1只,母鸡3钱1只,小鸡1钱3只。100钱买100只鸡。
问公鸡、母鸡、小鸡各几只?
#include <stdio.h>
int main()
{
int a, b, c;
for (a = 0; a <= 20; a++)
{
for (b = 0; b <= 33; b++)
{
c = 100 - a - b;
if (15 * a + 9 * b + c == 300)
{
printf("%d,%d,%d\n", a, b, c);
}
}
}return 0;
}

四.函数的基本知识
例4.1定义函数totalCost,计算购买商品的总金额,其中买多个商品有一定的折扣。
#include <stdio.h>
double totalCost (int n, double p);
int main()
{
double price, bill;
int number;
printf("Enter the number of items purchased:");
scanf_s("%d", &number);
printf("Enter the price per item (RMB):");
scanf_s("%lf", &price);
bill = totalCost(number, price);
printf("The totalCost of the items purchased is:%.lf RMB.\n", bill);
return 0;
}
double totalCost(int n, double p)
{
const double DISCOUNT = 0.2;
double total;
if (n > 1)
total = n * p * (1 - DISCOUNT);
else
total = n * p;
return total;
}

例4.2 judgeprime函数定义的代码
int judgeprime(int n)
{
int i, k;
int judge = 1;
if (n == 1)
judge = 0;
k = (int)sqrt(n);
for (i = 2; judge && i <= k; i++)
if (n % i == 0)
judge = 0;
return judge;
}
例4.3 定义函数drawline,用于画一条由n个减号组成的横线。
void drawline()
{
const int n = 30;
int i;
for (i = 1; i <= n; i++)
printf("-");
printf("\n");
return;
}
例4.4从键盘上读入一个整数m,如果m<=0,则给出相应的提示信息:如果m>0,则调用judge prime函数判断它是不是质数。
#include <stdio.h>
#include <math.h>
int judgeprime(int n);
int judgeprime(int n)
{
int i, k;
int judge = 1;
if (n == 1)
judge = 0;
k = (int)sqrt(n);
for (i = 2; judge && i <= k; i++)
if (n % i == 0)
judge = 0;
return judge;
}
int main()
{
int m, prime;
scanf_s("%d", &m);
if (m <= 0)
{
printf("error input!\n");
return 0;
}
prime = judgeprime(m);
if (prime)
printf("%d is a prime!\n", m);
else
printf("%d is not a prime!\n", m);
return 0;
}

例4.5调用drawline函数实现划线功能。
#include <stdio.h>
void drawline();
void drawline()
{
const int n = 30;
int i;
for (i = 1; i <= n; i++)
printf("-");
printf("\n");
return;
}
int main()
{
drawline();
printf("C is a beautiful language!\n");
drawline();
return 0;
}

例4.6 定义一个递归函数计算n!。主函数中读入任一非负整数,然后调用该函数。
#include <stdio.h>
double Fact(int n);
int main()
{
int n;
double t;
printf("Plese input n:\n");
scanf_s("%d", &n);
if (n < 0)
n = -n;
t = Fact(n);
printf("%d!=%lf", n, t);
return 0;
}
double Fact(int n)
{
if (!n)
return 1.0;
return n * Fact(n - 1);
}
修改后
#include <stdio.h>
double Fact(int n);
int main()
{
int n;
double t;
printf("Plese input n:\n");
scanf_s("%d", &n);
if (n < 0)
n = -n;
t = Fact(n);
printf("%d!=%lf", n, t);
return 0;
}
double Fact(int n)
{
if (n==0)
{
return 1.0;
}
else
{
return n * Fact(n - 1);
}
}
例4.7 数制转换问题,将一个十进制整数转化成指定的的B(2<=B<=16)进制数。
#include <stdio.h>
void multibase(int n, int B);
void multibase(int n, int B)
{
int m;
if (n)
{
multibase(n / B, B);
m = n % B;
if (m < 10)
printf("%d", m);
else
printf("%c", m + 55);
}
}
int main()
{
int n, B;
do
{
scanf_s("%d%d", &n, &B);
} while (n <= 0 || B <= 1 || B >16);
printf("change result:\n");
multibase(n, B);
printf("\n");
return 0;
}
例4.8找出2—100所有的质数,并统计个数
#include <stdio.h>
#include <math.h>
int count;
int judgeprime(int n);
int main()
{
int i;
printf("The primes between 2 to 100:\n");
for(i=2;i<100;i++)
if (judgeprime(i))
{
printf("%d ", i);
count++;
}
printf("The total number of primes:%d\n", count);
return 0;
int judgeprime(int n)
{
}
int i;
int judge = 1;
if (n == 1)
judge = 0;
{
int k = (int)sqrt(n);
for (i = 2; judge && i <= k; i++)
if (n % i == 0)
judge = 0;
}
return judge;
}

例4.9利用静态局部变量求解1到5的阶乘。
#include <stdio.h>
int fun(int n);
int fun(int n)
{
static int f = 1;
f = f * n;
return f;
}
int main()
{
int i;
for (i = 1; i <= 5; i++)
{
printf("%d!=%d ", i, fun(i));
}return 0;
}

例4.10求给定半径的圆形面积、给定半径的球形体积以及给定半径和高的圆柱体积。(有修改)
#include <stdio.h>
#include <math.h>
#define pi 3.14159
double getarea(double r);
double getvolumes(double r);
double getvolumec(double r, double h);
int main()
{
double r, h, s, v1, v2;
printf("请输入所需半径 :");
scanf_s("%lf", &r);
printf("请输入所需高:");
scanf_s("%lf", &h);
s = getarea(r);
v1 = getvolumes(r);
v2 = getvolumec(r, h);
printf("s=%lf\n", s);
printf("v1=%lf\n", v1);
printf("v2=%lf\n", v2);
return 0;
}
double getarea(double r)
{
return (pi * pow(r, 2));
}
double getvolumes(double r)
{
return (pi * pow(r, 3) * 3 / 4);
}
double getvolumec(double r, double h
{
return (pi * h * pow(r, 2));
}

数组
例子 5.1 使用一维数组存放不多于50个学生的成绩,并计算平均值。
#include <stdio.h>
int main()
{
float score[50] = { 0 };
int num;
float sum = 0, average;
int i;
do
{
printf("Input the number of students:");
scanf_s("%d", &num);
} while (num <= 0 || num > 50);
printf("Input the score :");
for (i = 0; i < num; i++)
{
scanf_s("%f", &score[i]);
sum += score[i];
}
average = sum / num;
printf("The average is :%5.2f\n", average);
return 0;
}
 例5.2 Fibonacci数列。有一对小兔子(一公一母),第2个月长大成大兔子,长到第3个月开始每个月就生一对小兔子(一公一母)。等这对兔子长到第3个月又开始生小兔子。假设所有的兔子都不会死,求出n个月后兔子的数目。
时间 | 小兔子 | 大兔子 | 兔子总数 |
---|
1 | 1 | 0 | 1 | 2 | 0 | 1 | 1 | 3 | 1 | 1 | 2 | 4 | 1 | 2 | 3 | 5 | 2 | 3 | 5 | … | … | … | … | 8 | 8 | 13 | 21 | … | … | … | … |
|