C语言(Code practice)

代码练习记录,代码可能存在未发现的逻辑错误

Hello World!

#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函数的位置
}

运行时输入a,b,c三个值,输出其中值最大者

#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;
}

求阶乘n!

#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;
}

求5!

#include 
int main() {
  int i = 2, t = 1;
  while (i <= 5) {
    t = t * i;
    i = i + 1;
  }
  printf("%d\n", t);
  return 0;
}

输出成绩在80分以上的学生的学号和成绩

#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;
}

判断2000-2500间的闰年

#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;
}

输出2000-2500间的闰年

#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/99-1/100

求: 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}} 121+3141+5161++971981+9911001的值。

#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;
}

无符号位整形数据用“%u”格式输出

#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(sa)(sb)(sc)
其中, 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;
}

求一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0的根。a,b,c由键盘输入,设 b 2 − 4 a c ≥ 0 b^2-4ac≥0 b24ac0.

已知,当 b 2 − 4 a c ≥ 0 b^2-4ac≥0 b24ac0时,一元二次方程 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=2ab+b24ac ,x2=2abb24ac
p = − b 2 a , q = b 2 − 4 a c 2 a p=\frac{-b}{2a},q=\frac{\sqrt{b^2-4ac}}{2a} p=2ab,q=2ab24ac ,则 x 1 = p + q , x 2 = p − q x_1=p+q,x_2=p-q x1=p+q,x2=pq.

#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=101x<0x=0x>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;
}

从键盘输入一个‘A’或‘a’字符,执行A操作,输入一个‘B’或‘b’字符,执行B操作

#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(1d)
#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;
}

求1+2+3+···+100,即 ∑ n = 1 100 n \displaystyle \sum_{n=1}^{100}n n=1100n

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;
}

输出100~200的不能被3整除的数

#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;
}

输出以下4X5的矩阵。

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;
}

用公式 π 4 ≈ 1 − 1 3 + 1 5 − 1 7 + ⋅ ⋅ ⋅ \frac{π}{4}≈1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+··· 4π131+5171+ π π π的近似值,直到发现某一项的绝对值小于 1 0 − 6 10^{-6} 106为止(该项不累加)。

#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;
}

求Fibonacci(斐波那契)数列的前40个数。

这个数列有如下特点:第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=Fn1+Fn2n=1n=2n≥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;
}

输入大于3的整数,判断是否为素数

#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;
}

输出100~200的全部素数

#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;
}

译密码,26个字母组成环,密文每个字母后移4位。如A→E,Z→D。

#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;
}

求Sn=a+aa+aaa+aaaa+···+aa···a(n个a)的值,其中a是个数字,n表示a的位数。

例如: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;
}

对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出

#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;
}

有一个3X4的矩阵,求出其中值最大的元素的值,以及其所在的行号和列表

[ 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] 19102810375462

#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;
}

找出3个字符串中的最大者

#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;
}

输入4个整数,找出其中最大的数。用函数的嵌套调用来处理

#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 ! = { 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(n1)!(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;
}

Hanoi(汉诺)塔问题

这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有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); }

输入10个数,要求输出其中值最大的元素和该数是第几个数

#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); }

有一个以为数组score,内放10个学生成绩,求平均成绩。

#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;
}

用选择法对数组中10个整数按由小到大排序

#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;
      }
  }
}

有一个3X4的矩阵,求所有元素中的最大值

#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;
}

全局变量的应用:有一个一维数组,内放10个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。

#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

静态(static)局部变量

#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!的值
}

外部变量声明extern

#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;
}

有一个整型数组啊,有10个元素,要求输出数组中的全部元素

引用数组中个元素的值有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;
}

用指针方法对10个整数按由大到小顺序排序

#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;
}

有一个3x4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。

#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;
}

有一个班,3个同学,各学4门课,计算总平均分数以及第n个学生的成绩。

#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");
    }
  }
}

定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第8个字符。

#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;
}

将字符串a复制为字符串b,然后输出字符串b。

#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;
}

指针数组作main函数的形参

#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

echo命令

#include 
int main(int argc, char *argv[]) {
  while (--argc > 0) 
  printf("%s%c", *++argv, (argc > 1) ? ' ' : '\n');
  return 0;
}

命令行执行命令:可执行文件echo路径 China Beijing

China Beijing

void指针类型

建立动态数组,输入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;
}

有n个同学的信息(包括学号、姓名、成绩),要求按照成绩的高低顺序输出各学生的信息。

#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

建立一个如下图所示的简单链表,它由3个学生数据的结点组成,要求输出各结点中的数据。

C语言(Code practice)_第1张图片

#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;
}

你可能感兴趣的:(C,c语言)