代码练习记录,代码可能存在未发现的逻辑错误
#include
int main (){
printf("************************\n");
printf("* *\n");
printf("* Hello World! *\n");
printf("* *\n");
printf("************************\n");
return 0;
}
#include
int main(){
int a,b,c,max;
printf("please input a,b,c:\n");
scanf("%d,%d,%d",&a,&b,&c); //输入的3个数以逗号分隔,如果以空格分隔会出错
//scanf("%d%d%d",&a,&b,&c); //可以使用空格分隔
max=a;
if(max<b)
max=b;
if(max<c)
max=c;
printf("The largest number is %d\n",max);
return 0;
}
#include
int main() {
int a, b, sum;
printf("please input two number:\n");
scanf("%d%d", &a, &b);
sum = a + b;
printf("The sum is: %d\n", sum);
return 0;
}
#include
int main() {
int a, b, max, min;
printf("please input two number:\n");
scanf("%d%d", &a, &b);
if (a > b) {
max = a;
min = b;
printf("max=%d,min=%d\n", max, min);
} else if (a < b) {
max = b;
min = a;
printf("max=%d,min=%d\n", max, min);
} else if (a = b) {
printf("Two number are equal!\n");
}
return 0;
}
#include
//主函数
int main() //定义主函数
{ //主函数体开始
int max(int x, int y); //对被调用函数max的声明
int a, b, c; //定义变量a,b,c
printf("please input two number:"); //打印输出,提示用户输入两个数字
scanf("%d%d", &a, &b); //输入变量a和b的值
c = max(a, b); //调用max函数,将得到的值赋给c
printf("max=%d\n", c); //输出c的值
return 0; //返回函数值为0
} //主函数体结束
//求两个整数中的较大者的max函数
int max(int x, int y) { //定义mmax函数,函数值为整型,形式参数x和y为整型
int z; // max函数中的声明部分,定义本函数中用到的变量z为整型
if (x > y) z = x; //若x>y成立,将x的值赋给变量z
else z = y; //否则(即x>y不成立),将y的值赋给变量z
return (z); //将z的值作为max的函数值,返回到调用max函数的位置
}
#include
int main() {
int a, b, c, max;
printf("please input a,b,c:");
scanf("%d,%d,%d", &a, &b, &c);
a > b ? (a > c ? (max = a) : (max = c))
: (b > c ? (max = b) : (max = c));
printf("The largest number is %d\n", max);
return 0;
}
#include
int main() {
int t = 1, n;
printf("please input n:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
t = t * i;
}
printf("The multiplicative of n is :%d", t);
return 0;
}
#include
int main() {
int i = 2, t = 1;
while (i <= 5) {
t = t * i;
i = i + 1;
}
printf("%d\n", t);
return 0;
}
#include
int main() {
int a[10] = {91, 82, 73, 54, 95, 66, 77, 48, 99, 76},
b[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("Student number and grades of students with scores over 80:\n");
for (int i = 1; i <= 10; i++) {
if (a[i] >= 80) printf("%d,%d\n", b[i], a[i]);
}
return 0;
}
#include
int main() {
int n;
printf("Please enter a year from 2000 to 2500:");
scanf("%d", &n);
if (n >= 2000 && n <= 2500) {
if (n % 4 == 0) {
if (n % 100 == 0) {
if (n % 400 == 0) {
printf("%d is a leap year.", n);
} else
printf("%d is not a leap year.", n);
} else {
printf("%d is a leap year.", n);
}
} else {
printf("%d is not a leap year.", n);
}
} else {
printf("Input error, please re-enter a year from 2000 to 2500:");
}
return 0;
}
#include
int main() {
int i=0; //定义变量i来计算2000-2500年闰年的数量
printf("The leap years in 2000-2500 are:");
for(int n = 2000; n <= 2500; n++ ) {
if (n % 4 == 0) {
if (n % 100 == 0) {
if (n % 400 == 0) {
printf("'%d'", n);
++i;
}
} else {
printf("'%d'", n);
++i;
}
}
}
printf("\nThere are %d leap years in 2000-2500.",i);
return 0;
}
#include
int main() {
int year;
printf("Enter year:");
scanf("%d", &year);
if(year > 2000 && year <2500)
(year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? printf("yes") : printf("no");
else printf("error");
return 0;
}
#include
int main() {
int year, leap;
printf("enter year:");
scanf("%d", &year);
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0)
leap = 1;
else
leap = 0;
} else
leap = 1;
} else
leap = 0;
if (leap)
printf("%d is ", year);
else
printf("%d is not ", year);
printf("a leap year.\n");
return 0;
}
求: 1 − 1 2 + 1 3 − 1 4 + 1 5 − 1 6 + ⋯ + 1 97 − 1 98 + 1 99 − 1 100 \displaystyle {1 - \frac{1}{2} + \frac{1}{3} - \frac{1}{4} + \frac{1}{5} - \frac{1}{6} +\cdots +\frac{1}{97} - \frac{1}{98} + \frac{1}{99} - \frac{1}{100}} 1−21+31−41+51−61+⋯+971−981+991−1001的值。
#include
int main() {
int sign = 1;
double deno = 2.0, sum = 1.0, term; //定义deno,sum,term为双精度型变量
while (deno <= 100) {
sign = -sign;
term = sign / deno;
sum = sum + term;
deno = deno + 1;
}
printf("%f\n", sum);
return 0;
}
#include
int main() {
float f, c; //定义华氏度f和摄氏度c为单精度浮点型变量
printf("f=");
scanf("%f", &f);
c = (5.0 / 9) * (f - 32); //两变量转换公式为c=(5/9)*(f-32)
printf("f=%f\nc=%f", f, c);
return 0;
}
#include
int main() {
int sizeof_int, sizeof_short, sizeof_long, sizeof_long_long_int,
sizeof_char, sizeof_float, sizeof_double;
sizeof_int = sizeof(int);
sizeof_short = sizeof(short);
sizeof_long = sizeof(long);
sizeof_long_long_int = sizeof(long long int);
sizeof_char = sizeof(char);
sizeof_float = sizeof(float);
sizeof_double = sizeof(double);
printf(
"int=%d\nshort int=%d\nlong int=%d\nlong long int=%d\n"
"char=%d\nfloat=%d\ndouble=%d\n",
sizeof_int, sizeof_short, sizeof_long, sizeof_long_long_int,
sizeof_char, sizeof_float, sizeof_double);
return 0;
}
#include
int main() {
unsigned int a; //定义a为无符号整型变量
a=2147483648; //指定用无符号十进制数的格式输出
printf("%u",a);
}
#include
int main() {
unsigned char a = 128; //无符号取值范围为0~255
signed char b = 128; //有符号取值范围为-128~127,b=228时溢出
printf("%c = %d\n", a, a);
printf("%c = %d\n", b, b);
}
#include
int main() {
char letter, big, small;
printf("Enter a letter:");
scanf("%c", &letter);
if (letter > 64 && letter < 91) { //大写字母ASCII码范围65~90
big = letter;
small = big + 32;
} else if (letter > 96 && letter < 123) { //小写字母ASCII码范围97~122
small = letter;
big = small - 32;
} else {
printf("Input error");
}
printf("big=%c\nsmall=%c", big, small);
return 0;
}
#include
int main() {
char ch;
printf("Enter a letter:");
scanf("%c", &ch);
if (ch > 'A' && ch < 'Z' || ch > 'a' && ch < 'z') {
ch = (ch > 'A' && ch < 'Z') ? (ch + 32) : ch;
printf("%c", ch);
} else
printf("error");
return 0;
}
已知三角形面积公式: a r e a = s ( s − a ) ( s − b ) ( s − c ) area=\sqrt{s(s-a)(s-b)(s-c)} area=s(s−a)(s−b)(s−c)
其中, s = a + b + c 2 s=\frac{a+b+c}{2} s=2a+b+c,a,b,c为三角形的边长。
#include //调用数学函数库,后面计算用sqrt函数开根号
#include
int main() {
double a, b, c, s, area;
printf("Enter the triangle side length a,b,c:");
scanf("%lf%lf%lf", &a, &b, &c);
if (a + b > c && a + c > b && b + c > b) {
s = (a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c));
printf("a=%f\tb=%f\tc=%f\narea=%f\n", a, b, c, area);
} else {
printf("error");
}
return 0;
}
已知,当 b 2 − 4 a c ≥ 0 b^2-4ac≥0 b2−4ac≥0时,一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0有根。
实数根: x 1 = − b + b 2 − 4 a c 2 a , x 2 = − b − b 2 − 4 a c 2 a x_1=\frac{-b+\sqrt{b^2-4ac}}{2a},x_2=\frac{-b-\sqrt{b^2-4ac}}{2a} x1=2a−b+b2−4ac,x2=2a−b−b2−4ac
令 p = − b 2 a , q = b 2 − 4 a c 2 a p=\frac{-b}{2a},q=\frac{\sqrt{b^2-4ac}}{2a} p=2a−b,q=2ab2−4ac,则 x 1 = p + q , x 2 = p − q x_1=p+q,x_2=p-q x1=p+q,x2=p−q.
#include //调用数学函数库,后面计算用sqrt函数开根号
#include
int main() {
double a, b, c, disc, x1, x2, p, q;
printf("Please enter a, b, c:");
scanf("%lf%lf%lf", &a, &b, &c);
disc = b * b - 4 * a * c;
if (disc >= 0) {
p = -b / (2.0 * a);
q = sqrt(disc) / (2.0 * a);
x1 = p + q;
x2 = p - q;
printf("x1=%7.2f\nx2=%7.2f", x1, x2); //%7.2f指定输出数据占7列,其中小数部分占2列
} else {
printf("The equation has no real root."); //当disc<0时,方程无实根
}
return 0;
}
#include
#include
int main() {
double a, b, c, disc, x1, x2, realpart, imagpart;
printf("Enter a,b,c:");
scanf("%lf%lf%lf", &a, &b, &c);
printf("The equation");
if (fabs(a) <= 1e-6) //验证|a|是否等于0,确认方程是否为一元二次方程
printf("is not a quadratic\n");
else {
disc = b * b - 4 * a * c;
if (fabs(disc) <= 1e-6)
printf("has two equal roots:%8.4f\n", -b / (2 * a));
else if (disc > 1e-6) {
x1 = (-b + sqrt(disc)) / (2 * a);
x1 = (-b - sqrt(disc)) / (2 * a);
printf("has distinct real roots:%8.4f and %8.4f", x1, x2);
} else {
realpart = -b / (2 * a); //realpart是复根的实部
imagpart = sqrt(-disc) / (2 * a); //imagpart是复根的虚部
printf("has complex roots:\n");
printf("%8.4f+%8.4fi\n", realpart, imagpart);
printf("%8.4f-%8.4fi\n", realpart, imagpart);
}
}
return 0;
}
#include
int main() {
int a, b, c, t;
printf("Enter three number:");
scanf("%d%d%d", &a, &b, &c);
if (a > b) {
t = a;
a = b;
b = t;
}
if (a > c) {
t = a;
a = c;
c = t;
}
if (b > c) {
t = b;
b = c;
c = t;
}
printf("%d<%d<%d", a, b, c);
return 0;
}
y = { − 1 (x<0) 0 (x=0) 1 (x>0) y=\begin{cases}-1& \text{(x<0)}\\0 & \text{(x=0)}\\1& \text{(x>0)}\end{cases} y=⎩⎪⎨⎪⎧−101(x<0)(x=0)(x>0)输入一个x值,输出相应y值。
#include
int main() {
float x;
int y;
printf("Enter x:");
scanf("%f", &x);
if (x < 0) {
y = -1;
} else if (x == 0) {
y = 0;
} else {
y = 1;
}
printf("y=%d", y);
return 0;
}
#include
int main() {
float x;
int y;
printf("Enter x:");
scanf("%f", &x);
y = (x < 0) ? -1 : ((x == 0) ? 0 : 1);
printf("y=%d", y);
return 0;
}
#include
int main() {
char grade;
scanf("%c",&grade); //输入等级
printf("Your score:");
switch(grade){
case'A':printf("85~100\n");break;
case'B':printf("70~84\n");break;
case'C':printf("60~69\n");break;
case'D':printf("<60\n");break;
default:printf("enter data error!\n");
}
return 0;
}
#include
int main() {
void action1(int, int), action2(int, int); //函数声明
char ch;
int a = 15, b = 23;
ch = getchar();
switch (ch) {
case 'a':
case 'A':action1(a, b);break; //调用action1函数。执行A操作
case 'b':
case 'B':action2(a, b);break; //调用action2函数。执行B操作
default:putchar('\a');
}
return 0;
}
void action1(int x,int y){ //执行加法的函数
printf("x+y=%d\n", x + y );
}
void action2(int x,int y){ //执行乘法的函数
printf("x*y=%d\n", x * y );
}
路程 | 折扣 |
---|---|
s < 250 | 没有折扣 |
250 ≤ s < 500 | 2%折扣 |
500 ≤ s < 1000 | 5%折扣 |
1000 ≤ s < 2000 | 8%折扣 |
2000 ≤ s < 3000 | 10%折扣 |
3000 ≤ s | 15%折扣 |
设每吨每千米货物的基本运费为p(price的缩写),货物重为w(weight的缩写),距离为s(代表distance),折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为 | |
f = p w s ( 1 − d ) f=pws(1-d) f=pws(1−d) |
#include
int main() {
int c, s;
float p, w, d, f;
printf("please enter price,weight,distance:"); //提示输入的数据
scanf("%f%f%d", &p, &w, &s); //输入单价、重量、距离
if (s >= 3000)
c = 12;
else
c = s / 250;
switch (c) {
case 0:d = 0;break; //break终止循环
case 1:d = 2;break;
case 2:
case 3:d = 5;break;
case 4:
case 5:
case 6:
case 7:d = 8;break;
case 8:
case 9:
case 10:
case 11:d = 10;break;
case 12:d = 15;break;
}
f = p * w * s * (1 - d / 100);
printf("freight=%10.2f\n", f);
return 0;
}
while (表达式) 语句
#include
int main() {
int a = 1, sum = 0;
while (a < 101) {
sum = sum + a;
a++;
}
printf("1+2+3+...+100=%d", sum);
}
do
语句
while (表达式);
#include
int main() {
int a = 1, sum = 0;
do {
sum = sum + a;
a++;
} while (a < 101);
printf("1+2+3+...+100=%d", sum);
}
在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。
amount捐款数,total总捐款数,aver人均捐款数
#include
#define SUM 100000 //指定符号常量SUM代表100000
int main() {
float amount, aver, total;
int i;
for (i = 1, total = 0; i <= 1000; i++) {
printf("please enter amount:");
scanf("%f", &amount);
total = total + amount;
if (total >= SUM) break;
}
aver = total / i;
printf("num=%d\naver=%10.2f\n", i, aver);
return 0;
}
#include
int main() {
int n;
for (n = 100; n <= 200; n++) {
if (n % 3 == 0) continue; //continue结束本次循环
printf("%d\t", n);
}
printf("\n");
return 0;
}
#include
int main() {
int n;
for (n = 100; n <= 200; n++) {
if (n % 3 == 0)
; //空语句
else
printf("%d\t", n);
}
printf("\n");
return 0;
}
1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 \begin{matrix} 1 & 2 & 3 & 4 & 5\\ 2 & 4 & 6 & 8 & 10\\ 3 & 6 & 9 & 12 & 15\\ 4 & 8 &12 & 16 & 20 \end{matrix} 12342468369124812165101520
#include
int main() {
int i, j, n = 0;
for (i = 1; i <= 4; i++) {
for (j = 1; j <= 5; j++, n++) { // n用来累计输出数据的个数
if (n % 5 == 0) printf("\n"); //控制在输出5个数据后换行
printf("%d\t", i * j);
}
}
printf("\n");
return 0;
}
#include //从程序中用到数学函数fabs,应包含头文件math.h
#include
int main() {
int sign = 1; // sign用来表示数值的符号
double pi = 0.0, n = 1.0, term = 1.0; // pi开始代表多项式的值,最后代表π的值,n代表分母,term代表当前项的值
while (fabs(term) >= 1e-6) {
pi = pi + term; //把当前项term累加到pi中
n = n + 2; // n+2是下一项的分母
sign = -sign; // sign代表符号,下一项的符号与上一项符号相反
term = sign / n; //求出下一项的值term
}
pi = pi * 4; //多项式的和pi乘以4,才是π的近似值
printf("pi=%10.8f\n", pi); //输出π的近似值,前5位小数是准确的
return 0;
}
这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,···,用数学方式表示为
{ F 1 = 1 (n=1) F 2 = 1 (n=2) F n = F n − 1 + F n − 2 (n≥3) \begin{cases} F_1=1& \text{(n=1)}\\ F_2=1 & \text{(n=2)}\\ F_n=F_{n-1}+F_{n-2}& \text{(n≥3)} \end{cases} ⎩⎪⎨⎪⎧F1=1F2=1Fn=Fn−1+Fn−2(n=1)(n=2)(n≥3)
#include
int main() {
int f1 = 1, f2 = 1, f3;
printf("%12d\t%12d\t", f1, f2);
for (int n = 1; n <= 38; n++) {
f3 = f1 + f2;
printf("%12d\t", f3);
if (n % 8 == 0) printf("\n");
f1 = f2;
f2 = f3;
}
return 0;
}
优化
#include
int main() {
int f1 = 1, f2 = 1;
for (int n = 1; n <= 20; n++) { //每个循环中输出2个数据,故循环20次即可
printf("%12d\t%12d\t", f1, f2); //输出已知的两个数
if (n % 4 == 0) printf("\n");
f1 = f1 + f2; //计算出下一个数,并存在f1中
f2 = f2 + f1; //计算出下下一个数,并存在f2中
}
return 0;
}
数组
#include
int main() {
int a[40] = {1, 1}, i;
for (i = 2; i < 40; i++) a[i] = a[i - 1] + a[i - 2];
for (i = 0; i < 40; i++) {
printf("%10d", a[i]);
if ((i + 1) % 10 == 0) printf("\n");
}
return 0;
}
#include
int main() {
int n, i;
printf("please enter a integer number,n=?");
scanf("%d", &n);
for (i = 2; i < n; i++) {
if (n % i == 0) break;
}
if (i < n)
printf("%d is not a prime number.\n", n);
else
printf("%d is a prime number.\n", n);
return 0;
}
#include
#include
int main() {
int n, i, k;
printf("please enter a integer number,n=?");
scanf("%d", &n);
/*方法一:
k = sqrt(n);
for (i = 2; i <= k; i++)
if (n % i == 0) break;
if (i <= k)
printf("1.%d is not a prime number.\n", n);
else
printf("1.%d is a prime number.\n", n);*/
/*方法二:
int t;
for (t = 1, i = 2; i < n; i++)
if (n % i == 0) t = 0;
if (t) printf("2.%d is prime.\n", n);*/
/*方法三:
for (t = 1, i = 2; i < n; i++)
if (n % i == 0) {
t = 0;
break;
}
if (t) printf("3.%d is prime.\n", n);*/
/*方法四
for (i = 2; i < n; i++)
if (n % i == 0) break;
if (i == n) printf("4.%d is prime.\n", n);*/
/*方法五
for (i = 2; i <= (int)sqrt(n); i++)
if (n % i == 0) break;
if (i > (int)sqrt(n)) printf("5.%d is prime.\n", n);*/
return 0;
}
#include
#include
int main() {
int n, i, k;
for (n = 100; n <= 200; n++) {
/*方法一:*/
k = sqrt(n);
for (i = 2; i <= k; i++)
if (n % i == 0) break;
if (i <= k)
;
else
printf("%d\t", n);
/*方法二:*/
int t;
for (t = 1, i = 2; i < n; i++)
if (n % i == 0) t = 0;
if (t) printf("%d\t", n);
/*方法三:*/
for (t = 1, i = 2; i < n; i++)
if (n % i == 0) {
t = 0;
break;
}
if (t) printf("%d\t", n);
/*方法四*/
for (i = 2; i < n; i++)
if (n % i == 0) break;
if (i == n) printf("%d\t", n);
/*方法五*/
for (i = 2; i <= (int)sqrt(n); i++)
if (n % i == 0) break;
if (i > (int)sqrt(n)) printf("%d\t", n);
}
return 0;
}
#include
#include
int main() {
int n, k, i, m = 0;
for (n = 101; n <= 200; n = n + 2) {
k = sqrt(n);
for (i = 2; i <= k; i++)
if (n % i == 0) break;
if (i >= k + 1) {
printf("%d ",n);
m = m + 1;
}
if (m % 10 == 0) printf("\n");
}
return 0;
}
#include
int main() {
char c;
c = getchar(); //输入一个字符给字符变量c
while (c != '\n') { //检查c的值是否为换行符'\n'
if ('A' <= c && c <= 'Z' || 'a' <= c && c <= 'z') { //c如果是字母
if ('W' <= c && c <= 'Z' || 'w' <= c && c <= 'z')
c = c - 22; //如果是26个字母中最后4个字母之一就是c-22
else
c = c + 4; //如果是前面22个字母之一,就使c加4,即变成其后第4个字母
}
printf("%c", c); //或putchar(c);输出已改变的字符
c = getchar(); //再输入下一个字符给字符变量c
}
return 0;
}
#include
int main() {
char c;
while ((c = getchar()) != '\n') { //输入一个字符给字符变量c并检查其值是否是换行符
if ('A' <= c && c <= 'Z' || 'a' <= c && c <= 'z') { // c如果是字母
c = c + 4; //只要c是字母,都先加4
if ('W' <= c && c <= 'Z' || 'w' <= c && c <= 'z') //如果是26个字母中最后4个字母之一
c = c - 26; // c的值改变为26个字母中最前面的4个字母中对应的字母
}
putchar(c); //输出已改变的字符
// printf("%c", c);
}
return 0;
}
例如:2+22+222+2222+22222(此时n=5)
#include
int main() {
int a, n, sn = 0, tn = 0;
printf("Enter a,n:");
scanf("%d,%d", &a, &n);
for (int i = 1; i <= n; i++) {
tn = tn + a;
sn = sn + tn;
a = a * 10;
}
printf("s=%d", sn);
return 0;
}
#include
int main() {
int a[10], i;
for (int i = 0; i <= 9; i++) a[i] = i;
for (int i = 9; i >= 0; i--) printf("%d ", a[j]);
return 0;
}
起泡法
#include
int main() {
int a[10], i, t, j;
printf("input 10 numbers:\n");
for (i = 0; i <= 9; i++) scanf("%d", &a[i]);
for (i = 0; i <= 9; i++) {
for (j = 0; j < 9 - i; j++) {
if (a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
printf("the sorted numbers:\n");
for (i = 0; i <= 9; i++) printf("%d ", a[i]);
return 0;
}
选择法
#include
int main() {
int a[10], i, t, j;
printf("input 10 numbers:\n");
for (i = 0; i <= 9; i++) scanf("%d", &a[i]);
for (i = 0; i < 9; i++) {
for (j = i + 1; j <= 9; j++) {
if (a[i] > a[j]) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
printf("the sorted numbers:\n");
for (i = 0; i <= 9; i++) printf("%d ", a[i]);
return 0;
}
a = [ 1 2 3 4 5 6 ] a=\left[ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{matrix} \right] a=[142536] , b = [ 1 2 3 4 5 6 ] b=\left[ \begin{matrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{matrix} \right] b=⎣⎡135246⎦⎤
#include
int main() {
int a[2][3] = {1, 2, 3, 4, 5, 6};
int b[3][2], i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) b[i][j] = a[j][i];
}
printf("a:\n");
for (j = 0; j < 2; j++) {
for (i = 0; i < 3; i++) {
printf("%5d", a[j][i]);
if ((i + 1) % 3 == 0) printf("\n");
}
}
printf("b:\n");
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
printf("%5d", b[i][j]);
if ((j + 1) % 2 == 0) printf("\n");
}
}
return 0;
}
[ 1 2 3 4 9 8 7 6 − 10 10 − 5 2 ] \left[ \begin{matrix} 1 & 2 & 3 & 4\\ 9 & 8 & 7 & 6\\ -10 & 10 & -5 & 2\end{matrix} \right] ⎣⎡19−10281037−5462⎦⎤
#include
int main() {
int i, j, row = 0, colum = 0, max;
int a[3][4] = {{1, 2, 3, 4}, {8, 7, 6, 5}, {-10, 10, -5, 2}};
max = a[0][0];
for (i = 0; i <= 2; i++)
for (j = 0; j <= 3; j++)
if (a[i][j] > max) {
max = a[i][j];
row = i;
colum = j;x
}
printf("max=%d\nrow=%d\ncolum=%d", max, row, colum);
return 0;
}
#include
int main() {
char c[15] = {'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
int i;
for(i = 0; i < 15; i++) printf("%c", c[i]);
return 0;
}
#include
int main() {
char diamond[][5] = {{' ', ' ', '*'},
{' ', '*', ' ', '*'},
{'*', ' ', ' ', ' ', '*'},
{' ', '*', ' ', '*'},
{' ', ' ', '*'}};
int i, j;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) printf("%c", diamond[i][j]);
printf("\n");
}
return 0;
}
#include
int main() {
char string[81];
int i, num = 0, word = 0;
char c;
gets(string);
for (i = 0; (c = string[i]) != '\0'; i++) {
if (c == ' ')
word = 0;
else if (word == 0) {
word = 1;
num++;
}
}
printf("%d", num);
return 0;
}
#include
#include
int main() {
char str[3][20];
char string[20];
int i;
for (i = 0; i < 3; i++) gets(str[i]);
if (strcmp(str[0], str[1]) > 0)
strcpy(string, str[0]);
else
strcpy(string, str[1]);
if (strcmp(string, str[2]) < 0) strcpy(string, str[2]);
printf("\nLargest is %s\n", string);
}
******************
How do you do!
******************
#include
int main() {
void print_star();
void print_message();
print_star();
print_message();
print_star();
return 0;
}
void print_star() { printf("******************\n"); }
void print_message() { printf(" How do you do!\n"); }
#include
int main() {
int max(int x, int y);
int a, b, c;
printf("please enter two integer numbers:");
scanf("%d%d", &a, &b);
c = max(a, b);
printf("max is %d", c);
return 0;
}
int max(int x, int y) {
int z;
z = x > y ? x : y;
return (z);
}
#include
int main() {
float add(float x, float y);
float a, b, c;
printf("enter two number:");
scanf("%f%f", &a, &b);
c = add(a, b);
printf("sum is %f", c);
return 0;
}
float add(float x, float y) {
float z;
z = x + y;
return z;
}
#include
int main() {
int a, b, c, d, big;
printf("Enter four number:");
scanf("%d%d%d%d", &a, &b, &c, &d);
int max(int x, int y);
big = max(a, max(b, max(c, d)));
printf("bigest=%d", big);
return 0;
}
int max(int x, int y) {
int z;
z = x > y ? x : y;
return z;
}
多层嵌套
#include
int main() {
int max4(int a, int b, int c, int d); //对max4的函数声明
int a, b, c, d, max;
printf("Please enter 4 interger numbers:");
scanf("%d%d%d%d", &a, &b, &c, &d);
max = max4(a, b, c, d); //调用max4函数,得到4个数中的最大者
printf("max=%d\n", max);
return 0;
}
int max4(int a, int b, int c, int d) { //定义max4函数
int max2(int a, int b); //对max的函数声明
int m;
m = max2(a, b); //调用max2函数,得到a和b两个数中的大者,放在m中
m = max2(m, c); //调用max2函数,得到a,b,c3个数中的大者,放在m中
m = max2(m, d); //调用max2函数,得到a,b,c,d4个数中的大者,放在m中
return m; //把m作为函数值带回main函数
}
int max2(int a, int b) { //定义max2函数
if (a >= b)
return a; //若a≥b,将a作为函数返回值
else
return b; //若a<b,将b作为函数返回值
}
递归
int fib(int n){
if(n>1) return fib(n-1) + fib(n-2);
else return n; // n = 0, 1时给出recursion终止条件
}
迭代
int fib(int n){
int i, temp0, temp1, temp2;
if(n<=1) return n;
temp1 = 0;
temp2 = 1;
for(i = 2; i <= n; i++){
temp0 = temp1 + temp2;
temp2 = temp1;
temp1 = temp0;
}
return temp0;
}
有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁。问第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第5个学生多大。
由上可知:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10
#include
int main() {
int age(int n); //对age函数的声明
printf("NO.5,age:%d\n", age(5)); //输出第5个学生的年龄
return 0;
}
int age(int n) { //定义递归函数
int c;
if (n == 1) //如果n等于1
c = 10; //年龄为10
else //如果年龄不等于1
c = age(n - 1) + 2; //年龄是前一个学生的年龄加2(如第4个学生年龄是第3个学生年龄加2)
return (c); //返回年龄
}
已知:
n ! = { n ! = 1 ( n = 0 , 1 ) n ∗ ( n − 1 ) ! ( n > 1 ) n!=\begin{cases} n!=1&(n=0,1)\\ n*(n-1)! &(n>1) \end{cases} n!={n!=1n∗(n−1)!(n=0,1)(n>1)
#include
int main() {
int fac(int n);
int n;
printf("n=");
scanf("%d", &n);
printf("n!=%d", fac(n));
return 0;
}
int fac(int n) {
int a;
if (n < 0) // n不能小于0
printf("n<0,data error!");
else if (n == 0 || n == 1) // n=0或1时,n!=1
a = 1;
else
a = fac(n - 1) * n; // n>1时,n!=n*(n-1)!
return a;
}
这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A,B,C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程输出移动盘子的步骤。
实现这个算法可以简单分为三个步骤:
(1) 把n-1个盘子由 A 移到 B;
(2) 把第n个盘子由 A 移到 C;
(3) 把n-1个盘子由 B 移到 C;
#include
int main() {
void hanoi(int n, char one, char two, char three);
int m;
printf("input the number of diskes:");
scanf("%d", &m);
printf("The step to move %d diskes:\n", m);
hanoi(m, 'A', 'B', 'C');
return 0;
}
void hanoi(int n, char one, char two, char three) {
void move(char x, char y);
if (n == 1)
move(one, three);
else {
hanoi(n - 1, one, three, two);
move(one, three);
hanoi(n - 1, two, one, three);
}
}
void move(char x, char y) { printf("%c-->%c\n", x, y); }
#include
int main() {
int max(int x, int y);
int a[10], m, n, i;
printf("enter 10 integer numbers:");
for (i = 0; i < 10; i++) scanf("%d", &a[i]);
printf("\n");
for (i = 1, m = a[0], n = 0; i < 10; i++) {
if (max(m, a[i]) > m) {
m = max(m, a[i]);
n = i;
}
}
printf("The largest number is %d\nit is the %dth number.\n", m, n + 1);
return 0;
}
int max(int x, int y) { return (x > y ? x : y); }
#include
int main() {
float average(float array[10]);
float score[10], aver;
int i;
printf("input 10 scores:\n");
for (i = 0; i < 10; i++) scanf("%f", &score[i]);
printf("\n");
aver = average(score);
printf("average score is %5.2f\n", aver);
return 0;
}
float average(float array[10]) {
int i;
float aver, sum = array[0];
for (i = 1; i < 10; i++) sum = sum + array[i];
aver = sum / 10;
return aver;
}
#include
int main() {
float average(float array[], int n);
float score1[5] = {98.5, 97, 91.5, 60, 55};
float score2[10] = {67.5, 89.5, 99, 69.5, 77, 89.5, 76.5, 54, 60, 99.5};
printf("The average of class A is %6.2f\n", average(score1, 5));
printf("The average of class B is %6.2f\n", average(score2, 10));
return 0;
}
float average(float array[], int n) {
int i;
float aver, sum = array[0];
for (i = 1; i < n; i++) sum = sum + array[i];
aver = sum / n;
return aver;
}
#include
int main() {
void sort(int array[], int n);
int a[10], i;
printf("enter array:\n");
for (i = 0; i < 10; i++) scanf("%d", &a[i]);
sort(a, 10); //调用sort函数,a为数组名,大小为10
printf("The sorted array:\n");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
void sort(int array[], int n) {
int i, j, k, t;
//方法一:
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (array[j] < array[k]) k = j;
t = array[k];
array[k] = array[i];
array[i] = t;
}
//方法二:
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++)
if (array[j] < array[i]) {
t = array[j];
array[j] = array[i];
array[i] = t;
}
}
}
#include
int main() {
int max_value(int array[][4]);
int a[3][4] = {{1, 3, 5, 7}, {2, 4, 6, 8}, {15, 17, 34, 12}};
printf("Max value is %d\n", max_value(a));
return 0;
}
int max_value(int array[][4]) {
int i, j, max;
max = array[0][0];
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
if (array[i][j] > max) max = array[i][j];
return max;
}
#include
float Max = 0, Min = 0;
int main() {
float average(float array[], int n);
float ave, score[10];
int i;
printf("Please enter 10 scores:");
for (i = 0; i < 10; i++) scanf("%f", &score[i]);
ave = average(score, 10);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n", Max, Min, ave);
return 0;
}
float average(float array[], int n) {
int i;
float aver, sum = array[0];
Max = Min = array[0];
for (i = 1; i < n; i++) {
if (array[i] > Max)
Max = array[i];
else if (array[i] < Min)
Min = array[i];
sum = sum + array[i];
}
aver = sum / n;
return aver;
}
#include
int a = 3, b = 5;
int main() {
int max(int a, int b);
int a = 8;
printf("max=%d\n", max(a, b));
return 0;
}
int max(int a, int b) {
int c;
c = a > b ? a : b;
return c;
}
输出结果是
max=8
#include
int main() {
int f(int);
int a = 2, i; //自动局部变量
for (i = 0; i < 3; i++) printf("%d\n", f(a));
return 0;
}
int f(int a) {
auto int b = 0; //自动局部变量
static int c = 3; //静态局部变量
b = b + 1;
c = c + 1;
return (a + b + c);
}
第几次调用 | 调用时初值b、c | 调用结束时的值b、c、a+b+c |
---|---|---|
第一次 | 0、3 | 1、4、7 |
第二次 | 0、4 | 1、5、8 |
第三次 | 0、5 | 1、6、9 |
注:c是静态局部变量,函数调用结束后,它并不释放,保留其当前值。 |
输出1到5的阶乘值
#include
int main() {
int fac(int n);
int i;
for (i = 1; i <= 5; i++) //先后5次调用fac函数
printf("%d!=%d\n", i, fac(i)); //每次计算并输出i!的值
return 0;
}
int fac(int n) {
static int f = 1; // f保留了上次调用结束时的值
f = f * n; //在上次的f值的基础上再乘以n
return f; //返回值f是n!的值
}
#include
int main() {
int max();
extern int A, B, C; //把外部变量A,B,C的作用域扩展到从此处开始,
//可省略类型名,如extern A,B,C
printf("Please enter three integer numbers:");
scanf("%d%d%d", &A, &B, &C);
printf("max is %d\n", max());
return 0;
}
int A, B, C; //定义外部变量A,B,C
int max() {
int m;
m = A > B ? A : B;
if (C > m) m = C;
return m;
}
#include
int main() {
int a = 100, b = 10; //定义整型变量a,b,并初始化
int *pointer_1, *pointer_2; //定义指向整形数据的指针变量pointer_1,pointer_2
pointer_1 = &a; //把变量a的地址赋给指针变量pointer_1
pointer_2 = &b; //把变量b的地址赋给指针变量pointer_2
printf("a=%d,b=%d\n", a, b); //输出变量a和b的值
printf("*piointer_1=%d,*pointer_2=%d\n", *pointer_1, *pointer_2); //输出变量a和b的值
return 0;
}
输入a和b两个整数,按先大后小的顺序输出a和b。
//不交换整型变量的值,而是交换两个指针变量的值
#include
int main() {
int *p1, *p2, *p, a, b; // p1,p2的类型是int*类型
printf("please enter two integer numbers:");
scanf("%d%d", &a, &b);
p1 = &a;
p2 = &b;
if (a < b) {
p = p1; p1 = p2; p2 = p; //使p1和p2的值互换,或p1=&b;p2=&a;
}
printf("a=%d,b=%d\n", a, b);
printf("max=%d,min=%d\n", *p1, *p2);
return 0;
}
#include
int main() {
void swap(int *p1, int *p2);
int a, b;
int *pointer_1, *pointer_2;
printf("please enter two integer numbers:");
scanf("%d%d", &a, &b);
pointer_1 = &a;
pointer_2 = &b;
if (a < b) swap(pointer_1, pointer_2);
printf("max=%d,min=%d\n", a, b);
return 0;
}
void swap(int *p1, int *p2) {
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
输入三个数,由大到小输出
#include
int main() {
void exchange(int *p1, int *p2, int *pointer_3);
int a, b, c;
int *p1, *p2, *p3;
printf("please enter three integer numbers:");
scanf("%d%d%d", &a, &b, &c);
p1 = &a;
p2 = &b;
p3 = &c;
exchange(p1, p2, p3);
printf("The order is: %d,%d,%d\n", a, b, c);
return 0;
}
void exchange(int *q1, int *q2, int *q3) {
void swap(int *pt1, int *pt2);
if (*q1 < *q2) swap(q1, q2);
if (*q1 < *q3) swap(q1, q3);
if (*q2 < *q3) swap(q2, q3);
}
void swap(int *pt1, int *pt2) {
int temp;
temp = *pt1;
*pt1 = *pt2;
*pt2 = temp;
}
引用数组中个元素的值有3中方法:
(1)下标法,如a[3];
(2)通过数组名计算数组元素地址,找出元素的值;
(3)用指针变量指向数组元素。
#include
int main() {
int a[10], i;
printf("Please enter 10 integer numbers:");
for (i = 0; i < 10; i++) scanf("%d", &a[i]); //&a[i]等价于(a+i)
for (i = 0; i < 10; i++) printf("%d ", a[i]); //数组元素用数组名和下标表示
printf("\n");
for (i = 0; i < 10; i++) printf("%d ", *(a + i)); //通过数组名和元素序号计算元素地址,再找到该元素
printf("\n");
int *p;
for (p = a; p < (a + 10); p++) printf("%d", *p); //用指针指向当前的数组元素
return 0;
}
将数组a中n个整数按相反顺序存放。
方法一:
#include
int main() {
void inv(int x[], int n);
int i, a[10] = {3, 7, 9, 11, 0, 6, 7, 5, 4, 2};
printf("The original array:\n");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
inv(a, 10);
printf("The array has been inverted:\n");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
void inv(int x[], int n) { //形参x是数组名
int temp, i, j, m = (n - 1) / 2;
for (i = 0; i <= m; i++) {
j = n - 1 - i;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
return;
}
方法二:
#include
int main() {
void inv(int *x, int n);
int i, a[10] = {3, 7, 9, 11, 0, 6, 7, 5, 4, 2};
printf("The original array:\n");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
inv(a, 10);
printf("The array has been inverted:\n");
for (i = 0; i < 10; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
void inv(int *x, int n) { //形参x是指针变量
int *p, temp, *i, *j, m = (n - 1) / 2;
i = x;
j = x + n - 1;
p = x + m;
for (; i <= p; i++, j--) {
temp = *i;
*i = *j;
*j = temp;
}
return;
}
#include
int main() {
void inv(int *x, int n);
int i, arr[10], *p = arr;
printf("The original array:\n");
for (i = 0; i < 10; i++, p++) scanf("%d", p);
printf("\n");
p = arr; //指针变量p重新指向arr[0]
inv(p, 10); //调用inv函数,实参p是指针变量
printf("The array has been inverted:\n");
for (p = arr; p < arr + 10; p++) printf("%d ", *p);
printf("\n");
return 0;
}
void inv(int *x, int n) {
int *p, temp, *i, *j, m = (n - 1) / 2;
i = x;
j = x + n - 1;
p = x + m;
for (; i <= p; i++, j--) {
temp = *i;
*i = *j;
*j = temp;
}
return;
}
#include
int main() {
void sort(int x[], int n);
int i, *p, a[10];
p = a;
printf("please enter 10 integer numbers:");
for (i = 0; i < 10; i++) scanf("%d", p++);
p = a; //指针变量p重新指向a[0]
sort(p, 10);
for (p = a, i = 0; i < 10; i++) {
printf("%d ", *p);
p++;
}
return 0;
}
void sort(int x[], int n) { //定义sort函数,x是形参数组名
int i, j, k, t;
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (x[j] > x[k]) k = j;
if (k != i) {
t = x[i];
x[i] = x[k];
x[k] = t;
}
}
}
指针变量做形参
#include
int main() {
void sort(int *x, int n);
int i, *p, a[10];
p = a;
printf("please enter 10 integer numbers:");
for (i = 0; i < 10; i++) scanf("%d", p++);
p = a; //指针变量p重新指向a[0]
sort(p, 10);
for (p = a, i = 0; i < 10; i++) {
printf("%d ", *p);
p++;
}
return 0;
}
void sort(int *x, int n) { //形参x是指针变量
int i, j, k, t;
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (*(x + j) > *(x + k)) k = j; //*(x+j)就是x[j]
if (k != i) {
t = *(x + i);
*(x + i) = *(x + k);
*(x + k) = t;
}
}
}
#include
int main() {
int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
printf("%d,%d\n", a, *a); //0行起始地址和0行0列元素地址
printf("%d,%d\n", a[0], *(a + 0)); //0行0列元素地址
printf("%d,%d\n", &a[0], &a[0][0]); //0行起始地址和0行0列元素地址
printf("%d,%d\n", a[1], a + 1); //1行0列元素地址和1行起始地址
printf("%d,%d\n", &a[1][0], *(a + 1) + 0); //1行0列元素地址
printf("%d,%d\n", a[2], *(a + 2)); //2行0列元素地址
printf("%d,%d\n", &a[2], a + 2); //2行起始地址
printf("%d,%d\n", a[1][0], *(*(a + 1) + 0)); //1行0列元素的值
printf("%d,%d\n", *a[2], *(*(a + 2) + 0)); //2行0列元素的值
return 0;
}
#include
int main() {
int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
int *p;
for (p = a[0]; p < a[0] + 12; p++) {
if ((p - a[0]) % 4 == 0) printf("\n");
printf("%4d", *p);
}
printf("\n");
return 0;
}
#include
int main() {
int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
int(*p)[4], i, j; //指针变量p指向包含4个整型元素的一维数组
p = a; // p指向二维数组的0行
printf("please enter row and colum:");
scanf("%d%d", &i, &j);
printf("a[%d][%d]=%d", i, j, *(*(p + i) + j));
return 0;
}
#include
int main() {
void average(float *p, int n);
void search(float(*p)[4], int n);
float score[3][4] = {{65, 67, 70, 60}, {80, 87, 90, 81}, {90, 99, 100, 98}};
average(*score, 12);
search(score, 2);
return 0;
}
void average(float *p, int n) {
float *p_end;
float sum = 0, aver;
p_end = p + n - 1;
for (; p <= p_end; p++) sum = sum + (*p);
aver = sum / n;
printf("average=%5.2f\n", aver);
}
void search(float (*p)[4], int n) {
int i;
printf("The score of No.%d are:\n", n);
for (i = 0; i < 4; i++) printf("%5.2f ", *(*(p + n) + i));
printf("\n");
}
#include
int main() {
void search(float (*p)[4], int n);
float score[3][4] = {{65, 57, 70, 60}, {58, 87, 90, 81}, {90, 99, 100, 98}};
search(score, 3);
return 0;
}
void search(float (*p)[4], int n) {
int i, j, flag;
for (j = 0; j < n; j++) {
flag = 0;
for (i = 0; i < 4; i++)
if (*(*(p + j) + i) < 60) flag = 1;
if (flag == 1) {
printf("No.%d fails,his scores are:\n", j + 1);
for (i = 0; i < 4; i++) printf("%5.1f", *(*(p + j) + i));
printf("\n");
}
}
}
#include
int main() {
char string[] = "I love China!"; //定义字符数组string
printf("%s\n", string); //用%s格式声明输出string,可以输出整个字符串
printf("%c\n", string[7]); //用%c格式输出一个字符数组元素
return 0;
}
#include
int main() {
char *string = "I love China!"; //定义字符指针变量string并初始化
printf("%s\n", string); //输出字符串
return 0;
}
#include
int main() {
char a[] = "I am a student.", b[20];
int i;
for (i = 0; *(a + i) != '\0'; i++) *(b + i) = *(a + i);
*(b + i) = '\0';
printf("string a is:%s\n", a);
printf("string b is:");
for (i = 0; b[i] != '\0'; i++) printf("%c", b[i]);
printf("\n"); //或printf("string b is:%s\n",b);
return 0;
}
#include
int main() {
char a[] = "I am a boy.", b[20], *p1, *p2;
p1 = a;
p2 = b;
for (; *p1 != '\0'; p1++, p2++) *p2 = *p1;
*p2 = '\0';
printf("string a is:%s\n", a);
printf("string b is:%s\n", b);
return 0;
}
#include
int main() {
void copy_string(char from[], char to[]);
char a[] = "I am a teacher.";
char b[] = "You are student.";
printf("string a=%s\nstring b=%s\n", a, b);
printf("\ncopy string a to string b:\n");
copy_string(a, b);
printf("string a=%s\nstring b=%s\n", a, b);
return 0;
}
void copy_string(char from[], char to[]) {
int i = 0;
while (from[i] != '\0') {
to[i] = from[i];
i++;
}
to[i] = '\0';
}
输入两个整数,然后让用户选择1或2,选1时调用max函数,输出二者中的大数,选2时调用min函数,输出二者中的小数。
#include
int main() {
int max(int x, int y); //函数声明
int min(int x, int y); //函数声明
int (*p)(int x, int y); //定义指向函数的指针变量
int a, b, c, n;
printf("please enter a and b:");
scanf("%d%d", &a, &b);
printf("please choose 1 or 2:");
scanf("%d", &n); //输入1或2
if (n == 1)
p = max; //如输入1,使p指向max函数
else if (n == 2)
p = min; //如输入2,使p指向min函数
else
printf("error!\n");
c = (*p)(a, b); //调用p指向的函数
printf("a=%d,b=%d\n", a, b);
if (n == 1)
printf("max=%d\n", c);
else if (n == 2)
printf("min=%d", c);
else
printf("error!\n");
return 0;
}
int max(int x, int y) { return (x > y ? x : y); }
int min(int x, int y) { return (x < y ? x : y); }
指向函数的指针变量的一个重要用途是把函数的入口地址作为参数传递到其他函数。
有两个整数a和b,由用户输入1,2或3,如输入1,程序就给出a和b中的大者,输入2,就给出a和b中的小者,输入3,则求a与b之和。
#include
int main() {
int fun(int x, int y, int (*p)(int, int));
int max(int, int);
int min(int, int);
int add(int, int);
int a = 34, b = -21, n;
printf("please enter 1,2 or 3:");
scanf("%d", &n);
if (n == 1) //输入1时调用max函数
fun(a, b, max);
else if (n == 2) //输入2时调用min函数
fun(a, b, min);
else if (n == 3) //输入3时调用add函数
fun(a, b, add);
else
printf("error!");
return 0;
}
int fun(int x, int y, int (*p)(int, int)) {
int result;
result = (*p)(x, y);
printf("%d\n", result);
}
int max(int x, int y) {
printf("max=");
return (x > y ? x : y);
}
int min(int x, int y) {
printf("min=");
return (x < y ? x : y);
}
int add(int x, int y) {
printf("add=");
return (x + y);
}
有a个学生,每个学生有b门课程的成绩,要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数实现。
#include
int main() {
float score[][4] = {{60, 70, 80, 90}, {56, 89, 67, 88}, {34, 78, 90, 66}};
float *search(float (*pointer)[4], int n);
float *p;
int i, k;
printf("enter the number of student:");
scanf("%d", &k);
printf("The score of No.%d are:\n", k);
p = search(score, k);
for (i = 0; i < 4; i++) printf("%5.2f\t", *(p + i));
printf("\n");
return 0;
}
float *search(float (*pointer)[4], int n) { //定义指针型函数,其中有float *型的形参
float *pt;
pt = *(pointer + n);
return (pt);
}
找出其中有不及格的课程的学生及其学生号。
#include
int main() {
float score[][4] = {{60, 70, 80, 90}, {56, 89, 67, 88}, {34, 78, 90, 66}};
float *search(float(*pointer)[4]);
float *p;
int i, j;
for (i = 0; i < 3; i++) {
p = search(score + i);
if (p == *(score + i)) {
printf("No.%d score:", i);
for (j = 0; j < 4; j++) printf("%5.2f ", *(p + j));
printf("\n");
}
}
return 0;
}
float *search(float (*pointer)[4]) {
int i = 0;
float *pt;
pt = NULL;
for (; i < 4; i++)
if (*(*pointer + i) < 60) pt = *pointer;
return pt;
}
将若干字符串按字母顺序(有小到大)输出。
#include
#include
int main() {
void sort(char *name[], int n);
void print(char *name[], int n);
char *name[] = {"Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design"};
int n = 5;
sort(name, n);
print(name, n);
return 0;
}
void sort(char *name[], int n) {
char *temp;
int i, j, k;
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (strcmp(name[k], name[j]) > 0) k = j;
if (k != i) {
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
}
}
void print(char *name[], int n) {
int i;
for (i = 0; i < n; i++) printf("%s\n", name[i]);
}
#include
int main() {
char *name[] = {"Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design"};
char **p;
int i;
for (i = 0; i < 5; i++) {
p = name + i;
printf("%s\n", *p);
}
return 0;
}
#include
int main() {
int a[5] = {1, 3, 5, 7, 9};
int *num[5] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
int **p, i;
p = num;
for (i = 0; i < 5; i++) {
printf("%d ", **p);
p++;
}
return 0;
}
#include
int main(int argc, char *argv[]) {
//argc、argv可根据个人喜好命名成任意名字
//argc(argument count)参数个数
//argv(argument vector)参数向量,它是一个*char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串的首字符。
while (argc > 1) {
++argv;
printf("%s\n", *argv);
--argc;
}
return 0;
}
命令行执行命令:可执行文件路径 China Beijing
输出结果如下:
China
Beijing
#include
int main(int argc, char *argv[]) {
while (--argc > 0)
printf("%s%c", *++argv, (argc > 1) ? ' ' : '\n');
return 0;
}
命令行执行命令:可执行文件echo路径 China Beijing
China Beijing
建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。
#include
#include //程序中用了malloc函数,应包含stdlib.h
int main() {
void check(int *); //函数声明
int *p1, i; // p1是int型指针
p1 = (int *)malloc(5 * sizeof(int)); //开辟动态内存区,将地址转换成int*型,然后放在p1中
printf("enter 5 number:\n");
for (i = 0; i < 5; i++) scanf("%d", p1 + i); //输入5个学生的成绩
check(p1); //调用check函数
return 0;
}
void check(int *p) { //定义check函数,形参是int*指针
int i;
printf("They are fail:");
for (i = 0; i < 5; i++)
if (p[i] < 60) printf("%d ", p[i]); //输出不合格的成绩
}
把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。
#include
int main() {
struct Student { //声明结构体类型struct Student
long int num; //以下4行为结构体的成员
char name[20];
char sex;
char addr[20];
};
struct Student a = {10101, "Li Lin", 'M', "123 Beijing Road"}; //定义结构体变量a并初始化
printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n", a.num, a.name, a.sex, a.addr);
return 0;
}
运行结果:
NO.:10101
name:Li Lin
sex:M
address:123 Beijing Road
#include
int main() {
struct Student {
int num;
char name[20];
float score;
} student1, student2;
scanf("%d%s%f", &student1.num, student1.name, &student1.score);
scanf("%d%s%f", &student2.num, student2.name, &student2.score);
printf("The higher score is:\n");
if (student1.score > student2.score)
printf("%d %s %6.2f\n", student1.num, student1.name, student1.score);
else if (student2.score > student1.score)
printf("%d %s %6.2f\n", student2.num, student2.name, student2.score);
else {
printf("%d %s %6.2f\n", student1.num, student1.name, student1.score);
printf("%d %s %6.2f\n", student2.num, student2.name, student2.score);
}
return 0;
}
有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,然后输出各人得票结果。
#include
#include
struct Person { //声明结构体类型struct Person
char name[20]; //候选人姓名
int count; //候选人得票数
} leader[3] = {"li", 0, "zhang", 0, "sun", 0}; //定义结构体数组并初始化
int main() {
int i, j;
char leader_name[20]; //定义字符数组
for (i = 1; i <= 10; i++) {
scanf("%s", leader_name); //输入所选的候选人姓名
for (j = 0; j < 3; j++)
if (strcmp(leader_name, leader[j].name) == 0) leader[j].count++;
}
printf("\nResult:\n");
for (i = 0; i < 3; i++) printf("%5s:%d\n", leader[i].name, leader[i].count);
return 0;
}
#include
struct Student { //声明结构体类型struct Student
int num;
char name[20];
float score;
};
int main() {
struct Student stu[5] = {{10101, "Zhang", 78},
{10103, "Wang", 98.5},
{10106, "Li", 86},
{10108, "Ling", 73.5},
{10110, "Sun", 100}}; //定义结构体数组并初始化
struct Student temp; //定义结构体变量temp,用作交换时的临时变量
const int n = 5; //定义常变量n
int i, j, k;
printf("The order is:\n");
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (stu[j].score > stu[k].score) k = j; //进行成绩的比较
temp = stu[k];
stu[k] = stu[i];
stu[i] = temp; //stu[k]和stu[i]元素互换(所有成员整体互换)
}
for (i = 0; i < n; i++)
printf("%6d%8s%6.2f\n", stu[i].num, stu[i].name, stu[i].score);
printf("\n");
return 0;
}
通过指向结构体变量的指针变量输出结构体变量中成员的信息
#include
#include
int main() {
struct Student { //声明结构体类型struct Student
long num;
char name[20];
char sex;
float score;
};
struct Student stu_1; //定义struct Student类型的变量stu_1
struct Student *p; //定义指向struct Student类型数据的指针变量p
p = &stu_1; //p指向stu_1
stu_1.num = 10101; //对结构体变量的成员赋值
strcpy(stu_1.name, "Li Lin"); //用字符串复制函数给stu_1.name赋值
stu_1.sex = 'M';
stu_1.score = 89.5;
printf("No.:%ld\nname:%s\nsex:%c\nscore:%f\n", stu_1.num, stu_1.name, stu_1.sex, stu_1.score); //输出结果
printf("\nNo.:%ld\nname:%s\nsex:%c\nscore:%f\n", (*p).num, (*p).name, (*p).sex, (*p).score);
return 0;
}
有3个学生的信息,放在结构体数组中,要求输出全部学生的信息。
#include
struct Student { //声明结构体类型struct Student
long num;
char name[20];
char sex;
int age;
};
struct Student stu[3] = {
{10101, "Li Lin", 'M', 18},
{10102, "Zhang Fang", 'M', 19},
{10103, "Wang Min", 'F', 20}}; //定义结构体数组并初始化
int main() {
struct Student *p; //定义指向struct Student结构体变量的指针变量
printf("No. Name sex age\n");
for (p = stu; p < stu + 3; p++)
printf("%5d %-20s %2c %4d\n", p->num, p->name, p->sex, p->age); //输出结果
return 0;
}
有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。
#include
#define N 3 //学生数为3
struct Student { //建立结构体类型struct Student
int num; //学号
char name[20]; //姓名
float score[3]; //3门课成绩
float aver; //平均成绩
};
int main() {
void input(struct Student stu[]); //函数声明
struct Student max(struct Student stu[]); //函数声明
void print(struct Student stu); //函数声明
struct Student stu[N], *p = stu; //定义结构体数组和指针
input(p); //调用input函数
print(max(p)); //调用print函数,以max函数的返回值作为实参
return 0;
}
void input(struct Student stu[]) { //定义input函数
int i;
printf(
"Please enter the information of each student: student number, name and "
"grade of 3 courses\n");
for (i = 0; i < N; i++) {
scanf("%d %s %f %f %f", &stu[i].num, stu[i].name, &stu[i].score[0],
&stu[i].score[1], &stu[i].score[2]); //输入数据
stu[i].aver = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3.0; //求平均成绩
}
}
struct Student max(struct Student stu[]) { //定义max函数
int i, m = 0; //用m存放成绩最高的学生在数组中的序号
for (i = 0; i < N; i++)
if (stu[i].aver > stu[m].aver) m = i; //找出平均成绩最高的学生在数组中的序号
return stu[m]; //返回包含该生信息的结构体元素
}
void print(struct Student stud) { //定义print函数
printf("\nThe student with the highest score is\n");
printf(
"No.%d\nname:%s\ngrade of 3 courses:%5.1f,%5.1f,%5.1f\nAverage score:%6.2f\n",
stud.num, stud.name, stud.score[0], stud.score[1], stud.score[2], stud.aver);
}
运行结果:
Please enter the information of each student: student number, name and grade of 3 courses
10101 Li 78 89 98
10103 Wang 98.5 87 69
10106 Sun 88 76.5 89
The student with the highest score is
No.10101
name:Li
grade of 3 courses: 78.0, 89.0, 98.0
Average score: 88.33
#include
struct Student { //声明结构体类型struct Student
int num;
float score;
struct Student *next;
};
int main() {
struct Student a, b, c, *head, *p; //定义3个结构体变量a,b,c作为链表的结点
a.num = 10101; a.score = 89.5; //对结点a的num和score成员赋值
b.num = 10103; b.score = 90; //对结点b的num和score成员赋值
c.num = 10107; c.score = 85; //对结点c的num和score成员赋值
head = &a; //将结点a的起始地址赋给头指针head
a.next = &b; //将结点b的起始地址赋给a结点的next成员
b.next = &c; //将结点c的起始地址赋给b结点的next成员
c.next = NULL; // c结点的next成员不存放其他结点地址
p = head; //使p指向a结点
do {
printf("%ld %5.1f\n", p->num, p->score); //输出p指向的结点的数据
p = p->next; //使p指向下一结点
} while (p != NULL); //输出完c结点后p的值为NULL,循环终止
return 0;
}
写一函数建立一个有3名学生数据的单项动态链表。
#include
#include
#define LEN sizeof(struct Student)
struct Student {
long num;
float score;
struct Student *next;
};
int n; // n为全局变量,本文件模块中各函数均可使用它
struct Student *creat(void) { //定义函数。此函数返回一个指向链表头的指针
struct Student *head;
struct Student *p1, *p2;
n = 0;
p1 = p2 = (struct Student *)malloc(LEN); //开辟一个新单元
scanf("%ld,%f", &p1->num, &p1->score); //输入第1个学生的学号和成绩
head = NULL;
while (p1->num != 0) {
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct Student *)malloc(LEN); //开辟动态存储区,把起始地址赋给p1
scanf("%ld,%f", &p1->num, &p1->score); //输入其他学生的学号和成绩
}
p2->next = NULL;
return (head);
}
int main() {
struct Student *pt;
pt = creat(); //函数返回链表第一个结点的地址
printf("\nnum:%ld\nscore:%5.1f\n", pt->num, pt->score); //输出第1个结点的成员值
return 0;
}
#include
#include
#define LEN sizeof(struct Student)
struct Student { //声明结构体类型struct Student
long num;
float score;
struct Student *next;
};
int n;
void print(struct Student *head) { //定义printf函数
struct Student *p; //在函数中定义struct Student类型的变量p
printf("\nNow,These %d records are:\n", n);
p = head; //使p指向下一个结点
if (head != NULL) do { //若不是空表
printf("%ld %5.1f\n", p->num, p->score); //输出一个结点中的学号与成绩
p = p->next; // p指向下一个结点
} while (p != NULL); //当p不是“空地址”
}
以上只是一个函数,可以单独编译,但不能单独运行。
#include
#include
#define LEN sizeof(struct Student)
struct Student { //声明结构体类型struct Student
long num;
float score;
struct Student *next;
};
int n; //全局变量n
struct Student *creat() { //建立链表的函数
struct Student *head;
struct Student *p1, *p2;
n = 0;
p1 = p2 = (struct Student *)malloc(LEN);
scanf("%ld,%f", &p1->num, &p1->score);
head = NULL;
while (p1->num != 0) {
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct Student *)malloc(LEN);
scanf("%ld,%f", &p1->num, &p1->score);
}
p2->next = NULL;
return (head);
}
void print(struct Student *head) { //输出链表的函数
struct Student *p;
printf("\nNow,These %d records are:\n", n);
p = head;
if (head != NULL) do {
printf("%ld %5.1f\n", p->num, p->score);
p = p->next;
} while (p != NULL);
}
int main() {
struct Student *head;
head = creat();
print(head);
return 0;
}
有若干人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一表格来处理。
#include
struct { //声明无名结构体类型
int num; //成员num(编号)
char name[10]; //成员name(姓名)
char sex; //成员sex(性别)
char job; //成员job(职业)
union { //声明无名共用体类型
int clas; //成员class(班级)(由于class是C++的关键字,用Visual C++时不应该用class作成员名)
char position[10]; //成员position(职务)
} category; //成员category是共用体变量
} person[2]; //定义结构体数组person,有两个元素
int main() {
int i;
for (i = 0; i < 2; i++) {
printf("please enter the data of person:\n");
scanf("%d %s %c %c ", &person[i].num, &person[i].name, &person[i].sex,
&person[i].job); //输入前4项
if (person[i].job == 's')
scanf("%d", &person[i].category.clas); //如是学生,输入班级
else if (person[i].job == 't')
scanf("%s", person[i].category.position); //如是教师,输入职务
else
printf("Input error!"); //如job不是's'和't',显示“输入错误”
}
printf("\n");
printf("No. name sex job class/position\n");
for (i = 0; i < 2; i++) {
if (person[i].job == 's') //若是学生
printf("%-6d%-10s%-4c%-4c%-10d\n", person[i].num, person[i].name,
person[i].sex, person[i].job, person[i].category.clas);
else //若是教师
printf("%-6d%-10s%-4c%-4c%-10s\n", person[i].num, person[i].name,
person[i].sex, person[i].job, person[i].category.position);
}
return 0;
}
口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中先后取出3个球,问得到3中不同颜色的球的可能取法,输出每种排列的情况。
#include
int main() {
enum Color { red, yellow, blue, white, black }; //声明枚举类型enum Color
enum Color i, j, k, pri; //定义枚举变量i,j,k,pri
int n, loop;
n = 0;
for (i = red; i <= black; i++) //外循环使i的值从red变到black
for (j = red; j <= black; j++) //中循环使j的值从red变到black
if (i != j) { //如果2球不同色
for (k = red; k <= black; k++) //内循环使k的值从red变到black
if ((k != i) && (k != j)) { //如果3球不同色
n = n + 1; //符合条件的次数加1
printf("%-4d", n); //输出当前是第几个符合条件的组合
for (loop = 1; loop <= 3; loop++) { //先后对3个球分别处理
switch (loop) { //loop的值从1变到3
case 1: pri = i; break; //loop的值为1时,把第1球的颜色赋给pri
case 2: pri = j; break; //loop的值为2时,把第2球的颜色赋给pri
case 3: pri = k; break; //loop的值为3时,把第3球的颜色赋给pri
default: break;
}
switch (pri) { //根据球的颜色输出相应的文字
case red: printf("%-10s", "red"); break; //pri的值等于枚举常量red时输出“red”
case yellow: printf("%-10s", "yellow"); break; //pri的值等于枚举常量yellow时输出“yellow”
case blue: printf("%-10s", "blue"); break; //pri的值等于枚举常量blue时输出“blue”
case white: printf("%-10s", "white"); break; //pri的值等于枚举常量white时输出“white”
case black: printf("%-10s", "black"); break; //pri的值等于枚举常量black时输出“black”
default: break;
}
}
printf("\n");
}
}
printf("\ntotal:%5d\n", n);
return 0;
}
从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止。
#include
#include
int main() {
FILE *fp;
char ch, filename[10]; //定义文件指针fp
printf("Please enter the file name to use:");
scanf("%s", filename); //输入文件名
getchar(); //用来消化最后输入的回车符
if ((fp = fopen(filename, "w")) == NULL) { //打开输出文件并使fp指向此文件
printf("cannot open file\n"); //如果打开出错就输出“打不开”
exit(0); //终止程序
}
printf(
"Please enter a string (ending with # characters) to be stored on disk:");
ch = getchar(); //接收从键盘输入的第一个字符
while (ch != '#') { //当输入‘#’时结束循环
fputc(ch, fp); //向磁盘文件输出一个字符
putchar(ch); //将输出的字符显示在屏幕上
ch = getchar(); //再接收从键盘输入的一个字符
}
fclose(fp); //关闭文件
putchar(10); //向屏幕输出一个换行符
return 0;
}