36.实现简单的计算器
# include <stdio.h>
int main() {
char operator;
double firstNumber,secondNumber;
printf("输入操作符 (+, -, *,): ");
scanf("%c", &operator);
printf("输入两个数字: ");
scanf("%lf %lf",&firstNumber, &secondNumber);
switch(operator)
{
case '+':
printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber + secondNumber);
break;
case '-':
printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber - secondNumber);
break;
case '*':
printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber * secondNumber);
break;
case '/':
printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber / secondNumber);
break;
// operator doesn't match any case constant (+, -, *, /)
default:
printf("Error! operator is not correct");
}
return 0;
}
结果为:
输入操作符 (+, -, *,): *
输入两个数字: 4 5
4.0 * 5.0 = 20.0
37.计算一个数是否可为两个素数之和
#include <stdio.h>
int checkPrime(int n);
int main()
{
int n, i, flag = 0;
printf("输入正整数: ");
scanf("%d", &n);
for(i = 2; i <= n/2; ++i)
{
// 检测判断
if (checkPrime(i) == 1)
{
if (checkPrime(n-i) == 1)
{
printf("%d = %d + %d\n", n, i, n - i);
flag = 1;
}
}
}
if (flag == 0)
printf("%d 不能分解为两个素数。", n);
return 0;
}
// 判断素数
int checkPrime(int n)
{
int i, isPrime = 1;
for(i = 2; i <= n/2; ++i)
{
if(n % i == 0)
{
isPrime = 0;
break;
}
}
return isPrime;
}
结果为:
输入正整数: 34
34 = 3 + 31
34 = 5 + 29
34 = 11 + 23
34 = 17 + 17
38.二进制与十进制相互转换
二进制转换为十进制:
#include <stdio.h>
#include <math.h>
int convertBinaryToDecimal(long long n);
int main()
{
long long n;
printf("输入一个二进制数: ");
scanf("%lld", &n);
printf("二进制数 %lld 转换为十进制为 %d", n, convertBinaryToDecimal(n));
return 0;
}
int convertBinaryToDecimal(long long n)
{
int decimalNumber = 0, i = 0, remainder;
while (n!=0)
{
remainder = n%10;
n /= 10;
decimalNumber += remainder*pow(2,i);
++i;
}
return decimalNumber;
}
结果为:
输入一个二进制数: 110110111
二进制数 110110111 转换为十进制为 439
十进制转换为二进制:
#include <stdio.h>
#include <math.h>
long long convertDecimalToBinary(int n);
int main()
{
int n;
printf("输入一个十进制数: ");
scanf("%d", &n);
printf("十进制数 %d 转换为二进制位 %lld", n, convertDecimalToBinary(n));
return 0;
}
long long convertDecimalToBinary(int n)
{
long long binaryNumber = 0;
int remainder, i = 1, step = 1;
while (n!=0)
{
remainder = n%2;
printf("Step %d: %d/2, 余数 = %d, 商 = %d\n", step++, n, remainder, n/2);
n /= 2;
binaryNumber += remainder*i;
i *= 10;
}
return binaryNumber;
}
结果为:
输入一个十进制数: 100
Step 1: 100/2, 余数 = 0, 商 = 50
Step 2: 50/2, 余数 = 0, 商 = 25
Step 3: 25/2, 余数 = 1, 商 = 12
Step 4: 12/2, 余数 = 0, 商 = 6
Step 5: 6/2, 余数 = 0, 商 = 3
Step 6: 3/2, 余数 = 1, 商 = 1
Step 7: 1/2, 余数 = 1, 商 = 0
十进制数 100 转换为二进制位 1100100
39.八进制与十进制相互转换
十进制转换为八进制:
#include <stdio.h>
#include <math.h>
int convertDecimalToOctal(int decimalNumber);
int main()
{
int decimalNumber;
printf("输入一个十进制数: ");
scanf("%d", &decimalNumber);
printf("十进制数 %d 转换为八进制为 %d", decimalNumber, convertDecimalToOctal(decimalNumber));
return 0;
}
int convertDecimalToOctal(int decimalNumber)
{
int octalNumber = 0, i = 1;
while (decimalNumber != 0)
{
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
return octalNumber;
}
结果为:
输入一个十进制数: 78
十进制数 78 转换为八进制为 116
八进制转换为十进制:
#include <stdio.h>
#include <math.h>
long long convertOctalToDecimal(int octalNumber);
int main()
{
int octalNumber;
printf("输入一个八进制数: ");
scanf("%d", &octalNumber);
printf("八进制数 %d 转换为十进制为 %lld", octalNumber, convertOctalToDecimal(octalNumber));
return 0;
}
long long convertOctalToDecimal(int octalNumber)
{
int decimalNumber = 0, i = 0;
while(octalNumber != 0)
{
decimalNumber += (octalNumber%10) * pow(8,i);
++i;
octalNumber/=10;
}
i = 1;
return decimalNumber;
}
结果为:
输入一个八进制数: 116
八进制数 116 转换为十进制为 78
40.八进制与二进制相互转换
二进制转换为八进制:
#include <stdio.h>
#include <math.h>
int convertBinarytoOctal(long long binaryNumber);
int main()
{
long long binaryNumber;
printf("输入一个二进制数: ");
scanf("%lld", &binaryNumber);
printf("二进制数 %lld 转换为八进制为 %d", binaryNumber, convertBinarytoOctal(binaryNumber));
return 0;
}
int convertBinarytoOctal(long long binaryNumber)
{
int octalNumber = 0, decimalNumber = 0, i = 0;
while(binaryNumber != 0)
{
decimalNumber += (binaryNumber%10) * pow(2,i);
++i;
binaryNumber/=10;
}
i = 1;
while (decimalNumber != 0)
{
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
return octalNumber;
}
结果为:
输入一个二进制数: 101001
二进制数 101001 转换为八进制为 51
八进制转换为二进制:
#include <stdio.h>
#include <math.h>
long long convertOctalToBinary(int octalNumber);
int main()
{
int octalNumber;
printf("输入一个八进制数: ");
scanf("%d", &octalNumber);
printf("八进制数 %d 转二进制为 %lld", octalNumber, convertOctalToBinary(octalNumber));
return 0;
}
long long convertOctalToBinary(int octalNumber)
{
int decimalNumber = 0, i = 0;
long long binaryNumber = 0;
while(octalNumber != 0)
{
decimalNumber += (octalNumber%10) * pow(8,i);
++i;
octalNumber/=10;
}
i = 1;
while (decimalNumber != 0)
{
binaryNumber += (decimalNumber % 2) * i;
decimalNumber /= 2;
i *= 10;
}
return binaryNumber;
}
结果为:
输入一个八进制数: 51
八进制数 51 转二进制为 101001
41.字符串翻转
#include <stdio.h>
void reverseSentence();
int main()
{
printf("输入一个字符串: ");
reverseSentence();
return 0;
}
void reverseSentence()
{
char c;
scanf("%c", &c);
if( c != '\n')
{
reverseSentence();
printf("%c",c);
}
}
结果为:
输入一个字符串: runoob
boonur
42.计算数组元素平均值
#include <stdio.h>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int sum, loop;
float avg;
sum = avg = 0;
for(loop = 0; loop < 10; loop++) {
sum = sum + array[loop];
}
avg = (float)sum / loop;
printf("平均值为 %.2f", avg);
return 0;
结果为:
平均值为 4.50
用户自定义输入:
#include <stdio.h>
int main()
{
int n, i;
float num[100], sum = 0.0, average;
printf("输入元素个数: ");
scanf("%d", &n);
while (n > 100 || n <= 0)
{
printf("Error! 数字需要在1 到 100 之间。\n");
printf("再次输入: ");
scanf("%d", &n);
}
for(i = 0; i < n; ++i)
{
printf("%d. 输入数字: ", i+1);
scanf("%f", &num[i]);
sum += num[i];
}
average = sum / n;
printf("平均值 = %.2f", average);
return 0;
}
结果为:
输入元素个数: 4
1. 输入数字: 1
2. 输入数字: 2
3. 输入数字: 4
4. 输入数字: 8
平均值 = 3.75
43.输出数组
#include <stdio.h>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int loop;
for(loop = 0; loop < 10; loop++)
printf("%d ", array[loop]);
return 0;
}
结果为:
1 2 3 4 5 6 7 8 9 0
使用 for 循环逆向输出数组:
#include <stdio.h>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int loop;
for(loop = 9; loop >= 0; loop--)
printf("%d ", array[loop]);
return 0;
}
结果为:
0 9 8 7 6 5 4 3 2 1
44.计算数组元素之和
#include <stdio.h>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int sum, loop;
sum = 0;
for(loop = 9; loop >= 0; loop--) {
sum = sum + array[loop];
}
printf("元素和为:%d", sum);
return 0;
}
结果为:
元素和为:45
45.查找数组中最大的元素值
#include <stdio.h>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int loop, largest;
largest = array[0];
for(loop = 1; loop < 10; loop++) {
if( largest < array[loop] )
largest = array[loop];
}
printf("最大元素为 %d", largest);
return 0;
}
结果为:
最大元素为 9
用户自定义输出:
#include <stdio.h>
int main()
{
int i, n;
float arr[100];
printf("输入元素个数(0~100): ");
scanf("%d", &n);
printf("\n");
// 接收用户输入
for(i = 0; i < n; ++i)
{
printf("输入数字 %d: ", i+1);
scanf("%f", &arr[i]);
}
// 循环,并将最大元素存储到 arr[0]
for(i = 1; i < n; ++i)
{
// 如果要查找最小值可以将 < 换成 >
if(arr[0] < arr[i])
arr[0] = arr[i];
}
printf("最大元素为 = %.2f", arr[0]);
return 0;
}
结果为:
输入元素个数(0~100): 4
输入数字 1: 12
输入数字 2: 23
输入数字 3: 1
输入数字 4: 3
最大元素为 = 23.00
46.查找数组中最小的元素
#include <stdio.h>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int loop, smallest;
smallest = array[0];
for(loop = 1; loop < 10; loop++) {
if( smallest > array[loop] )
smallest = array[loop];
}
printf("最小元素为 %d", smallest);
return 0;
}
结果为:
最小元素为 0
47.数组拆分与合并
将一个数组拆分为两个数组,一个为奇数数组,一个为偶数数组:
#include <stdio.h>
int main() {
int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int even[10], odd[10];
int loop, e, d;
e = d = 0;
for(loop = 0; loop < 10; loop++) {
if(array[loop]%2 == 0) {
even[e] = array[loop];
e++;
}else {
odd[d] = array[loop];
d++;
}
}
printf(" 原始数组 -> ");
for(loop = 0; loop < 10; loop++)
printf(" %d", array[loop]);
printf("\n 偶数 -> ");
for(loop = 0; loop < e; loop++)
printf(" %d", even[loop]);
printf("\n 奇数 -> ");
for(loop = 0; loop < d; loop++)
printf(" %d", odd[loop]);
return 0;
}
结果为:
原始数组 -> 0 1 2 3 4 5 6 7 8 9
偶数 -> 0 2 4 6 8
奇数 -> 1 3 5 7 9
将奇数数组与偶数数组合并为一个数组:
#include <stdio.h>
int main() {
int array[10];
int even[5] = {0, 2, 4, 6, 8};
int odd[5] = {1, 3, 5, 7, 9};
int loop, index, e_len, o_len;
e_len = o_len = 5;
index = 0;
for(loop = 0; loop < e_len; loop++) {
array[index] = even[loop];
index++;
}
for(loop = 0; loop < o_len; loop++) {
array[index] = odd[loop];
index++;
}
printf("\n偶数 -> ");
for(loop = 0; loop < e_len; loop++)
printf(" %d", even[loop]);
printf("\n奇数 -> ");
for(loop = 0; loop < o_len; loop++)
printf(" %d", odd[loop]);
printf("\n合并后 -> ");
for(loop = 0; loop < 10; loop++)
printf(" %d", array[loop]);
return 0;
}
结果为:
偶数 -> 0 2 4 6 8
奇数 -> 1 3 5 7 9
合并后 -> 0 2 4 6 8 1 3 5 7 9
48.数组拷贝
将一个数组复制给另外一个数组:
#include <stdio.h>
int main() {
int original[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int copied[10];
int loop;
for(loop = 0; loop < 10; loop++) {
copied[loop] = original[loop];
}
printf("元素数组 -> 拷贝后的数组 \n");
for(loop = 0; loop < 10; loop++) {
printf(" %2d %2d\n", original[loop], copied[loop]);
}
return 0;
}
结果为:
元素数组 -> 拷贝后的数组
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
0 0
49.计算标准偏差
#include <stdio.h>
#include <math.h>
float calculateSD(float data[]);
int main()
{
int i;
float data[10];
printf("输入10个元素: ");
for(i=0; i < 10; ++i)
scanf("%f", &data[i]);
printf("\n标准偏差 = %.6f", calculateSD(data));
return 0;
}
float calculateSD(float data[])
{
float sum = 0.0, mean, standardDeviation = 0.0;
int i;
for(i=0; i<10; ++i)
{
sum += data[i];
}
mean = sum/10;
for(i=0; i<10; ++i)
standardDeviation += pow(data[i] - mean, 2);
return sqrt(standardDeviation/10);
}
结果为:
输入10个元素: 1
2
3
4
5
6
7
8
9
10
标准偏差 = 2.872281
50.两个矩阵相加
#include <stdio.h>
int main(){
int r, c, a[100][100], b[100][100], sum[100][100], i, j;
printf("输入行数 ( 1 ~ 100): ");
scanf("%d", &r);
printf("输入列数 ( 1 ~ 100): ");
scanf("%d", &c);
printf("\n输入第一维数组的元素:\n");
for(i=0; i<r; ++i)
for(j=0; j<c; ++j)
{
printf("输入元素 a%d%d: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
printf("输入第二维数组的元素:\n");
for(i=0; i<r; ++i)
for(j=0; j<c; ++j)
{
printf("输入元素 a%d%d: ",i+1, j+1);
scanf("%d", &b[i][j]);
}
// 相加
for(i=0;i<r;++i)
for(j=0;j<c;++j)
{
sum[i][j]=a[i][j]+b[i][j];
}
// 显示结果
printf("\n二维数组相加结果: \n\n");
for(i=0;i<r;++i)
for(j=0;j<c;++j)
{
printf("%d ",sum[i][j]);
if(j==c-1)
{
printf("\n\n");
}
}
return 0;
}
结果为:
输入行数 ( 1 ~ 100): 2
输入列数 ( 1 ~ 100): 3
输入第一维数组的元素:
输入元素 a11: 2
输入元素 a12: 3
输入元素 a13: 4
输入元素 a21: 5
输入元素 a22: 2
输入元素 a23: 3
输入第二维数组的元素:
输入元素 a11: -4
输入元素 a12: 5
输入元素 a13: 3
输入元素 a21: 5
输入元素 a22: 6
输入元素 a23: 3
二维数组相加结果:
-2 8 7
10 8 6
51.矩阵转换
#include <stdio.h>
int main()
{
int a[10][10], transpose[10][10], r, c, i, j;
printf("输入矩阵的行与列: ");
scanf("%d %d", &r, &c);
// 存储矩阵的元素
printf("\n输入矩阵元素:\n");
for(i=0; i<r; ++i)
for(j=0; j<c; ++j)
{
printf("输入元素 a%d%d: ",i+1, j+1);
scanf("%d", &a[i][j]);
}
// 显示矩阵 a[][] */
printf("\n输入矩阵: \n");
for(i=0; i<r; ++i)
for(j=0; j<c; ++j)
{
printf("%d ", a[i][j]);
if (j == c-1)
printf("\n\n");
}
// 转换
for(i=0; i<r; ++i)
for(j=0; j<c; ++j)
{
transpose[j][i] = a[i][j];
}
// 显示转换后的矩阵 a
printf("\n转换后矩阵:\n");
for(i=0; i<c; ++i)
for(j=0; j<r; ++j)
{
printf("%d ",transpose[i][j]);
if(j==r-1)
printf("\n\n");
}
return 0;
}
结果为:
输入矩阵的行与列: 2 3
输入矩阵元素:
输入元素 a11: 2
输入元素 a12: 3
输入元素 a13: 4
输入元素 a21: 5
输入元素 a22: 6
输入元素 a23: 4
输入矩阵:
2 3 4
5 6 4
转换后矩阵:
2 5
3 6
4 4
52.使用指针访问数组元素
#include <stdio.h>
int main()
{
int data[5], i;
printf("输入元素: ");
for(i = 0; i < 5; ++i)
scanf("%d", data + i);
printf("你输入的是: \n");
for(i = 0; i < 5; ++i)
printf("%d\n", *(data + i));
return 0;
}
结果为:
输入元素: 1
2
3
5
4
你输入的是:
1
2
3
5
4
53.使用引用循环替换数值
a、b、c 三个变量,通过引用按顺序循环替换他们的值。
#include<stdio.h>
void cyclicSwap(int *a,int *b,int *c);
int main()
{
int a, b, c;
printf("输入 a, b 和 c 的值: ");
scanf("%d %d %d",&a,&b,&c);
printf("交换前:\n");
printf("a = %d \nb = %d \nc = %d\n",a,b,c);
cyclicSwap(&a, &b, &c);
printf("交换后:\n");
printf("a = %d \nb = %d \nc = %d",a, b, c);
return 0;
}
void cyclicSwap(int *a,int *b,int *c)
{
int temp;
// 交换
temp = *b;
*b = *a;
*a = *c;
*c = temp;
}
结果为:
输入 a, b 和 c 的值: 1 2 3
交换前:
a = 1
b = 2
c = 3
交换后:
a = 3
b = 1
c = 2
54.判断最大值
通过用户输入指定的数值,来判断最大值。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, num;
float *data;
printf("输入元素个数(1 ~ 100): ");
scanf("%d", &num);
// 为 'num' 元素分配内存
data = (float*) calloc(num, sizeof(float));
if(data == NULL)
{
printf("Error!!! 内存没有分配。");
exit(0);
}
printf("\n");
// 用户输入
for(i = 0; i < num; ++i)
{
printf("输入数字 %d: ", i + 1);
scanf("%f", data + i);
}
// 循环找出最大值
for(i = 1; i < num; ++i)
{
// 如果需要找出最小值可以将 < 改为 >
if(*data < *(data + i))
*data = *(data + i);
}
printf("最大元素 = %.2f", *data);
return 0;
}
结果为:
输入元素个数(1 ~ 100): 5
输入数字 1: 12
输入数字 2: 32
输入数字 3: 6
输入数字 4: 56
输入数字 5: 21
最大元素 = 56.00
55.删除字符串中的特殊字符
#include<stdio.h>
int main()
{
char line[150];
int i, j;
printf("输入一个字符串: ");
fgets(line, (sizeof line / sizeof line[0]), stdin);
for(i = 0; line[i] != '\0'; ++i)
{
while (!( (line[i] >= 'a' && line[i] <= 'z') || (line[i] >= 'A' && line[i] <= 'Z') || line[i] == '\0') )
{
for(j = i; line[j] != '\0'; ++j)
{
line[j] = line[j+1];
}
line[j] = '\0';
}
}
printf("输出: ");
puts(line);
return 0;
}
结果为:
输入一个字符串: run4#$1oob
输出: runoob
56.连接字符串
使用 strcat() 连接两个字符串。
#include <stdio.h>
int main()
{
char s1[100], s2[100], i, j;
printf("输入第一个字符串: ");
scanf("%s", s1);
printf("输入第二个字符串: ");
scanf("%s", s2);
// 计算字符串 s1 长度
for(i = 0; s1[i] != '\0'; ++i);
for(j = 0; s2[j] != '\0'; ++j, ++i)
{
s1[i] = s2[j];
}
s1[i] = '\0';
printf("连接后: %s", s1);
return 0;
}
结果为:
输入第一个字符串: google
输入第二个字符串: runoob
连接后: googlerunoob
57.计算字符串长度
使用 strlen():
#include <stdio.h>
#include <string.h>
int main()
{
char s[1000];
int len;
printf("输入字符串: ");
scanf("%s", s);
len = strlen(s);
printf("字符串长度: %d", len);
return 0;
}
结果为:
输入字符串: runoob
字符串长度: 6
不使用 strlen():
#include <stdio.h>
int main()
{
char s[1000], i;
printf("输入字符串: ");
scanf("%s", s);
for(i = 0; s[i] != '\0'; ++i);
printf("字符串长度: %d", i);
return 0;
}
结果为:
输入字符串: runoob
字符串长度: 6
58.查找字符在字符串中出现的次数
#include <stdio.h>
int main()
{
char str[1000], ch;
int i, frequency = 0;
printf("输入字符串: ");
fgets(str, (sizeof str / sizeof str[0]), stdin);
printf("输入要查找的字符: ");
scanf("%c",&ch);
for(i = 0; str[i] != '\0'; ++i)
{
if(ch == str[i])
++frequency;
}
printf("字符 %c 在字符串中出现的次数为 %d", ch, frequency);
return 0;
}
结果为:
输入字符串: runoob
输入要查找的字符: o
字符 o 在字符串中出现的次数为 2
59.字符串中各种字符计算
计算字符串中的元音、辅音、数字、空白符。
#include <stdio.h>
int main()
{
char line[150];
int i, vowels, consonants, digits, spaces;
vowels = consonants = digits = spaces = 0;
printf("输入一个字符串: ");
scanf("%[^\n]", line);
for(i=0; line[i]!='\0'; ++i)
{
if(line[i]=='a' || line[i]=='e' || line[i]=='i' ||
line[i]=='o' || line[i]=='u' || line[i]=='A' ||
line[i]=='E' || line[i]=='I' || line[i]=='O' ||
line[i]=='U')
{
++vowels;
}
else if((line[i]>='a'&& line[i]<='z') || (line[i]>='A'&& line[i]<='Z'))
{
++consonants;
}
else if(line[i]>='0' && line[i]<='9')
{
++digits;
}
else if (line[i]==' ')
{
++spaces;
}
}
printf("元音: %d",vowels);
printf("\n辅音: %d",consonants);
printf("\n数字: %d",digits);
printf("\n空白符: %d", spaces);
return 0;
}
结果为:
输入一个字符串: runoob123 erkcomsww dfrunoob
元音: 8
辅音: 15
数字: 3
空白符: 2
60.字符串复制
使用 strcpy():
#include <stdio.h>
#include <string.h>
int main()
{
char src[40];
char dest[100];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strcpy(dest, src);
printf("最终的目标字符串: %s\n", dest);
return(0);
}
结果为:
最终的目标字符串: This is runoob.com
不使用 strcpy():
#include <stdio.h>
int main()
{
char s1[100], s2[100], i;
printf("字符串 s1: ");
scanf("%s",s1);
for(i = 0; s1[i] != '\0'; ++i)
{
s2[i] = s1[i];
}
s2[i] = '\0';
printf("字符串 s2: %s", s2);
return 0;
}
结果为:
字符串 s1: runoob
字符串 s2: runoob
61.字符串排序
字典顺序排序。
#include<stdio.h>
#include <string.h>
int main()
{
int i, j;
char str[10][50], temp[50];
printf("输入10个单词:\n");
for(i=0; i<10; ++i) {
scanf("%s[^\n]",str[i]);
}
for(i=0; i<9; ++i) {
for(j=i+1; j<10 ; ++j)
{
if(strcmp(str[i], str[j])>0)
{
strcpy(temp, str[i]);
strcpy(str[i], str[j]);
strcpy(str[j], temp);
}
}
}
printf("\n排序后: \n");
for(i=0; i<10; ++i)
{
puts(str[i]);
}
return 0;
}
结果为:
输入10个单词:
C
C++
Java
PHP
Python
Perl
Ruby
R
JavaScript
PHP
排序后:
C
C++
Java
JavaScript
PHP
PHP
Perl
Python
R
Ruby
62.使用结构体(struct)
使用结构体(struct)存储学生信息。
#include <stdio.h>
struct student
{
char name[50];
int roll;
float marks;
} s;
int main()
{
printf("输入信息:\n");
printf("名字: ");
scanf("%s", s.name);
printf("编号: ");
scanf("%d", &s.roll);
printf("成绩: ");
scanf("%f", &s.marks);
printf("显示信息:\n");
printf("名字: ");
puts(s.name);
printf("编号: %d\n",s.roll);
printf("成绩: %.1f\n", s.marks);
return 0;
}
结果为:
输入信息:
名字: runoob
编号: 123
成绩: 89
显示信息:
名字: runoob
编号: 123
成绩: 89.0
63.复数相加
使用结构体(struct)将两个复数相加。
我们把形如 a+bi(a,b均为实数)的数称为复数,其中 a 称为实部,b 称为虚部,i 称为虚数单位。
#include <stdio.h>
typedef struct complex
{
float real;
float imag;
} complex;
complex add(complex n1,complex n2);
int main()
{
complex n1, n2, temp;
printf("第一个复数 \n");
printf("输入实部和虚部:\n");
scanf("%f %f", &n1.real, &n1.imag);
printf("\n第二个复数 \n");
printf("输入实部和虚部:\n");
scanf("%f %f", &n2.real, &n2.imag);
temp = add(n1, n2);
printf("Sum = %.1f + %.1fi", temp.real, temp.imag);
return 0;
}
complex add(complex n1, complex n2)
{
complex temp;
temp.real = n1.real + n2.real;
temp.imag = n1.imag + n2.imag;
return(temp);
}
结果为:
第一个复数
输入实部和虚部:
2.3 4.5
第二个复数
输入实部和虚部:
3.4 5
Sum = 5.7 + 9.5i
64.计算两个时间段的差值
#include <stdio.h>
struct TIME
{
int seconds;
int minutes;
int hours;
};
void differenceBetweenTimePeriod(struct TIME t1, struct TIME t2, struct TIME *diff);
int main()
{
struct TIME startTime, stopTime, diff;
printf("输入开始时间: \n");
printf("输入小时、分钟、秒:");
scanf("%d %d %d", &startTime.hours, &startTime.minutes, &startTime.seconds);
printf("输入停止时间: \n");
printf("输入小时、分钟、秒: ");
scanf("%d %d %d", &stopTime.hours, &stopTime.minutes, &stopTime.seconds);
// 计算差值
differenceBetweenTimePeriod(startTime, stopTime, &diff);
printf("\n差值: %d:%d:%d - ", startTime.hours, startTime.minutes, startTime.seconds);
printf("%d:%d:%d ", stopTime.hours, stopTime.minutes, stopTime.seconds);
printf("= %d:%d:%d\n", diff.hours, diff.minutes, diff.seconds);
return 0;
}
void differenceBetweenTimePeriod(struct TIME start, struct TIME stop, struct TIME *diff)
{
if(stop.seconds > start.seconds){
--start.minutes;
start.seconds += 60;
}
diff->seconds = start.seconds - stop.seconds;
if(stop.minutes > start.minutes){
--start.hours;
start.minutes += 60;
}
diff->minutes = start.minutes - stop.minutes;
diff->hours = start.hours - stop.hours;
}
结果为:
输入开始时间:
输入小时、分钟、秒:12 34 55
输入停止时间:
输入小时、分钟、秒: 8 12 5
差值: 12:34:55 - 8:12:5 = 4:22:50
65.将字符串写入文件
#include <stdio.h>
#include <stdlib.h> /* exit() 函数 */
int main()
{
char sentence[1000];
FILE *fptr;
fptr = fopen("runoob.txt", "w");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
printf("输入字符串:\n");
fgets(sentence, (sizeof sentence / sizeof sentence[0]), stdin);
fprintf(fptr,"%s", sentence);
fclose(fptr);
return 0;
}
结果为:
输入字符串:
runoob.com
66.从文件中读取一行
文件 runoob.txt 内容:
$ cat runoob.txt
runoob.com
google.com
#include <stdio.h>
#include <stdlib.h> // exit() 函数
int main()
{
char c[1000];
FILE *fptr;
if ((fptr = fopen("runoob.txt", "r")) == NULL)
{
printf("Error! opening file");
// 文件指针返回 NULL 则退出
exit(1);
}
// 读取文本,直到碰到新的一行开始
fscanf(fptr,"%[^\n]", c);
printf("读取内容:\n%s", c);
fclose(fptr);
return 0;
}
结果为:
读取内容:
runoob.com
67.输出当前文件执行代码
输出当前文件执行代码,FILE 为当前执行的文件常量。
#include <stdio.h>
int main() {
FILE *fp;
char c;
fp = fopen(__FILE__,"r");
do {
c = getc(fp);
putchar(c);
}
while(c != EOF);
fclose(fp);
return 0;
}
结果为:
#include <stdio.h>
int main() {
FILE *fp;
char c;
fp = fopen(__FILE__,"r");
do {
c = getc(fp);
putchar(c);
}
while(c != EOF);
fclose(fp);
return 0;
}
68.约瑟夫生者死者小游戏
30 个人在一条船上,超载,需要 15 人下船。
于是人们排成一队,排队的位置即为他们的编号。
报数,从 1 开始,数到 9 的人下船。
如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
#include<stdio.h>
int c = 0;
int i = 1;
int j = 0;
int a[30] = { 0 };
int b[30] = { 0 };
int main()
{
while (i<=31)
{
if (i == 31)
{
i = 1;
}
else if (c == 15)
{
break;
}
else
{
if (b[i] != 0)
{
i++;
continue;
}
else
{
j++;
if (j != 9)
{
i++;
continue;
}
else
{
b[i] = 1;
a[i] = j;
j = 0;
printf("第%d号下船了\n", i);
i++;
c++;
}
}
}
}
}
结果为:
第9号下船了
第18号下船了
第27号下船了
第6号下船了
第16号下船了
第26号下船了
第7号下船了
第19号下船了
第30号下船了
第12号下船了
第24号下船了
第8号下船了
第22号下船了
第5号下船了
第23号下船了
69.五人分鱼
A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。
日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。
B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。
C、D、E依次醒来,也按同样的方法拿鱼。
问他们台伙至少捕了多少条鱼?以及每个人醒来时见到了多少鱼?
#include <stdio.h>
int main(){
int n,x,j,k,l,m;
for(n=5;;n++){
j=4*(n-1)/5;
k=4*(j-1)/5;
l=4*(k-1)/5;
m=4*(l-1)/5;
if(n%5==1&&j%5==1&&k%5==1&&l%5==1&&m%5==1){
printf("至少合伙捕鱼:%d条\n",n);
printf("分别见到鱼的条数:%d %d %d %d\n",j,k,l,m);
break;
}
}
return 0;
}
结果为:
至少合伙捕鱼:3121条
分别见到鱼的条数:2496 1996 1596 1276